ansibleでaws-cliをインストールする (+S3)

やりたいことは以下の2つ。

  • ansibleでaws-cliをインストールする
  • ansibleでインストールしたaws-cliでs3コマンドを打てるようにする

なお、相手には既にpipがインストールがしてあるものとします。
ansibleを実行するために最小構成でPythonをインストールしたもののpipは入れていない、
という状況であれば、先にpipをインストールする必要があります。

リージョン、S3のkey,secretは仮に以下とします。
事前にAWSのコンソールで設定,取得してください。

  • region: ap-northeast-1
  • s3.key: AHJKOKODAJOIFAJDJDIOA
  • s3.secret: AugioaiARJOIfjop20FJIOADOiFJAODA

ファイル達

構成は以下の通りです。(※)のファイルが核心です。
stagingとかになってますが、もちろん成立する範囲で修正してください。


├──provision.yml (※)
├──ansible.cfg
├──group_vars
│  └───staging.yml (※)
├──hosts
|  └───staging
├──host_vars
|  └───default.yml
└──roles
   └─awscli (※)
     ├─templates
     | └─config.conf.j2
     | └─credentials.conf.j2
     └─tasks
       └─main.yml

group_vars/staging.ymlに設定を書きます。


user: ubuntu
s3:
  region: ap-northeast-1                    # S3.region
  key: AHJKOKODAJOIFAJDJDIOA                # S3.key
  secret: AugioaiARJOIfjop20FJIOADOiFJAODA  # S3.secret

roles/awscli/templates/config.conf.j2にaws-cliの設定を書きます。
s3.regionが評価され値が入ります。相手の~/.aws/configに配置します。


[default]
output = json
region = {{s3.region}}

roles/awscli/templates/credentials.conf.j2にs3の設定を書きます。
s3.keyとs3.secretが評価され値が入ります。相手の~/.aws/credentialsに配置します。


[default]
aws_access_key_id = {{s3.key}}
aws_secret_access_key = {{s3.secret}}

rokes/awscli/tasks/main.ymlに状態を定義します。
内容は以下の通りです。
1) aws-cliがpip installされた状態
2) ~/.aws/以下に設定ファイルがコピーされた状態


---
- name: install aws-cli
  pip:
    name: awscli

- name: create .aws dir
  file:
    dest: /home/{{user}}/.aws
    state: directory
    owner: "{{user}}"
    group: "{{user}}"

- name: copy config
  template:
    src: config.conf.j2
    dest: /home/{{user}}/.aws/config
    owner: "{{user}}"
    group: "{{user}}"

- name: copy credential
  template:
    src: credential.conf.j2
    dest: /home/{{user}}/.aws/credentials
    owner: "{{user}}"
    group: "{{user}}"
~
~

Playbook(provision.yml)は以下の通りです。


- hosts: remote_machine
  remote_user: "{{ user }}"
  gather_facts: "{{ check_env | default(True) }}"
  become: yes
  become_method: sudo
  roles:
    - { role: awscli }

実行結果

Playbookを実行します。


$ ansible-playbook -i hosts/staging provisiong.yml

相手のユーザディレクトリに.awsというディレクトリが作られ、中にファイルが作られます。


~/
  └─.aws
    ├─config
    └─credentials

相手側でaws s3 lsコマンドを打って設定しろと言われなければ成功です。


$ aws s3 ls

2019-10-20 11:11:20 hogehoge

おわり。