- CentOSやRHELで問題無い Ansible Playbook が RockyLinux が動かなかった
- 原因を調べると
ansible_os_family
の挙動が異なることが分かった - 【追記】この問題を修正するパッチが投稿されている模様
コトのはじまり
お手製の Ansible Playbook を Rocky Linux 8 に適用しようとしたときだった。
内容は大したことなくて、 /etc/yum.conf
*1 にプロキシ設定を加えて、パッケージをアップデートするだけのものなのだけど、CentOS8 でも RHEL8 でも動くのに RockyLinux8 では動かない。
... TASK [basicpack : YUMプロキシ設定の追加] ********************************************************************************************* changed: [centos8.local] skipping: [rocky8.local] ...
この時、RHEL系なのか、Debian系なのかを振り分けるために when
句で判断してるんだけど、その結果が false
になってしまっているようだった。
RockyLinuxは、CentOS と同じように RHEL のクローンのはずなのに、どうしてこういうことが起こるのか。
検証
検証環境
- RockyLinux 8.5
- Ansible 2.9.16
when を眺める
該当の task は以下のように実装してある。
- name: YUMプロキシ設定の追加 lineinfile: dest: /etc/yum.conf state: present regexp: '^proxy' line: 'proxy=http://{{ server_yum_proxy}}/' create: yes when: "ansible_os_family == 'RedHat' and server_yum_proxy is defined"
server_yum_proxy
は、環境ごとに切り替わる vars でプロキシサーバのホスト名とポート番号を指定するようにしている。これが定義されていて、且つ、ansible_os_family
( 参考 ) で RedHat 系列であれば*2、プロキシを通すように設定している。
RHELの時はここは RedHat
となっていた。CentOS でもずっと同じだったので、てっきり RockyLinux でも同じだと思っていた。
試してみる
動作検証用に以下のような Playbook を用意しているので、これで確認してみる。
- name: OS確認 debug: msg: "{{ ansible_distribution }}{{ ansible_distribution_version }} , {{ ansible_distribution }}{{ ansible_distribution_major_version }} , {{ ansible_distribution }} , {{ ansible_os_family }}"
結果は以下。
TASK [ping : OS確認] ********************************************************************************************************** ok: [rocky8.local] => { "msg": "Rocky8.5 , Rocky8 , Rocky , Rocky" }
なんと! ansible_os_family
が RedHat
ではなく Rocky
になっている。ここは、互換じゃないのか!
対応
というわけで、問題の when
句を以下のように改修した。
when: "(ansible_os_family == 'RedHat' or ansible_os_family == 'Rocky') and server_yum_proxy is defined"
所感
追記
どうやら、これは不具合らしく、この問題に対応するパッチをマージする pull request が投稿されていた。
上記の通り、私の環境は 2.9.16 (Debianのbuster-backports で提供されているもの)でのものなので、最新版では正しく RedHat
となるかもしれない。