アンシブルのyumモジュールで、i686とx86_64をrpmファイルを指定してインストールしたいです。片方入ると後者がok判定になる様で回避方法ご存じなら伺いたくよろしくお願いします。commandやshellは最後の手段です、。
追記 一例
cyrus-sasl-lib-2.1.26-24.el7_9
expat-2.1.0-14.el7_9
libxml2-2.9.1-6.el7_9.6
tcp_wrappers-libs-7.6-77.el7
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
下記のような質問は推奨されていません。
- 質問になっていない投稿
- スパムや攻撃的な表現を用いた投稿
適切な質問に修正を依頼しましょう。
回答3件
1
具体的なパッケージ名や依存モジュールのパッケージ名もすべて書いて頂いた方が回答が来やすいと思います。
パッケージ固有の問題の可能性もあると思います。
投稿2022/05/06 02:29
総合スコア4
0
ベストアンサー
(補足) ソースコードの主な行を抜粋
yumモジュールのソースコードを部分的に抜粋してまとめました。
python
1def main(): 2 module_implementation.run() 3 4def run(self): 5 results = self.ensure(repoquery) 6 7def ensure(self, repoq): 8 elif self.state in ('installed', 'present'): 9 res = self.install(pkgs, repoq) 10 11def install(self, items, repoq): 12 for spec in items: 13 installed_pkgs = self.is_installed(repoq, envra) 14 # envraは、rpmパッケージのepoch, name, version, release, architecture をまとめた変数です 15 16def is_installed(self, repoq, pkgspec, qf=None, is_pkg=False): 17 qf = "%{epoch}:%{name}-%{version}-%{release}.%{arch}\n" 18 cmd = [rpmbin, '-q', '--qf', qf, pkgspec] 19 rc, out, err = self.module.run_command(cmd, environ_update=lang_env) 20 # ここでrpmコマンドを実行しています。恐らく結果は以下のようになります 21 # rc=0 22 # out=(none):cyrus-sasl-lib-2.1.26-24.el7_9.i686 23 # err=warning: cyrus-sasl-lib-2.1.26-24.el7_9.i686.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY 24 # pkgspecがxxx.rpmとファイル名が指定されている場合、"xxx is not installed"という表示には絶対ならず、指定したファイルの情報が単純に出力されます 25 # 「インストール済みか否か」を調べるには、".rpm"を除いた "xxx" の部分のみをコマンドに渡して評価すべきです (ここがバグ) 26 27# ↓rc = 0, outに "is not installed" が含まれないので、ここはスルーされます 28# 本来であればi686版のrpmはインストールされていないので、ここの部分が評価され、「未インストール」扱いになってほしかったのかなと思います 29""" 30 if rc != 0 and 'is not installed' not in out: 31 self.module.fail_json(msg='Error from rpm: %s: %s' % (cmd, err)) 32 if 'is not installed' in out: 33 out = '' 34""" 35 36 pkgs += [p for p in out2.replace('(none)', '0').split('\n') if p.strip()] 37 # (none):cyrus-sasl-lib-2.1.26-24.el7_9.i686 が 0:cyrus-sasl-lib-2.1.26-24.el7_9.i686 に整形されます 38 39 return pkgs 40 41# → install()のfor文の中に戻る 42 if installed_pkgs: 43 res['results'].append('%s providing %s is already installed' % (installed_pkgs[0], package)) 44 continue 45 # ここでfor文を抜けてしまう。installed_pkgsと認識されると、インストール対象 (pkgs) から外れる 46 # ここのif文にヒットしなかった場合は、pkgs.append(pkg) される。そしてexec_install()によってyum install xxx が実行される
投稿2022/05/11 06:07
編集2022/05/11 06:24総合スコア163
下記のような回答は推奨されていません。
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
このような回答には修正を依頼しましょう。
0
cyrus-sasl-lib
でテストしましたが、問題なくアーキテクチャごとに区別してインストールできました。
パッケージ名をname.arch
という形式で指定しました。
Playbook
yml
1- hosts: test 2 gather_facts: false 3 4 tasks: 5 - name: uninstall i386 and x86_64 RPMs 6 ansible.builtin.yum: 7 name: 8 - cyrus-sasl-lib.i686 9 state: absent 10 11 - name: install i386 RPMs 12 ansible.builtin.yum: 13 name: 14 - cyrus-sasl-lib.i686 15 state: present 16 17 - name: install x86_64 RPMs 18 ansible.builtin.yum: 19 name: 20 - cyrus-sasl-lib.x86_64 21 state: present
実行結果
x86_64アーキテクチャのRPMは既に導入済みである前提です (アンインストール不可)。
その状態でi686アーキテクチャのRPMを導入できました。
TASK [uninstall i386 and x86_64 RPMs] ************************ changed: [test] => {"ansible_facts": {"discovered_interpreter_python": "/usr/libexec/platform-python"}, "changed": true, "msg": "", "rc": 0, "results": ["Removed: cyrus-sasl-lib-2.1.27-6.el8_5.i686"]} TASK [install i386 RPMs] ************************ changed: [test] => {"ansible_facts": {"pkg_mgr": "dnf"}, "changed": true, "msg": "", "rc": 0, "results": ["Installed: cyrus-sasl-lib-2.1.27-6.el8_5.i686"]} TASK [install x86_64 RPMs] *************************** ok: [test] => {"changed": false, "msg": "Nothing to do", "rc": 0, "results": []}
コントロールノードの情報
- ansible-core 2.12.5
- Python 3.9.7
- CentOS Stream 8
補足
- ご質問いただいた環境はCentOS7かRHEL7だと思いますが、私はCentOS Stream 8でテストしました。恐らく差はないと思います
name.arch
という指定方法については、man dnf
のSPECIFYING PACKAGES
セクションに書いてあります- CentOS Stream 8には
cyrus-sasl-lib.x86_64
が始めからインストールされていました。このパッケージはsudo
の依存パッケージのため、アンインストールできませんでした。従って、x86_64
は確実にOK
になってしまいます
もし回答内容が意図したものと異なるのであれば、端的なPlaybook、期待する挙動、実際の挙動を添えて返信いただければ追加で確認します。
投稿2022/05/06 09:24
編集2022/05/06 09:30総合スコア163
下記のような回答は推奨されていません。
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
このような回答には修正を依頼しましょう。
回答へのコメント
関連した質問
Q&A
解決済
【開発初心者】macでyumを使いたいのですが、上手くいきません。
回答2
クリップ8
更新
2017/11/13
Q&A
解決済
【Laradock】workspaceとプロジェクトの`python3 --version`が違う
回答2
クリップ0
更新
2022/11/06
Q&A
解決済
Centos6.7 で yum をすると[Errno 14] problem making ssl connectionとなる
回答1
クリップ1
更新
2022/01/21
Q&A
解決済
Visual Studio Code上でのエラー表示をなくす方法について
回答1
クリップ0
更新
2023/03/13
Q&A
解決済
【Shell】bashからkshに変更できない
回答1
クリップ0
更新
2023/03/26
Q&A
解決済
カレンダーモジュールが作動しないのはなぜ?
回答1
クリップ0
更新
2023/03/21
Q&A
受付中
xreaサーバーのssh接続設定について
回答1
クリップ1
更新
2023/03/30
Q&A
受付中
モジュールのビルドが失敗する。
回答0
クリップ0
更新
2022/07/06
同じタグがついた質問を見る
Ansibleは、Python で書かれたサーバーの設定を管理するための 構成管理ツールです。
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
2022/05/06 08:19