自宅鯖を冗長化したはなしで少し書いたけれど、非対称、つまりプライマリとセカンダリになっている拙宅の場合、プライマリでRPMパッケージをインストール、削除した場合、自動的にセカンダリでも同じ状態になって欲しい。この目的のためにはdnfのpost-transaction-actions
(パッケージはpython3-dnf-plugin-post-transaction-actions
)を使えば良いのだけれど、.action
ファイルの書式は以下のようになっている。
package_filter:transaction_state:command
んで、2台のRPMパッケージを同期させる、つまり192.168.1.2でdnfを実行したら192.168.1.3でも同じinstall/update/removeを実行するには
*:any:if [ "${state}" = "install" -o "${state}" = "update" -o "${state}" = "remove" ]; then ssh 192.168.1.3 'dnf -y ${state} ${name}' >> /var/log/rpmstore/rpmsync.log; fi
という風に書かないとならない。これを/etc/dnf/plugins/post-transaction-actions.d/rpmsync.action
として放り込んでおけば、動くことは動く。
/usr/lib/python3.6/site-packages/dnf-plugins/post-transaction-actions.py
を見れば分かることだけれど、単に設定ファイルを”:”でsplit()しているだけだし、transaction_state
はin/out/anyしかとれずstateによって動作を分けることが出来ないため、汚いif文を書かざるを得ない。”command”部分は単にsubprocess.Popen(shell=True)
してるだけなのでこれで動くことは動くのだけれど。
“transaction_state”を以下のように書ければもっと便利なんだが、コードを見るとあくまで”transaction_state”という位置づけっぽく、PRしても機能追加にはならなそう。
*:install,remove,update:command