AWSのためのAnsible入門

構成管理ツールはChefが有名ですが、よりシンプルで使いやすいAnsibleの基本的な使い方です。Chefの高機能性に比較するとAnsibleはシンプルになりますが、そもそも複雑なことはTerraformなどより適したツールで行い、サーバ・インスタンス単位のプロビジョニングはAnsibleで行う、という役割を持たせると管理しやすいと思います。

Ansibleの特徴として、

エージェントレス

ChefやPuppetのようにサーバ側にエージェントをインストールすることなく、SSHが繋がる環境であればOKという手軽さです。

YAMLで記述

サーバの定義を記述したPlaybookは、YAML形式で記述していくのでプログラムに詳しくない人でも簡単に使うことができます。その反面、複雑なことをしようと思うとPlaybookがシェルスクリプトで埋まり、Ansibleの良さは失われるかもしれません。

冪等性

Ansibleは、「この処理を実行せよ」ではなく「この状態であることを保証せよ」という思想で作られているので、Playbookが同じであれば何度実行しても同じ結果になります(commandなど一部のモジュールは除く)。

という特徴はありますが、構成管理ツールで便利なのはなにより

インフラのチーム共有が可能に

my.cnfはこのバージョンではこの記述を入れておく、apacheはこのモジュール設定を入れておく、rubyはrbenvでどうする、などインフラの知識や設定などは属人化しやすい傾向にあります。チーム内の誰かにサーバ建てといてーと頼んでみたところで、その人が調べながら構築した内容をチェックするのも大変な作業です。しかも、だいたい間違ってたりします。

Ansibleなら設定ファイルも管理できるので、Ansibleプロジェクトをgitで管理してチーム共有、serverspecなどのテストツールと合わせてCI経由で本番環境に適用する、といったDevOpsも可能です。

Ansibleのウェブサイトにも、

Ansible is designed around the way people work and the way people work together.

と書いてあるので、チームで使いやすいサーバ構成管理ツールとしてのスタンスで開発されているのだと思います。

AWSでAnsible

まずはAnsibleをインストールします。ローカルのMacにはPython 2.7.13が入っているので、pipインストールします。

$ pip install ansible

これでAnsibleが使えるようになったので、シンプルにEC2インスタンスを建ててみましょう。hostsとsite.ymlの2つのファイルを作成します。

hosts

127.0.0.1

site.yml

- hosts: localhost
gather_facts: no
connection: local
tasks:
- name: Create ec2 instanse
ec2:
key_name: mypemkey
instance_type: t2.micro
image: ami-bbf2f9dc
monitoring: no
wait: yes
region: ap-northeast-1
group_id: sg-12345678
vpc_subnet_id: subnet-9876543
assign_public_ip: yes
instance_tags:
Name: ansible-sample1
register: ec2

AWS環境をAnsibleで構成する際には、hostsをlocalhostと記述します。そして、taskにec2の設定内容を書いてあります。今回はvpcのサブネットや、セキュリティグループ、キーペアなどは予め作成してあります。

YAML形式なので見たままですが、key_nameでキーペア、instance_typeで今回作成するインスタンスのスペック、imageでは使用するAMI、group_idでセキュリティグループ、などを指定しています。

シンタックスチェック

$ ansible-playbook -i hosts site.yml --syntax-check
playbook: site.yml

Dry run

$ ansible-playbook -i hosts site.yml -C
PLAY [localhost] ***************************************************************************************************************************
TASK [Create ec2 instanse] *****************************************************************************************************************
skipping: [127.0.0.1]
PLAY RECAP *********************************************************************************************************************************
127.0.0.1                  : ok=0    changed=0    unreachable=0    failed=0

実行は

$ ansible-playbook -i hosts site.yml
PLAY [localhost] ***************************************************************************************************************************
TASK [Create ec2 instanse] *****************************************************************************************************************
changed: [127.0.0.1]
PLAY RECAP *********************************************************************************************************************************
127.0.0.1                  : ok=1    changed=1    unreachable=0    failed=0

これだけでEC2インスタンスが立ち上がります。

もしPythonのエラーが出る場合は、interpreterのパスを指定してあげましょう。

hosts

127.0.0.1  ansible_python_interpreter=/Users/me/.pyenv/shims/python

AWS クレデンシャル

構成管理ツールは、EC2インスタンスの起動はもちろん停止なども出来るので、会社のAWSアカウントや本番アカウントにいきなり作ってしまうと万一の際にトラブルになります。社内用のアカウントに切り替えて実行したい時には、使用するクレデンシャル情報を指定することで対応できます。

予めAWSの認証情報からAWS Access Key IDとAWS Secret Access Keyを取得して、

$ aws configure --profile mysecond

でローカル環境に設定しておきます。

Playbookの実行時に

$ AWS_PROFILE=mysecond ansible-playbook -i hosts site.yml

とすれば、AWS_PROFILEで指定したAWSアカウントで接続できます。

APN Consulting Partner
スーパーソフトウエアはAWSパートナーネットワーク(APN)のコンサルティングパートナーです。