【備忘録】Ansibleでプロビジョニング playbook編

■はじめに

前回のエントリでinventory.iniでのAzureVM疎通(ping)まで確認しました。
本日はAnsibleの本丸、playbook編です。

■前提

前回のエントリで何となくなplaybookを書いていましたが、あれだと全く動かないので(じゃあ載せるなと。。)こちらが本物です。
前回のは要らぬ誤解を与えるのでplaybook.ymlの中身は消しておきます。はい。。

ansible.cfgファイルが必要です。
GitHubにexampleがあるので、こちらをそのまま拾って任意のパスを通しておきます。 https://raw.githubusercontent.com/ansible/ansible/devel/examples/ansible.cfg

■playbook.yml準備


早速ですが以下となります。

---
# targetセクション
# hosts allにするとinventoryのターゲットがそのまま使用される
- name: selenoid_VM
  hosts: all
  become: yes

# varsセクション
# 引数として設定値があれば定義しておく
# vars:
#
# tasksオプション
# 構成管理の本体
  tasks:
    - name: アーカイブキー取得 # wgetからのapt-key addはこれ
      apt_key:
        url: https://www.ubuntulinux.jp/ubuntu-ja-archive-keyring.gpg
        state: present
    - name: 非公式リポジトリ取得 # wgetからのapt-key addはこれ
      apt_key:
        url: https://www.ubuntulinux.jp/ubuntu-jp-ppa-keyring.gpg
        state: present
    - name: ダウンロード # wgetはこれ
      get_url:
        url: https://www.ubuntulinux.jp/sources.list.d/bionic.list
        dest: /etc/apt/sources.list.d/ubuntu-ja.list
        mode: '0640'
    - name: 推奨インストール # apt-get installはこれ
      apt:
        name:
          - linux-generic-hwe-18.04
        install_recommends: yes
    - name: Upgrade # apt-get updateはこれ
      apt:
        name: "*"
        state: latest
    - name: 基本インストール # apt-get installはこれ
      apt:
        name:
          - apt-transport-https
          - ca-certificates
          - curl
          - gnupg-agent
          - software-properties-common
        force: yes
    - name: タイムゾーンを日本時間に変更 # timedatectlはこれ
      timezone:
        name: Asia/Tokyo
    - name: docker関連の削除 # apt-get removeはこれ
      apt:
        name:
          - docker
          - docker-engine
          - docker.io
          - containerd
          - runc
        state: absent
    - name: docker取得 # curlも恐らくapt-key addはこれ
      apt_key:
        url: https://download.docker.com/linux/ubuntu/gpg
        state: present
    - name: リポジトリの追加 # add-apt-repository debはこんな感じ
      apt_repository:
        repo: deb [arch=amd64] https://download.docker.com/linux/{{ansible_distribution|lower}} {{ansible_distribution_release}} stable
    - name: docker再インストール # apt-get install 再び
      apt:
        name:
          - docker-ce=5:19.03.11~3-0~ubuntu-bionic
          - docker-ce-cli=5:19.03.11~3-0~ubuntu-bionic
          - containerd.io
    - name: docker-composeダウンロード # curl及びchmodを実行
      get_url:
        url: https://github.com/docker/compose/releases/download/1.25.4/docker-compose-{{ ansible_system }}-{{ ansible_architecture }}
        dest: /usr/local/bin/docker-compose
        mode: '655'
    - name: docker-composeの権限変更 # chmodがこれ 
      file:
        path: /usr/local/bin/docker-compose
        owner: qa
        group: qa
        mode: '0755'


少し前のエントリubuntuにdockerのプロビジョニングをする回があったかと思います。
実はあの記述をplayhbookのお作法に書き換えたのが上記です。
そう、CentOSでもUbuntuでもそうなのですが、全部コマンドがansibleではモジュールと言う処理で代替されています。
慣れ親しんだコマンドは使えません(いや厳密には使えますが、話がややこしくなるためここでは割愛)。

なのでubuntuで叩いていたコマンドをansibleのモジュールからまず探す旅が始まります。
これが最初感覚的に分からなくて結構大変だった。
ちなみにモジュール一覧は以下に列挙されています。

docs.ansible.com とんでもない量ある。。でも眺めてるとAzureContainerInstances専用モジュールあるじゃん!とか面白い発見もあります。

