はじめに
以前から気になっていた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を管理できる機能が追加されればベストですが、それまではこの記事を参考に各自のシステムでベターな構成は何かを検討して貰えればと思います。