Ansible使いの人はちょっと見逃せない。AWS Systems Managerで複雑な構成のAnsible-Playbookの実行が可能になりました
AWS事業本部 梶原@新福岡オフィスです。
数日前に、AWS Systems Manager で複雑な構成のAnsible-Playbookの実行がサポートされました。
一瞬、以前からAnsible Playbookの実行はできてたじゃん。とスルーしそうになったんですが、Complex
の文字が目にとまりました。
よくよく読んでみると、S3 or Github上のzip またはディレクトリ構造のPlaybookを実行できるとの記載があります。
そうです、AnsibleのBest Practicesに沿った構成のまま、EC2上でAnsible-Playbookの実行ができそうです。
やってみた。
という事で、とりあえず何か手頃なPlaybookを実行してみようと、FTPSサーバを立てる際に使用したPlaybookがあったので 適当にEC2インスタンスを起動し、S3にzipファイルを置いて、AWS Systems Managerから実行してみました。
PlayBookを含んだzipファイルの作成
Playbookは下記ブログの内容と同じなのですが、role配下のフォルダもzipに含む必要があります
適当なディレクトリに移動し
ansible-galaxy install -p ./roles weareinteractive.vsftpd
を実行するとコマンドを実行したディレクトリ配下にrolesにファイルがダウンロードされますので、そちらを含めてzipファイルを作成します。(ansible-vsftpd.zipとして作成しました) zipの中はこんな感じになります。
. ├── roles │ ├── weareinteractive.openssl │ │ ├── CHANGELOG.md │ │ ├── defaults │ │ │ └── main.yml │ │ ├── LICENSE │ │ ├── Makefile │ │ ├── meta │ │ │ ├── main.yml │ │ │ └── readme.yml │ │ ├── README.md │ │ ├── tasks │ │ │ ├── cacert.yml │ │ │ ├── config.yml │ │ │ ├── create_dir.yml │ │ │ ├── install.yml │ │ │ ├── main.yml │ │ │ ├── manage.yml │ │ │ └── vars.yml │ │ ├── templates │ │ │ └── etc │ │ │ └── ssl │ │ │ └── openssl.cnf.j2 │ │ ├── tests │ │ │ └── main.yml │ │ └── vars │ │ ├── default.yml │ │ ├── redhat.yml │ │ ├── suse.yml │ │ └── ubuntu.yml │ └── weareinteractive.vsftpd │ ├── CHANGELOG.md │ ├── defaults │ │ └── main.yml │ ├── handlers │ │ └── main.yml │ ├── LICENSE │ ├── Makefile │ ├── meta │ │ ├── main.yml │ │ └── readme.yml │ ├── README.md │ ├── tasks │ │ ├── config.yml │ │ ├── install.yml │ │ ├── main.yml │ │ ├── manage.yml │ │ └── service.yml │ ├── templates │ │ └── etc │ │ └── vsftpd.conf.j2 │ ├── tests │ │ └── main.yml │ ├── Vagrantfile │ └── vars │ ├── Debian.yml │ └── RedHat.yml └── vsftpd-ftps.yml
自分が作成したPlaybook自体は大したことないのですが、role配下はベストプラクティスに沿った構成となっています。
vsftpd-ftps.yml(省略)完全なファイルはこちらを参照
# ansible-playbook vsftpd-ftps.yml - hosts: all vars: << 省略>> # 自己証明書作成 # FTP用 User 追加 vsftpd_users: - username: ftpuser name: FTP User # vsFTPD設定 vsftpd_config: force_local_data_ssl: YES force_local_logins_ssl: YES # log_ftp_protocol: YES # ssl key vsftpd_key_file: "ftp.classmethod.info.key" # ssl cert vsftpd_cert_file: "ftp.classmethod.info.crt" roles: - weareinteractive.openssl - weareinteractive.vsftpd
S3へ保存
作成したzipファイルをS3にアップロードして配置します。 (公開もしくは、アクセス権限を設定してください)
オブジェクト URL をメモします
https://pub-devio-blog-qrgebosd.s3-ap-northeast-1.amazonaws.com/ansible/ansible-vsftpd.zip
にアップロードしたものとして進めます。
AWS Systems Managerのコマンドの実行
コマンドのドキュメントを選択
AWS Systems Manager
のコマンドの実行
からAWS-ApplyAnsiblePlaybooks
を選択します。
コマンドのパラメータを選択(入力)します
1.Source Type: S3 を選択します。
- Source Info はpathにS3に保存したzipファイルのURLを設定します。
{ "path":"https://pub-devio-blog-qrgebosd.s3-ap-northeast-1.amazonaws.com/ansible/ansible-vsftpd.zip" }
- Install Dependencies は
True
を選択します。 対象のインスタンスにてTrueを選択した場合、Ansibleのインストール(依存関係含む)が行われます。 -
Playbook File は 実行するplaybookを指定します。 ここでは、
vsftpd-ftps.yml
を入力します。
ターゲットを選択します。
通常Systems Managerでのインスタンスの指定と特にかわりはありません。 RoleにSystems ManagerのRoleを設定したインスタンスを指定します。
実行
実行結果
正常にコマンドが実行されると、コマンド履歴から進捗状況、実行結果等が確認できます。
実行のログからですが、コマンド実行の流れとしては
- Ansibleのインストール
Installed: ansible.noarch 0:2.8.4-1.el7
- 実行対象のプレイブックをS3からダウンロード
Complete! Running Ansible in /var/lib/amazon/ssm/i-072e8030071378e13/document/orchestration/1fd1ace2-e2e1-4bdb-9615-7afffb677d70/downloads Archive: ./ansible-vsftpd.zip creating: roles/ creating: roles/weareinteractive.openssl/ extracting: roles/weareinteractive.openssl/.ansible-lint inflating: roles/weareinteractive.openssl/.clog.toml
- Ansible-Playbookの実行
PLAY [all] ********************************************************************* TASK [Gathering Facts] ********************************************************* <<省略>>
が行われ、指定したzipファイルの展開、Playbookの実行が行われました。
まとめ
特にPlaybookの実行途中などで引っかかることもなく、あっけなく、Ansible Playbookの実行ができてしまいました。 デバッグ等はさすがにAWS Systems Managerを経由しながらだと手間がかかるかと思いますが、検証済みのAnsibleのPlaybookがあれば、Systems Managerを生かして SSH不要、複数のインスタンスに同時に実行、など利点を享受できるかと思います。またSystems Mangerのコマンド実行は管理インスタンスであればよいので、オンプレミスのインスタンスなどでも実行可能かと思われます。
ミドルウェアの構成管理などはPlaybookの方がやりやすかったりするので、S3またGithubに保持し、AnsibleのPlaybookを用いて設定また、再利用することが可能になるかと思います。 また、PlaybookのCheck実行もできるので、構成差異の検出などにも役立つかもしれません。
Ansibleを使われている方はぜひとも試してみてください。