AnsibleでAWS CLI v2をインストールする

2020-10-15AnsibleAWS


dotfilesをAnsibleで管理していてAWS CLI v2もインストールできるようにroleを追加した

動作対象はCentOSやUbuntu

  • roles/awscli/vars/main.yml
---
awscli_version: 2.0.50
awscli:
  src: https://awscli.amazonaws.com/awscli-exe-linux-x86_64-{{ awscli_version }}.zip
  zip: awscli-{{ awscli_version }}.zip
  • roles/awscli/tasks/main.yml
---
- name: exist awscli v2
  command: which aws
  environment:
    PATH: "/usr/local/bin:{{ ansible_env.PATH }}"
  register: exist_awscli
  changed_when: false
  ignore_errors: true

- name: get awscli version
  shell: "aws --version 2>&1 | grep -oP '(?<=aws-cli\\/)\\d+\\.\\d+\\.\\d+' "
  environment:
    PATH: "/usr/local/bin:{{ ansible_env.PATH }}"
  register: version_in_awscli
  changed_when: false
  ignore_errors: true
  when:
    exist_awscli.rc == 0

- block:
  - name: get zip
    get_url:
      url: "{{ awscli.src }}"
      dest: "/tmp/{{ awscli.zip }}"

  - name: unarchive zip
    unarchive:
      src: /tmp/{{ awscli.zip }}
      dest: /tmp/
      copy: no

  - name: install
    command:
      cmd: ./aws/install --update
      chdir: /tmp

  when:
    exist_awscli.rc != 0
    or ( version_in_awscli is defined and version_in_awscli.stdout.find(awscli_version) == -1 )

ここのコードをroleとして呼び出せば実行できる

コマンドの存在確認だけでなくバージョンまで見て指定バージョンでなければ再度インストールするようにしている

このrole単体で使う場合はunzipがないはずなので別途どこかでインストールさせておく必要がある

aws --versionの出力先が標準エラーだったのでリダイレクトしてバージョン番号を抽出している

また次のサイトでgrepを使い特定の箇所だけを抜き出すというのをやった

grepの-oオプションと-Pオプションの組み合わせが便利 - Gre’s Blog

こういう感じの処理はよくやるので覚えておきたい

実際の差分は次のPRにある

Feature/ansible awscli v2 by swfz · Pull Request #222 · swfz/dotfiles