逆引きマニュアル: Ansible: 対象ホストを間違えないようにする方法

投稿日:

やりたいこと

Ansibleを実行する時に、 対象ホストがきちんと設定されているか不安なことがあります。 万が一設定を間違えて、全然違うサーバの設定を変えてしまったとか泣けません。

本気でやるなら、Ansible Towerの出番かと思いますが、 簡単に導入できて、それなりに効果がある方法を書いておきます。

設定方法

以下の2つの作業を行います。

  1. ローカルファクトの設定をする。
  2. Playbookでローカルファクトの確認をする。

1. ローカルファクトの設定

まず、ローカルファクトの設定は以下のようにします。

mkdir -p /etc/ansible/facts.d
vi /etc/ansible/facts.d/server.fact

以下のようなYAMLファイルを作成します。 この場合は、対象ホストがJenkinsを導入することを表しています。 Vagrantなど、仮想マシン作成時に設定するのがおすすめです。

{
  "role": "jenkins"
}

2. ローカルファクトの確認

Playbookの先頭で以下のチェックを入れます。

- name: ローカルファクトの確認
  hosts: servers
  tasks:
    - name: assert role
      assert:
        that: ansible_local.server.role == "jenkins"

これで、もしserver.factrolejenkinsが入っていない場合は、そこで実行がストップします。

複数設定する場合

先の例ではroleが1つでしたが、複数設定することも可能です。

1. ローカルファクトの設定

まず、/etc/ansible/facts.d/server.fact に以下のように記載します1

{
  "roles": ["jenkins", "sonarqube"]
}

2. ローカルファクトの確認

このときに、Playbookの先頭のassertには以下のように書きます。

# 'jenkins'だけ入っていたらいい場合
assert:
  that: '"jenkins" in ansible_local.server.roles'

# 'jenkins'または'sonarqube'が入っていたら実行する場合
assert:
  that: '"jenkins" in ansible_local.server.roles or "sonarqube" in ansible_local.server.roles'

カスタマイズ

  • ディレクトリ /etc/ansible/facts.d は設定fact_pathで変更できます(あまり変える意味はないかも)
  • ファイル名 server.fact はあくまで例で、拡張子が.factである任意のファイル名に変更可能です。ファイル名を変えると、チェック時の ansible_local. の次の server が変わります。
  • ファイルフォーマットはJSONの他に、INI形式、JSONを返す実行ファイルが指定可能です。
  • ファイルの内容は任意です。チェック以外の用途にも使えます。

  1. 1ホストで多くの役割を持たせない方がいいと思いますが。 ↩︎

マニュアル