この中から、例えばapt-getならpackaging moduleかなとか、wgetとかならfile moduleかなとか当たりをつけてゆきます。


...ゆくんですが、はっきり言ってそんな事してられないのでここは素直にドキュメントトップ画面から検索してみましょう(aptとかchmodとか)。

docs.ansible.com

どのコマンドがどのモジュールに対応していそうかに関しては、playbook.yml内にコメントを残しておきました。
参考にしてみてください。

さて、このplaybookを実行します。

% ansible-playbook -i inventory.ini playbook.yml

PLAY [selenoid_VM] ***********************************************************************************************************************************************************

TASK [Gathering Facts] *******************************************************************************************************************************************************
Enter passphrase for key '/Users/ユーザ名/.ssh/id_rsa': 
[DEPRECATION WARNING]: Distribution Ubuntu 18.04 on host FQDN should use /usr/bin/python3, but is using /usr/bin/python for backward 
compatibility with prior Ansible releases. A future Ansible release will default to using the discovered platform python for this host. See 
https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information. This feature will be removed in version 2.12. Deprecation warnings
 can be disabled by setting deprecation_warnings=False in ansible.cfg.
ok: [FQDN]

TASK [アーカイブキー取得] *************************************************************************************************************************************************************
ok: [FQDN]

TASK [非公式リポジトリ取得] ************************************************************************************************************************************************************
ok: [FQDN]

TASK [ダウンロード] ****************************************************************************************************************************************************************
ok: [FQDN]

TASK [推奨インストール] **************************************************************************************************************************************************************
ok: [FQDN]

TASK [Upgrade] ***************************************************************************************************************************************************************
ok: [FQDN]

TASK [基本インストール] **************************************************************************************************************************************************************
ok: [FQDN]

TASK [タイムゾーンを日本時間に変更] ********************************************************************************************************************************************************
ok: [FQDN]

TASK [docker関連の削除] ***********************************************************************************************************************************************************
ok: [FQDN]

TASK [docker取得] **************************************************************************************************************************************************************
ok: [FQDN]

TASK [リポジトリの追加] **************************************************************************************************************************************************************
ok: [FQDN]

TASK [docker再インストール] *********************************************************************************************************************************************************
ok: [FQDN]

TASK [docker-composeダウンロード] **************************************************************************************************************************************************
ok: [FQDN]

TASK [docker-composeの権限変更] ***************************************************************************************************************************************************
changed: [FQDN]

PLAY RECAP *******************************************************************************************************************************************************************
FQDN : ok=14   changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

この標準出力は、結構試行錯誤したあとの物なのでほとんどがok(前回と構成変わってないよ)と出ていますが、本当の初回実行時はchenged(構成変えたよ!)と出力されます。
では実際に変更がかかったのか、みてみましょう。

ssh -i パスフレーズ user@FQDN
Warning: Identity file *** not accessible: No such file or directory.
Enter passphrase for key '/Users/ユーザ名/.ssh/id_rsa': 
Welcome to Ubuntu 18.04.4 LTS (GNU/Linux 5.3.0-1022-azure x86_64)

(機微情報が多いので中略)

Your Hardware Enablement Stack (HWE) is supported until April 2023.

*** System restart required ***
Last login: Tue Jun  2 22:58:13 2020 from 106.73.175.224
user@FQDN:~$ docker -v
Docker version 19.03.11, build 42e35e61f3
user@FQDN:~$ cd /usr/local/bin/
user@FQDN:/usr/local/bin$ docker-compose -v
docker-compose version 1.25.4, build 8d51620a
user@FQDN:/usr/local/bin$ 


無事インストールできているようですね。

さて、次回はやっとですがここからGgr〜selenoid環境構築につなげます。

ではでは。

(参考ページ)

docker-ceリポジトリが追加できず途方にくれていた時に大変参考になった。
Install Docker CE on Ubuntu using Ansible · GitHub
docker-ceのインストール時にdegradedだとすげー怒られて(冪等性とは。。?)仕方なく最新バージョンを入れました。
https://ubuntu.pkgs.org/18.04/docker-ce-test-amd64/docker-ce-cli_18.09.3~3-0~ubuntu-bionic_amd64.deb.html