どうやら2016年にもAnsibleを勉強していたようだが 1 、 すっかり忘れてしまったので改めて Ansible実践ガイド 第4版[基礎編] を読んだ。 気になったところをメモしていく。

Playbookの階層

1つのPlaybookはいくつかのPlayから構成される。 PlayはTargets、Vars、Tasks、Handlersの4つのセクションから構成される。 TargetsとTasksは基礎的なセクションで、 それぞれ対象のホストと実行するタスクの一覧を指定するために使われる。 VarsとHandlersは補助的なセクションで、それぞれ変数と実行制御 (例えばsystemdサービスのリスタート)を指定するために使われる。

  • Playbook
    • Play:
      • Targets
      • Vars
      • Tasks
      • Handlers
    • Play:
      • Targets
      • Vars
      • Tasks
      • Handlers

テスト

単純なテストはansible.builtin.assertモジュールでカバーできる。 複雑なテストのためには Ansible Molecule 2 を使う。 テスト環境構築、文法チェック、冪等性のチェックなどの仕組みを持っている。 あるいは Ansible Spec 3 を使うと、RubyのRSpecを利用した Serverspecによってテストできる。

Ansible Galaxy

ansible-galaxy install geerlingguy.mysql のようにしてロールをインストールできる。 ~/.ansible/roles あるいは /usr、/etc 配下に配置される。 --roles-path で指定することもできる。

Collectionは ~/.ansible/collections に配置される。 requirements.txt でその一覧を管理することができる。

チューニング

ansible.cfgまたはANSIBLE_CACHE_PLUGINでファクトキャッシュを有効化しておくと良い。 forksを増やしておくと、 ローカルノードのリソースやネットワークの負荷とトレードオフになるが、 並列数を増やせる。

Ansibleは並列実行するとき全てのホストで足並みを揃えてタスクを1つずつ実行している。 これはストラテジプラグインで制御できる。 例えば ansible.builtin.free とするとホストごとに独立してタスクを進められる。 もちろんホスト間の依存には注意する。

SSHの多重接続(ControlMaster、ControlPath、ControlPersist)を有効化しておくと、 タスクごとにSSHを確立することによるオーバーヘッドを削減できる。 ちなみにOpenSSH6.5以降ならデフォルトで多重接続が有効化されている。

デバッグ

ansible-playbookコマンドの--checkで文法の静的チェックを実行できる。 また--diffオプションでfileおよびtemplateで展開される結果の差分を確認できる。

--verboseオプションに加えてANSIBLE_DEBUG=1とすると、 より詳細な開発者向けのメッセージを出力できる。

ansible-console -i inventory.iniコマンドを使うとモジュールを対話的に実行したり、 ファクトの内容を確認したりできる。

ANSIBLE_KEEP_REMOTE_FILES=1としておくとプレイブック実行後にターゲットノードの $HOME/.ansible/tmp配下に実行スクリプトを残してくれる。

タスクにdebugger: on_failedと設定しておくと、 そのタスクが失敗した時にデバッガを起動できる。

暗号化

ansible-vault createコマンドでYAMLファイル全体をパスワードで暗号化できる。 あるいはansible-vault encrypt_stringコマンドで特定の値や文字列だけを暗号化できる。 VaultIDを使うともっと柔軟な制御ができる。

その他

Inventory は以下のようにグルーピングすると使いやすい。

[jp_web]
sv01

[jp_db]
sv02

[us_web]
sv03

[us_db]
sv04

[db:children]
jp_db
us_db

[jp:children]
jp_web
jp_db

General tips - Ansible Documentation にベストプラクティスがまとまっているので読んでおくと良い。