この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
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を使われている方はぜひとも試してみてください。