AnsibleでAWS操作　aws-cliインストール編

# AnsibleでAWS操作シリーズ

1. aws-cliインストール編
1. [EC2インスタンス編](http://qiita.com/bakira/items/ae56e8e03eed4dc75a01)
1. [S3バケット編](http://qiita.com/bakira/items/a1dfe79cfd0e3acaa1a6)
1. [CloudFrontディストリビューション編](http://qiita.com/bakira/items/611e3a51677b751f8366)
1. [Simple Email Service編](http://qiita.com/bakira/items/8147fcc7cb684beedc63)
1. [Certificate Manager編](http://qiita.com/bakira/items/50bdd853ce71953e1600)
1. [Lambda編](https://qiita.com/bakira/items/d55c91328cd1f0ee9581)

# 関連記事

[aws-cli　コマンド一覧(随時追記)](http://qiita.com/bakira/items/8a9481c99ed56a367415)

[aws-cliにて、複数の認証情報を使い分けたい場合の設定方法](https://qiita.com/bakira/items/3a4876cbb39f9a7ec3b8)




# やりたかったこと

- [`Ansible`](https://www.ansible.com/)で[`aws-cli`](https://www.ansible.com/)を使う
- 出来る限りの`AWS`サービスの操作をコマンドで行いたい
- ~~GUIを使わずに黒い画面でコマンドを「**ッターーン!**」してかっこつけたい~~

# やったこと

## 概要

`user`　->　`Jenkins`　->　`Ansible`　->　`aws-cli`

の関係性で運用しているが、今回の記事では

`Ansible`　->　`aws-cli`

ここだけに注目してまとめます。

## 前提

- CIサーバー(`ansible`実行サーバー)構築済み
- CLIサーバー(`aws-cli`実行サーバー)構築済み
- `Ansible`インストール済み
- 各サーバーへのSSH接続設定済み
- `${~}`は各環境に合わせて値を設定してください。

## 作業フロー

### 実行コマンド

1. aws-cliをインストール
 
```bash:command
ansible-playbook -i inventory/production install-aws-cli.yml
```

2. aws-cliコマンドの動作確認

```bash:command
ansible-playbook -i inventory/production view-aws-ec2-instance.yml
```

## ディレクトリ構成
```text

├── ansible.cfg
├── files
│   └── production
│       ├── aws
│       │   └── cli
│       │       ├── config
│       │       └── credentials
│       └── ssh
│           └── jenkins
│               └── config
├── install-aws-cli.yml
├── inventory
│   └── production
│       └── inventory
├── roles
│   ├── install-aws-cli
│   │   └── tasks
│   │       └── main.yml
│   ├── setup-aws-cli
│   │   └── tasks
│   │       └── main.yml
│   └── view-aws-ec2-instance
│       └── tasks
│           └── main.yml
├── vars
│   └── all.yml
└── view-aws-ec2-instance.yml
```

## Ansible構成ファイル

### inventory

```ini:inventory/production/inventory
[ciservers]
${CIサーバーホスト}

[cliservers]
${CLIサーバーホスト}

[all:vars]
ENV=production

```

### vars

```yaml:vars/all.yml
GET_URL_TEMP_DIRECTORY: /tmp

AWS_CLI:
  URL: https://bootstrap.pypa.io/get-pip.py
  FILE_NAME: get-pip.py

WORK_USER:
  NAME: ${ユーザー名}
  GROUP: ${ユーザーグループ}
```


### playbook

```yaml:install-aws-cli.yml
- hosts: cliservers
  roles:
    - install-aws-cli
    - setup-aws-cli
  vars_files:
    - vars/all.yml
```
### tasks

```yaml:role/install-aws-cli/tasks/main.yml
- name: "download"
  become: yes
  shell: curl {{ AWS_CLI.URL }} -o {{ GET_URL_TEMP_DIRECTORY }}/{{ AWS_CLI_FILE_NAME }}
  
- name: "install"
  become: yes
  shell: python {{ GET_URL_TEMP_DIRECTORY }}/{{ AWS_CLI.FILE_NAME }}
```

```yaml:role/setup-aws-cli/tasks/main.yml
- name: "create .aws dir"
  file:
    dest=~/.aws/
    state=directory
    owner={{ WORK_USER.NAME }}
    group={{ WORK_USER.GROUP }}

- name: "copy config"
  copy: 
    src={{ ENV }}/aws/cli/config
    dest=~/.aws/config
    owner={{ WORK_USER.NAME }}
    group={{ WORK_USER.GROUP }}
  tags:
    - always

- name: "copy credentials"
  copy: 
    src={{ ENV }}/aws/cli/credentials
    dest=~/.aws/credentials
    owner={{ WORK_USER.NAME }}
    group={{ WORK_USER.GROUP }}
  tags:
    - always
```

### files

```ini:files/production/aws/cli/config
[default]
output = json
region = ${REGION}
```

```ini:files/production/aws/cli/credentials
[default]
aws_access_key_id = ${AWS_ACCESS_KEY}
aws_secret_access_key = ${AWS_SECRET_KEY}
```

エラーが出ずに処理が終了したら、念のため以下の確認用playbookを実行してみます。

### playbook

```yaml:view-aws-ec2-instance.yml
- hosts: cliservers
  roles:
    - view-aws-ec2-instance
  vars_files:
    - vars/all.yml
```
### tasks

```yaml:role/view-aws-ec2-instance/tasks/main.yml
- name: "View ec2 instans list"
  shell: |
    aws ec2 describe-instances \
    --query 'Reservations[].Instances[].{PublicIp:PublicIpAddress,PrivateIp:PrivateIpAddress,InstanceId:InstanceId,Name:Tags[?Key==`Name`].Value}'
  register: result

- debug: var=result.stdout_lines
  when: result | success
  tags:
    - always
```


これで`EC2`上のインスタンス情報が出力されます。

## 終わりに

`aws-cli`は導入さえしてしまえばあとはいろいろやりたい放題出来ます！

`AWS`はダッシュボードが充実していて便利ですが、サービスがありすぎて誰が何をやったかが残らないので出来る限り`Ansible`+`aws-cli`の組み合わせで構成管理を把握しやすい状態にする事でみんなが幸せになると思います。


次は、`EC2インスタンス`の作成を`Ansible`+`aws-cli`でやってみようと思います。

じゃあの。