LoginSignup
3
0

More than 1 year has passed since last update.

AnsibleをAWS Systems Managerから実行するCI/CDを構築する。(その1:Systems ManagerからのAnsible実行)

Last updated at Posted at 2022-09-23

はじめに

最近勉強がてら「AWS Hands-on for Beginners」の「AWS Code サービス群を活用して、CI/CD のための構成を構築しよう!」を視聴し、自分でもCI/CDの環境を構築してみたいと思ったので、前回手放しでおすすめできるとは言い難いと記事に書いておきながらも、Systems ManagerからAnsible実行機能を使って、CodeCommitAnsible実行用のソースをコミットしたら指定のインスタンスに対してAnsibleを実行する環境を構築してみたいと思います。


最終的な構成

今回から数回に分け、以下のような構成を構築してみようと思います。

Systems ManagerからのAnsible実行について

Systems ManagerRunCommand実行機能の一つで、対象となるノードに対してansible-playbookを実行できる機能となります。

1ファイル構成のplaybook実行と、いわゆるベストプラクティス構成となるplaybookの実行それぞれに対応しているため、すでにAnsibleを使って運用している環境であれば、比較的スムーズに移行することが可能です。

Systems ManagerRunCommand機能を使った場合の動作や仕組みなどについては上記【関連1】で説明しているため、そちらを参照してください。

Systems ManagerRunCommand機能を使ったAnsible実行で注意することは上記【関連3】で説明しているため、そちらを参照してください。

Systems ManagerからのAnsible実行手順

実際にSystems ManagerからPlaybookを実行するには以下のような手順で進めていきます。

流れとしては「Amazon S3からのスクリプトの実行をやってみた。」と同様のRunCommand機能を使用して実行しているため、ほぼ同等の流れとなります。

  • SSM Agentインストール
  • S3バケットへのPlaybook格納
  • S3&Systems Managerアクセス用ロールの作成
  • 対象のEC2インスタンスにS3&Systems Managerアクセス用ロールをアタッチ
  • Amazon S3からのスクリプトの実行

以下以前の記事と被る部分は省略しつつ説明していきます。

SSM Agentインストール

Amazon S3からのスクリプトの実行をやってみた。」と同等の手順となるため、割愛。

S3バケットへのPlaybook格納

今回はベストプラクティス構成のPlaybook実行を試してみようと思うので、以下のようなファイル・ディレクトリ構成のPlaybookをS3に格納していきたいと思います。

ファイル・ディレクトリ構成
ansible_playbook
├── group_vars
│   └── all.yml
├── roles
│   ├── packages
│   │   └── tasks
│   │       └── main.yml
│   └── users
│       └── tasks
│           └── main.yml
├── site.yml
└── test_server.yml
group_vars/all.yml
# パッケージインストール
yum_install:
  - { name: "gcc" }

# test-groupグループ作成
add_group:
  - { name: "test-group", gid: "1100" }

# test-userユーザ作成
add_user:
  - { name: "test-user", group: "test-group", uid: "1100" }
roles/packages/tasks/main.yml
---
# tasks file for packages
- name: Package Install
  ansible.builtin.yum:
    name: "{{ item.name }}"
    state: present
  with_items: "{{ yum_install }}"
roles/users/tasks/main.yml
---
# tasks file for users
- name: add group
  ansible.builtin.group:
    name: "{{ item.name }}"
    state: present
    gid: "{{ item.gid }}"
  with_items: "{{ add_group }}"

- name: add user
  ansible.builtin.user:
    name: "{{ item.name }}"
    group: "{{ item.group }}"
    uid: "{{ item.uid }}"
    state: present
  with_items: "{{ add_user }}"
site.yml
---
- import_playbook: test_server.yml
test_server.yml
- name: test_server playbook
  hosts: all
  become: yes
  roles:
    - { role: packages }
    - { role: users }

尚、S3への格納方法は無圧縮とZip形式に対応しているため、無圧縮でベストプラクティス構成のPlaybookをS3に格納してもよいですが、今回はZip形式に圧縮してからS3に格納しようと思います。

以下MacZipファイルを作成した場合の例。

