はじめに
以前から気になっていたSystems Manager
からのAnsible Playbook
実行ですが、今回実際に自分で試してみた結論として、注意しないといけないことを書こうと思います。
今回の記事を読むにあたり、以下の記事の内容が前提となるため、一読して頂けると幸いです。
今回の記事は2022年9月現在の仕様となります。
今後のアップデートで変わる可能性があることご了承ください。
Systems ManagerでAnsibleを実行する場合の構成
仕組みとしては「Amazon S3からのスクリプトの実行をやってみた。」で紹介したRun Command
機能でAnsible
を実行する仕組みとなるので、以下の通り構成も同様となります。
Run Command
機能でAnsible
を実行する場合、インベントリファイルは使用せず、Systems Manager
で実行ノードを指定する必要があります。
内部的にはlocalhost
で実行するため、対象のEC2インスタンスにAnsible
をインストールする必要があることから、Ansible
の特徴となる、対象ノードにエージェントレスで実行できるというメリットは消えてしまいますが、1ファイル構成のPlaybook
だけではなく、ベストプラクティスのディレクトリ構成のPlaybook
をSystems Manager
で実行できること、出力ログ等の制御をSystems Manager
で行えること、CodePipeline
等のサービスと連携しやすいということは有用かと思います。
尚、Ansible
が対象ノードにインストールされていない場合は、自動でAnsible
をインストールしてから実行されるため、先に手動でAnsible
をインストールしたり、インストール処理を予め含めておく必要はありません。
が、今回色々と調べてみた結果として、Systems Manager
でベストプラクティス構成のPlaybook
を実行&継続的に運用する場合、以下の点について理解した上で使用する必要があります。
Systems Managerでベストプラクティス構成のPlaybook運用する場合に注意すること
私の所感として今回試した結果以下の点に注意する必要があります。
- 対象ノード全てにAnsibleインストールが行われる
- RunCommand実行時、ベストプラクティス構成のディレクトリを毎回ダウンロードする
- 実行対象ホスト指定はSystems Managerで行うため、Ansibleのインベントリファイルによる制御ができない
先程も説明しましたがRun Command
機能でPlaybook
を実行する場合、対象ノードでPlaybook
を実行する必要があるので、エージェントレスで実行できるメリットは消えてしまいます。
実行Playbook
についても、対象ノードで毎回実行スクリプトをダウンロードする動作となり、かつ、ダウンロードディレクトリは毎回異なる仕様となることから、差分だけダウンロードしたりすることができません。(多分回避策なし)
実行対象ホスト指定についても、インベントリファイルを使ったホスト指定ではなく、Systems Manager
で指定する仕様となり、各ノードでAnsible
実行する際にはlocalhost
で実行されるため、元々各ノードごとにhost_vars
等で変数を切り替えていた場合は移行が難しいかと思います。
また、SSM Agent
のデフォルト設定では、ダウンロード先となるorchestration
ディレクトリは自動で削除されないため、実行した回数分、ファイル・ディレクトリがベストプラクティス構成のまま残り続けることになります。(こちらについては設定で回避可能)
[1回目のPlaybook実行用ディレクトリ]
│ └―[ベストプラクティス構成のファイル・ディレクトリ群]
[2回目のPlaybook実行用ディレクトリ]
│ └―[ベストプラクティス構成のファイル・ディレクトリ群]
・・・
[n回目のPlaybook実行用ディレクトリ]
└―[ベストプラクティス構成のファイル・ディレクトリ群]
そのため、Ansible
で使用するファイル・ディレクトリサイズが大きければ大きいほど、毎回のダウンロードに時間がかかり、実行するごとに対象ノードの容量を圧迫することからPlaybook
全体のサイズが大きい場合はRun Command
によるAnsible
実行はおすすめできません。
Run Command
実行時の動作やorchestration
ディレクトリのクリーンアップ方法は以下で紹介しているので、詳細はそちらでご確認ください。
インベントリファイルによる制御ができないことに対するアプローチ
Systems Manager
でPlaybook
を実行した場合、host_vars
が使い物にならないことから、Playbook
内で条件式を書き、読み込み変数を変えたり、site.yml
を実行するのではなく、ホストごとに実行Playbook
を分けたりするようなアプローチを行う必要があるかと思います。
おわりに
本来はSystems Manager
でベストプラクティス構成のPlayboook
を実行する機能を試して、将来どこかのシステムで提案できればと思い、試してみましたが、注意点もいくつかあり、既存のAnsible
構成をそのまま置き換えられるとは言いづらい結果となりました。
今後のアップデートでAWS側でAnsible
を管理できる機能が追加されればベストですが、それまではこの記事を参考に各自のシステムでベターな構成は何かを検討して貰えればと思います。