kWatanabe 記事一覧へ

kWatanabe の 技術帖

某企業でOSや仮想化の研究をやっているインフラ系エンジニア。オンプレとクラウドのコラボレーションなど、興味ある技術を綴る。

RockyLinuxとCentOS/RHELで ansible_os_family の挙動が異なる件

  • CentOSRHELで問題無い 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_familyRedHat ではなく Rocky になっている。ここは、互換じゃないのか!

対応

というわけで、問題の when 句を以下のように改修した。

  when: "(ansible_os_family == 'RedHat' or ansible_os_family == 'Rocky') and server_yum_proxy is defined"

所感

  • RockyLinux は RHEL 互換だと思っていたのに、そうでもないところがあると分かった。
  • CentOS で稼働するサーバをリプレイスする際にはちゃんと検証しないとダメだ。

追記

どうやら、これは不具合らしく、この問題に対応するパッチをマージする pull request が投稿されていた。

github.com

上記の通り、私の環境は 2.9.16 (Debianのbuster-backports で提供されているもの)でのものなので、最新版では正しく RedHat となるかもしれない。

*1:時代は dnf なのは分かってるんだけど、ついつい使えるから使っちゃう。

*2:今思えば、 /etc/yum.conf の存在を確認して処理するのが正解のように思える。