概要
system managerからansibleをEC2インスタンスに対して実行することができます。ssh鍵不要である点がとても嬉しいです。
使い方
- ansibleのソースコードはs3またはgithubにおく
- s3の場合はzipファイルをアップロードする
- system manager ⇒ Run Commandで設定をする
- コマンド ドキュメント
- AWS-ApplyAnsiblePlaybooksを選択
- コマンドのパラメータ
-
イメージは以下
-
- コマンド ドキュメント
'{"Check":["False"],"PlaybookFile":["/playbook/ec2.yml"],"SourceType":["S3"],"SourceInfo":["{"path":"{{S3のURL}}"}"]]}'
- Source TypeでS3を選択
- Source InfoにS3のzipファイルurlを入力
- install dependenciesをtrueにする
- 依存関係の解決
- Playbook Fileにてplaybookのyamlファイルのパスを指定する
- ターゲット
- 実行するEC2を選択
- 実行する
## やってみた
実行したansibleは以下のもの
- nginxのインストールと実行をするansibleサンプル
[https://github.com/ryo-hagiwara-fate/ansible_nginx](https://github.com/ryo-hagiwara-fate/ansible_nginx)
- zipファイルにする
```bash
zip -r ファイル名.zip フォルダパス
- s3にアップロードする
aws s3 cp ファイル名.zip s3://バケット名/ --acl public-read
- System Managerで設定する
- Source Infoの書き方は
{"path":s3にアップロードしたzipファイルのurl}
- Playbook Fileのパスに関して今回は「playbook/ec2.yml」となる
- Source Infoの書き方は
- 確認
- EC2インスタンスのpublic IPまたはDNSにアクセスするとnginxの画面が現れる。
注意点
- EC2インスタンスのインスタンスプロファイルに「S3ReadOnlyAccess」権限を付与すること
- ansibleのhostsはallにする。
レポート
- ssh鍵なしでansible実行できる。
- 今まではinventoryで実行するインスタンスのipアドレスを入力する必要があったがそれが不要。シェルスクリプトでいちいちやる必要がなくなった。
- 感覚的にはopsworksのansible版。opsworksはchefで、system managerはansibleでできる。
自動化できました
今回はAWSのコンソールでポチポチ設定するような形式でしたが、AWS CLIでも同じことができます。そのサンプル作成しました。
以下のようにしてAWS CLIで実行できます。プレイブックのzip化、s3アップロードなどもスクリプトにかけば全工程をコマンド一発で自動化できる。
# systems manageの設定
PARAMETER='{"ExtraVariables":["SSM=True"],"Check":["False"],"PlaybookFile":["/playbook/ec2.yml"],"SourceType":["S3"],"SourceInfo":["{\"path\":\"{{S3のURL}}\"}"],"ExtraVariables":["hostname='${RDSなどのホスト名}'"]}' && echo ${PARAMETER}
# SystemsManagerコマンド実行
aws ssm send-command --document-name "AWS-ApplyAnsiblePlaybooks" --instance-ids "${INSTANCE_ID}" --parameters ${PARAMETER} --profile ${PROFILE}
参考文献
Ansible使いの人はちょっと見逃せない。AWS Systems Managerで複雑な構成のAnsible-Playbookの実行が可能になりました
Ansible プレイブックを実行する関連付けの作成