話題の記事

Ansible使いの人はちょっと見逃せない。AWS Systems Managerで複雑な構成のAnsible-Playbookの実行が可能になりました

2019.09.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

AWS事業本部 梶原@新福岡オフィスです。

数日前に、AWS Systems Manager で複雑な構成のAnsible-Playbookの実行がサポートされました。

https://aws.amazon.com/jp/about-aws/whats-new/2019/09/now-use-aws-systems-manager-to-execute-complex-ansible-playbooks/

一瞬、以前から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でFTPSサーバ(vsftpd)を立ててみた

適当なディレクトリに移動し

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のコマンドの実行

コマンドのドキュメントを選択

https://ap-northeast-1.console.aws.amazon.com/systems-manager/run-command/send-command?region=ap-northeast-1

AWS Systems Managerコマンドの実行からAWS-ApplyAnsiblePlaybooks を選択します。

コマンドのパラメータを選択(入力)します

1.Source Type: S3 を選択します。

  1. Source Info はpathにS3に保存したzipファイルのURLを設定します。
{
   "path":"https://pub-devio-blog-qrgebosd.s3-ap-northeast-1.amazonaws.com/ansible/ansible-vsftpd.zip"
}
  1. Install Dependencies はTrueを選択します。 対象のインスタンスにてTrueを選択した場合、Ansibleのインストール(依存関係含む)が行われます。

  2. Playbook File は 実行するplaybookを指定します。 ここでは、vsftpd-ftps.yml を入力します。

ターゲットを選択します。

通常Systems Managerでのインスタンスの指定と特にかわりはありません。 RoleにSystems ManagerのRoleを設定したインスタンスを指定します。

実行

右下の実行ボタンを選択します。

実行結果

正常にコマンドが実行されると、コマンド履歴から進捗状況、実行結果等が確認できます。

実行のログからですが、コマンド実行の流れとしては

  1. Ansibleのインストール
Installed:
ansible.noarch 0:2.8.4-1.el7
  1. 実行対象のプレイブックを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
  1. 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を使われている方はぜひとも試してみてください。

参考

https://aws.amazon.com/jp/about-aws/whats-new/2019/09/now-use-aws-systems-manager-to-execute-complex-ansible-playbooks/

https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-state-manager-ansible.html