この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
困っていた内容
EC2 Image Builder で Rolesディレクトリを使用してる Ansible Playbook を実行するにはどうしたらいいですか?
どう対応すればいいの?
EC2 Image Builder + Ansible Playbook については以下ブログが参考になりますのでご参照ください。
Executing Ansible playbooks in your Amazon EC2 Image Builder pipeline
Rolesディレクトリを使用してる場合の方法については以下となります。
S3 bucket に Ansible Playbook をアップロード
以下のような構成の Ansible Playbookを S3にアップロードします。
❯ tree
.
├── playbook.yml
└── roles
├── apache
│ ├── files
│ │ ├── httpd.conf
│ │ └── ssl.conf
│ ├── handlers
│ │ └── main.yml
│ └── tasks
│ └── main.yml
├── mariadb
│ ├── files
│ │ └── MariaDB.repo
│ └── tasks
│ └── main.yml
├── php
│ └── tasks
│ └── main.yml
└── yum
└── tasks
└── main.yml
- playbook.yml
注意、hostsはローカルホスト
- hosts: 127.0.0.1
become: yes
roles:
- yum
- php
- apache
- mariadb
component.yml
name: 'LAMP on Amazon Linux 2'
description: 'LAMP setup'
schemaVersion: 1.0
phases:
- name: build
steps:
- name: InstallAnsible
action: ExecuteBash
inputs:
commands:
- sudo amazon-linux-extras install -y ansible2
- name: MakeDir
action: ExecuteBash
inputs:
commands:
- 'sudo mkdir /tmp/ansible'
- name: DownloadPlaybook
action: S3Download
inputs:
- source: 's3://bucket_name/ansible_playbooks/*'
destination: '/tmp/ansible'
- name: ExecutePlaybook
action: ExecuteBash
inputs:
commands:
- 'cd /tmp/ansible'
- 'ansible-playbook ./playbook.yml'
- name: DeletePlaybook
action: ExecuteBash
inputs:
commands:
- rm -rf '{{ build.DownloadPlaybook.inputs[0].destination }}'
- name: validate
steps:
- name: ValidateResponse
action: ExecuteBash
inputs:
commands:
- curl -s http://127.0.0.1
- name: test
steps:
- name: ValidateResponse
action: ExecuteBash
inputs:
commands:
- curl -s http://127.0.0.1
Rolesディレクトリを使用していたので、少し変更しています。
- Ansible Playbooksをダウンロードするディレクトリを作成
- name: MakeDir
action: ExecuteBash
inputs:
commands:
- 'sudo mkdir /tmp/ansible'
- S3から、Ansible Playbooksをダウンロード
- name: DownloadPlaybook
action: S3Download
inputs:
- source: 's3://bucket_name/ansible_playbooks/*'
destination: '/tmp/ansible'
- 移動して、実行
- name: ExecutePlaybook
action: ExecuteBash
inputs:
commands:
- 'cd /tmp/ansible'
- 'ansible-playbook ./playbook.yml'
これで、EC2 Image Builder で Rolesディレクトリを使用してる Ansible Playbook を実行できました。
IAM Role
権限が足りない可能性があるので、IAM Roleは見直しましょう。
今回は以下のロールのほかにS3をダウンロードするのでAmazonS3ReadOnlyAccess
をアタッチしました。
トラブルシューティング用に、S3にログを出すためにはPutObject
が必要です。
- EC2InstanceProfileForImageBuilder
- AmazonSSMManagedInstanceCore
おまけ
Image pipelinesの設定
トラブルシューティングの為に Terminate instance on failure
はTrue
にするとインスタンスにログインできるので、実際にどこまでコマンドが実行されているか確認することが可能です。
S3に出した、stderr.txt
と、stdout.txt
だとわからない可能性がありますので、お勧めします。