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
してなかっただけでした。