EC2 Image Builder で Rolesディレクトリを使用してる Ansible Playbook を実行するにはどうしたらいいですか?

2020.10.17

困っていた内容

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ディレクトリを使用していたので、少し変更しています。

  1. Ansible Playbooksをダウンロードするディレクトリを作成
      - name: MakeDir
        action: ExecuteBash
        inputs:
          commands:
            - 'sudo mkdir /tmp/ansible'
  1. S3から、Ansible Playbooksをダウンロード
      - name: DownloadPlaybook
        action: S3Download
        inputs:
          - source: 's3://bucket_name/ansible_playbooks/*'
            destination: '/tmp/ansible'
  1. 移動して、実行
      - 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 failureTrueにするとインスタンスにログインできるので、実際にどこまでコマンドが実行されているか確認することが可能です。

S3に出した、stderr.txtと、stdout.txtだとわからない可能性がありますので、お勧めします。

参考