GMO NIKKOのT.Kです。
AlmaLinuxのブログ記事によると、GPG keyが更新されており、新しいGPG keyをインポートする必要がありました。先日Ansibleで下記のタスクを追加したものの、インポートが適切に行われない問題が発生しました。
1 2 3 4 |
- name: import RPM-GPG-KEY-AlmaLinux rpm_key: key: https://repo.almalinux.org/almalinux/RPM-GPG-KEY-AlmaLinux state: present |
問題の原因としては、AlmaLinuxのGPG keyファイルに新旧のGPG keyが混在しており、rpm_keyモジュールのインポート済みチェックが最初のGPG keyのみに対して行われているからです。
2023年10月16日以降のパッケージに関しては新しいGPG keyが取り込まれていますので、追加でインポートする必要はありません。
Dockerで再現環境を構築
- ファイル構成
123456789.├── ansible│ ├── hosts│ └── setup.yml├── controller│ └── Dockerfile├── target│ └── Dockerfile└── docker-compose.yml - ansible
- hosts
12[servers]target - setup.yml
12345678910---- name: Testhosts: serversuser: roottasks:- name: import RPM-GPG-KEY-AlmaLinuxrpm_key:key: https://repo.almalinux.org/almalinux/RPM-GPG-KEY-AlmaLinuxstate: present
- hosts
- controller
- Dockerfile
1234567891011FROM almalinux:8.9# sshクライアントをインストールRUN yum -y install openssh-clients# ansibleをインストールRUN yum -y install python3.11RUN yum -y install python3.11-pipRUN python3.11 -m pip install ansibleCMD /sbin/init
- Dockerfile
- target
- Dockerfile
12345678910111213141516171819FROM almalinux:8.9# 公開鍵なし/パスワードなしでSSHログインする設定RUN yum -y install openssh-serverRUN sed -ri 's/^#PermitEmptyPasswords no/PermitEmptyPasswords yes/' /etc/ssh/sshd_configRUN sed -ri 's/^#PermitRootLogin yes/PermitRootLogin yes/' /etc/ssh/sshd_configRUN sed -ri 's/^UsePAM yes/UsePAM no/' /etc/ssh/sshd_configRUN yum install -y passwdRUN passwd -d root# sshdの起動RUN /bin/systemctl enable sshdEXPOSE 22# 環境を再現するため、AlmaLinux 8の新しいGPG keyを削除しますRUN rpm -e gpg-pubkey-ced7258b-6525146fCMD /sbin/init
- Dockerfile
- docker-compose.yml
1234567891011version: '3'services:controller:build: ./controller/privileged: truevolumes:- "./ansible:/ansible"target:build: ./target/privileged: true
Dockerコンテナを起動して動作確認
- コンテナ起動
1$ docker-compose up -d --build - Ansibleの実行
changedがfalseでGPG keyが更新されませんでした
12345678$ cd ansible$ ansible-playbook -i ./hosts ./setup.yml -k -v〜 中略 〜TASK [import RPM-GPG-KEY-AlmaLinux] ************************************************************************************************************ok: [target] => {"changed": false}PLAY RECAP *************************************************************************************************************************************target : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 - targetで確認してもインポートされていないことが分かります
12$ rpm -q gpg-pubkey-ced7258b-6525146fpackage gpg-pubkey-ced7258b-6525146f is not installed
対策
- 案1
- 一旦削除してからインポートします
ただし、毎回changedになるため、あまりおすすめできません
123456789- name: delete RPM-GPG-KEY-AlmaLinuxrpm_key:key: https://repo.almalinux.org/almalinux/RPM-GPG-KEY-AlmaLinuxstate: absent- name: import RPM-GPG-KEY-AlmaLinuxrpm_key:key: https://repo.almalinux.org/almalinux/RPM-GPG-KEY-AlmaLinuxstate: present
- 一旦削除してからインポートします
- 案2
- GPG keyファイルを分割し、個別にインポートします
123456789101112131415- name: copy RPM-GPG-KEY-AlmaLinuxcopy:src: "almalinux/{{ item }}"dest: /etc/rpm-gpg/with_items:- RPM-GPG-KEY-AlmaLinux-3abb34f8- RPM-GPG-KEY-AlmaLinux-ced7258b- name: import RPM-GPG-KEY-AlmaLinuxrpm_key:key: '/etc/rpm-gpg/{{ item }}'state: presentwith_items:- RPM-GPG-KEY-AlmaLinux-3abb34f8- RPM-GPG-KEY-AlmaLinux-ced7258b - GPG keyファイルの分割
テキストファイルなので手動でも問題ありませんが、コマンドを作成しました
1234567wget https://repo.almalinux.org/almalinux/RPM-GPG-KEY-AlmaLinuxgpg --no-default-keyring --keyring ./tempkeyring.gpg --import RPM-GPG-KEY-AlmaLinuxgpg --no-default-keyring --keyring ./tempkeyring.gpg --list-keys --with-colons | awk -F: '/^pub:/ { print tolower($5) }' | while read keyid; dogpg --no-default-keyring --keyring ./tempkeyring.gpg --armor --export $keyid > RPM-GPG-KEY-AlmaLinux-${keyid: -8};done - 生成したファイルをansible/files/almalinuxに配置します
123456.├── ansible│ ├── files│ │ └── almalinux│ │ ├── RPM-GPG-KEY-AlmaLinux-3abb34f8│ │ └── RPM-GPG-KEY-AlmaLinux-ced7258b
- GPG keyファイルを分割し、個別にインポートします
まとめ
とある事情でAlmaLinuxの古いバージョンを使用する必要があり、今回の問題に遭遇しました。
ミドルウェアなどでも古いバージョンに起因する問題により、調査と対策に時間が取られることが多いため、バージョンアップを計画的に行っていきたいと考えております。