質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ansible

Ansibleは、Python で書かれたサーバーの設定を管理するための 構成管理ツールです。

Q&A

解決済

3回答

1382閲覧

ansibleのyumモジュールについて

color

総合スコア90

Ansible

Ansibleは、Python で書かれたサーバーの設定を管理するための 構成管理ツールです。

0グッド

0クリップ

投稿2022/05/06 02:07

編集2022/05/06 08:11

アンシブルの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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

具体的なパッケージ名や依存モジュールのパッケージ名もすべて書いて頂いた方が回答が来やすいと思います。
パッケージ固有の問題の可能性もあると思います。

投稿2022/05/06 02:29

mahbou3

総合スコア4

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

color

2022/05/06 08:19

ご指摘ありがとうございます。本文に追記しました。
guest

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
stopendy0122

総合スコア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 dnfSPECIFYING PACKAGESセクションに書いてあります
  • CentOS Stream 8にはcyrus-sasl-lib.x86_64が始めからインストールされていました。このパッケージはsudoの依存パッケージのため、アンインストールできませんでした。従って、x86_64は確実にOKになってしまいます

もし回答内容が意図したものと異なるのであれば、端的なPlaybook、期待する挙動、実際の挙動を添えて返信いただければ追加で確認します。

投稿2022/05/06 09:24

編集2022/05/06 09:30
stopendy0122

総合スコア163

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

color

2022/05/09 01:17

わざわざ試して頂きましてありがとうございます。 この場合だと、リポジトリから恐らく取得されてますよね。 ではなくて、ansibleでホストから、ゲストOSに rpmファイルをコピーしてそれを、yumでインストールしたいのです。 cyrus-sasl-lib-2.1.26-24.el7_9.i686.rpm 取得先: http://ftp.riken.jp/Linux/centos/7/updates/x86_64/Packages/ これをcentos7にインストールしたいのですが、 x86_64がいるのが原因みたいで、インストールがokになってi686がインストールできないんですよね。。 yumを直接叩けばいけるのですが。。ansibleがokと判断しちゃうのを回避したく、お力添え頂ければ幸いです。
stopendy0122

2022/05/11 06:44 編集

補足ありがとうございます。 ■再現しました rpmファイル名を直接指定したところ、確かに事象は再現しました (※)。  (※) x86_64の同名パッケージがインストール済みかつi386が未インストールの状態で、yumモジュールを {name: xxx_i386.rpm, state: present} で実行するとChangedではなくOKになった ■回答: shellモジュールを使うのがお手軽だと思います 結論としては、shellモジュールなどで対応できるのであればそうするのが一番楽だと思います。 yumモジュールのソースコードを見て今回の事象につながる記述を見つけました。 どうしてもということであれば、GitHub Issueを上げて挙動変更を依頼してもよいかもしれません。 また、yumモジュールのオプションでどうにかなるものでもなさそうです。 ■補足: yumモジュールがなぜOKを返すか 最後にどの部分が本事象につながっていたかを補足します。 モジュールの実行過程で、内部的に以下のコマンドを実行しているようです。 (よろしければお手元のCentOS7で実行してみてください) ``` rpm -q --qf "%{epoch}:%{name}-%{version}-%{release}.%{arch}\n" cyrus-sasl-lib-2.1.26-24.el7_9.i686.rpm rpm -q --qf "%{epoch}:%{name}-%{version}-%{release}.%{arch}\n" cyrus-sasl-lib-2.1.26-24.el7_9.x86_64.rpm ``` このコマンドはパッケージが見つからなかった場合は "package {{name}} is not installed"を標準出力し、返り値1を返します。 パッケージが見つかった場合は `--qf` に指定したフォーマットの文字列を出力し、返り値0を返します。 こんな文字列です。 `(none):cyrus-sasl-lib-2.1.26-24.el7_9.i686` モジュールが「対象のパッケージがインストール済みか」を判断するロジックは上記の標準出力と返り値を使っていました。 今回の場合はrpmに「xxx.rpm」というファイル名を指定しているので、このrpmがインストール済みか否かに関わらず必ずrpmの詳細情報が表示され、yumモジュールが「このrpmはインストール済み」と誤認しているように見えました。 結果として、今回の「OKが表示される」という事象につながっているようです。 この問題を修正するには、yumモジュールにrpmファイルを指定した場合のロジックを修正する必要があるのかなと思います。 ■ソースコード抜粋 マークダウンのフォーマットで書きたいので、別回答として記述します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問