MacでZip圧縮
zip -r ansible_playbook.zip ansible_playbook

圧縮したソースを適当なバケット直下に格納しておきます。

S3&Systems Managerアクセス用ロールの作成

Amazon S3からのスクリプトの実行をやってみた。」と同等の手順となるため、割愛。

対象のEC2インスタンスにS3&Systems Managerアクセス用ロールをアタッチ

同上

Amazon S3からのスクリプトの実行

いきなり最終構成には持っていけないため、今回は以下のようなSystems ManagerRunCommandAnsibleを単体で実行してみるところまで実施してみます。

コマンドドキュメント

Systems ManagerRunCommandからAnsibleを実行する方法として以下2つの方法がありますが、AWS-RunAnsiblePlaybookは廃止とのことで互換性のため残されているだけのようです。

そのため、新たに使う場合はAWS-ApplyAnsiblePlaybooksを選択すれば問題ありません。

また、AWS-ApplyAnsiblePlaybooksは、コマンド実行時、デフォルトでAnsibleの実行に必要となるパッケージやモジュールは自動でインストールするようできているため、RunCommand実行のために事前に対象ノードにAnsibleAnsibleインストールに伴う依存パッケージのインストールを行うようなことはしなくて済むようにできています。

コマンドドキュメント名 説明
AWS-ApplyAnsiblePlaybooks 複雑なPlaybook実行サポート
AWS-RunAnsiblePlaybook 廃止

Run Commandの実行

実際にマネジメントコンソールよりRunCommandAnsibleを実行していきます。

Systems Manager」→「ノード管理」→「Run Command」から「Run command」を選択します。

Monosnap_20220911_152633.png

コマンドドキュメント」は前述の通りAWS-ApplyAnsiblePlaybooksを選択。

Monosnap_20220911_152755.png

同画面下の「コマンドのパラメータ」は以下のように設定していきます。

基本的にはソース設定とCheck設定(いわゆるDryRunで動作させるかの設定)以外はデフォルトのままで設定。

パラメータ名 パラメータ 説明
Source Type S3 ソースファイル格納先
Source Info {"path":"https://[バケット名].s3.[リージョン名].amazonaws.com"} ソースダウンロード先S3のURL
Install Dependencies True 依存パッケージ自動インストール有無
Playbook File ansible_playbook/site.yml Zip解凍時にディレクトリ作成されるため左記パスで指定
Extra Variables SSM=True デフォルト設定
Check False AnsibleをCheck Modeで動作させるかの設定
今回は反映で設定
Verbose -v ログ詳細表示設定
Timeout Seconds 3600 実行タイムアウト設定

Source InfoJSON形式で設定する必要があるので表のように指定します。

Playbook Fileの設定はソースファイルをS3へ無圧縮でアップロードした場合でも、ディレクトリ構成は判断してくれるため、アップロード先のパスに合わせてsite.ymlを指定するだけで問題ありません。

ターゲット

インスタンスを手動で選択する」を選択し、テスト用に作成したEC2インスタンスをチェックします。

Monosnap_20220911_154820.png

その他の設定

上記設定以外に以下のようなパラメータ設定項目がありますが、今回はAnsibleの動作を確認したいだけなので、通知や出力は行わずに実行を行います。

項目名 設定内容
その他のパラメータ デフォルトのまま
レート制御 デフォルトのまま
出力オプション S3バケットに書き込まないように設定
SNS通知 通知しない

実行結果の確認

実行後、問題なければ以下のように成功します。

Monosnap_20220911_160243.png

また、インスタンスIDを選択すると以下のようにPlaybook実行結果やエラー内容を確認することが可能です。

Monosnap_20220911_160352.png

もし失敗していた場合は、対象ノードに割り当てたIAMロールの権限やPlaybookのパス、エラーログ等を確認しましょう。

おわりに

今回はCI/CD構成を構築する前段階としてSystems ManagerRunCommand機能を使ってAnsible Playbookを実行してみました。

今回は圧縮したソースファイルを直接S3にアップロードしましたが、最終的にはCodeCommitへのコミットを契機として実行するように構築するため、次回はCodeCommitの環境の準備を行っていきます。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0