どうやら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
- Play:
テスト
単純なテストは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 にベストプラクティスがまとまっているので読んでおくと良い。