Ansible2.2のAWSモジュールを試す

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

渡辺です。 2016年10月時点では、Ansibleは2.1が最新バージョンですが、2.2系のRCがリリースされはじめました。 Ansible2.2系では、AWS関連のモジュールが大幅に増え、AWSリソースの構成管理としてAnsibleを利用できる範囲が大幅に拡大します。 何回かに分けてAnsible2.2で追加されるモジュールを中心に紹介したいと思います。

Ansible2.2の準備

はじめにAnsible2.2系をインストールしなければなりませんが、幾つか嵌まり場所があります。 結論としては、pipからインストールしますが、次のようにgitリポジトリを指定し、インストールしてください。

pip install git+https://github.com/ansible/ansible.git@v2.2.0.0-0.2.rc2#egg=ansible

本記事を執筆時点では、最新版がv2.2.0.0-0.2.rc2でした。 実際にインストールする場合は、GitHubを確認した上で、バージョン部分を適宜変更してください。 もちろん、pyenvを使い環境をわけておくべきです(pyenv-virtualenvでAnsible2系とAnsible1系を使い分ける)。

また、AWS関連のモジュールを実行するため、boto, boto3も必要なのであわせてインストールしておきます。

pip install boto boto3

ERROR! The requested action was not found in configured module paths.

以下のエラーが発生する場合があります。

ERROR! The requested action was not found in configured module paths. 
Additionally, core modules are missing.

このエラーでこの記事に辿りついた貴方は、次のようにtar.gzからインストールしていることでしょう。

pip install ansible-2.2.0.0-0.2.rc2.tar.gz

アンインストール後、gitリポジトリを指定してインストールしてください。

ERROR! Missing target hosts

以下のエラーが発生する場合があります。

ERROR! Missing target hosts

このエラーでこの記事に辿りついた貴方は、次のようにzipからインストールしていることでしょう。

pip install ansible-2.2.0.0-0.2.rc2.zip

アンインストール後、gitリポジトリを指定してインストールしてください。

Ansible 2.2で追加されるAWSモジュール

以下のモジュールが追加されます。

  • cloudformation_facts
  • ec2_asg_facts
  • ec2_customer_gateway
  • ec2_lc_find
  • ec2_vpc_dhcp_options_facts
  • ec2_vpc_nacl
  • ec2_vpc_nacl_facts
  • ec2_vpc_nat_gateway
  • ec2_vpc_peer
  • ec2_vpc_vgw
  • efs
  • efs_facts
  • execute_lambda
  • iam_mfa_device_facts
  • iam_server_certificate_facts
  • kinesis_stream
  • lambda
  • lambda_alias
  • lambda_event
  • lambda_facts
  • redshift
  • redshift_subnet_group
  • s3_website
  • sts_session_token

lambda系が気になりますね。

lambda_factsを試してみる

折角なので、lambdaの情報を収集するlambda_factsモジュールを使ってみます。 次のPlaybook(lambda_facts.yml)を作成し、実行してみましょう。

---
- hosts: localhost
  connection: local
  gather_facts: False
  tasks:
    - name: List all for a specific function
      lambda_facts:
        query: all
      register: functions
    - debug: var=functions
$ ansible-playbook lambda_facts.yml 
 [WARNING]: Host file not found: /etc/ansible/hosts

 [WARNING]: provided hosts list is empty, only localhost is available


PLAY [localhost] ***************************************************************

TASK [List all for a specific function] ****************************************
ok: [localhost]

TASK [debug] *******************************************************************
ok: [localhost] => {
    "functions": {
        "ansible_facts": {
            "lambda_facts": {
                "function": {
                    "log2sns": {
                        "code_sha256": "****************************=", 
                        "code_size": 832, 
                        "description": "", 
                        "function_arn": "arn:aws:lambda:ap-northeast-1:378384917084:function:log2sns", 
                        "function_name": "log2sns", 
                        "handler": "lambda_function.lambda_handler", 
                        "last_modified": "2016-03-04T01:52:22.978+0000", 
                        "memory_size": 128, 
                        "role": "arn:aws:iam::xxxxxxxxxxxx:role/elb_lambda", 
                        "runtime": "python2.7", 
                        "timeout": 3, 
                        "version": "$LATEST", 
                        "vpc_config": {
                            "security_group_ids": [], 
                            "subnet_ids": []
                        }
                    }
                }
            }
        }, 
        "changed": false
    }
}

PLAY RECAP *********************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0   

まとめ

AWSのリソース管理をなにで行うべきかは議論の余地があります。 可能であればAWSのスタンダードであるCloudFormationを利用したいところですが、CloudFormationでは構成管理しにくいリソースもあることは事実です。 特にEC2インスタンスやRDSインスタンスなど、ライフサイクルがCloudFormationと独立せざるを得ない場合などです。 うまくCloudFormationと棲み分けしつつ構成管理するのがベストではと考えています。

EC2の内部についてAnsibleで構成管理を行うのであれば、追加で新しいツールを利用せず、AnsibleでAWSリソースも構成管理できるのがひとつの理想なのではないでしょうか? 次回以降、各モジュールを紹介していきたいかと思います。