やりたいこと
Ansibleを実行する時に、 対象ホストがきちんと設定されているか不安なことがあります。 万が一設定を間違えて、全然違うサーバの設定を変えてしまったとか泣けません。
本気でやるなら、Ansible Towerの出番かと思いますが、 簡単に導入できて、それなりに効果がある方法を書いておきます。
設定方法
以下の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.fact
のrole
にjenkins
が入っていない場合は、そこで実行がストップします。
複数設定する場合
先の例では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ホストで多くの役割を持たせない方がいいと思いますが。 ↩︎