Ansible で amazon-linux-extras のリポジトリからインストールする際の簡単で冪等な書き方

Amazon Linux 2 の amazon-linux-extras を Ansible 越しに使いたい時、冪等でかつ頑張らない書き方は無いものかなと思ってました。

で、こうしました。

---
- name: install ansible
  yum:
    name: ansible
    state: present
  become: yes
  register: installed
  ignore_errors: True
  tags: ansible

- name: alternatively install ansible via amazon-linux-extras ansible2
  command: amazon-linux-extras install -y ansible2
  when: installed is failed
  become: yes
  tags: ansible

ググるとインストールタスクの前に amazon-linux-extras コマンドか yum コマンドの戻り値を解析して分岐するという話ばっかりで、そういうの Ansible でやりたくないんだよなと思ってました。
他には $ amazon-linux-extras enable する時に changed_when: False にすることで常に ok にするというやり方を見つけて、これで良いかなと一瞬思ったんですが、やはり設定が変わっているならおとなしく changed になってほしかったのです。
チームメイトが changed を想定して実行したら ok になってしまい、その調査に時間を使ったとしたらかわいそうですよね。

実行してみましょう。

1回目(ansible2 リポジトリも enabled になってないし、ansible のインストールもされていない)

TASK [Gathering Facts] ******************************************************************************************************************************************************
ok: [my-server]

TASK [ansible : install ansible] ********************************************************************************************************************************************
fatal: [my-server]: FAILED! => {"changed": false, "msg": "No package matching 'ansible' found available, installed or updated", "rc": 126, "results": ["No package matching 'ansible' found available, installed or updated"]}
...ignoring

TASK [ansible : alternatively install ansible via amazon-linux-extras ansible2] ***************************************************************************************************************
changed: [my-server]

2回目(ansible2 リポジトリが enabled で、ansible がインストールされている)

TASK [Gathering Facts] ******************************************************************************************************************************************************
ok: [my-server]

TASK [ansible : install ansible] ********************************************************************************************************************************************
ok: [my-server]

TASK [ansible : alternatively install ansible via amazon-linux-extras ansible2] ***************************************************************************************************************
skipping: [my-server]

ちなみにリポジトリが enabled だけど ansible はインストールされていない場合

TASK [Gathering Facts] ******************************************************************************************************************************************************
ok: [my-sever]

TASK [ansible : install ansible] ********************************************************************************************************************************************
changed: [my-sever]

TASK [ansible : alternatively install ansible via amazon-linux-extras ansible2] ***************************************************************************************************************
skipping: [my-sever]

おまけ。

一回 amazon-linux-extras のリポジトリからインストールすると、そのリポジトリは無効化できない?

$ amazon-linux-extras |grep ansible
NOTE: The livepatch extra is in public preview, not meant for production use

  0  ansible2=latest          enabled      \
…
$ sudo amazon-linux-extras disable ansible2
Beware that disabling topics is not supported after they are installed.
NOTE: The livepatch extra is in public preview, not meant for production use

  0  ansible2                 available    \

インストール後の disable はサポートしてないよとは書いてあるけど、出力変わったんだからなにか起こったように見える。けど、ここでさっきの playbook 流したら1つめのタスクでインストールされてしまった。

マニュアルにもサポートしないとは書いてあります。

$ man amazon-linux-extras
…
amazon-linux-extras disable topics...

       Make not-yet-installed packages invisible to YUM/DNF system. It does not un-install anything. Post-install "disable" is not supported.  (This  command  is
       discouraged except for advanced usage.)
…

……というのは自分の誤解で、disable 後に

$ sudo yum clean metadata

してなかっただけでした。

コメントする