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

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

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

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

Q&A

解決済

1回答

1309閲覧

Ansible selectattrまたはselectで特定の文字列を検索して、見つかった場合には何行目だったのか確認したい

khaii21

総合スコア66

Ansible

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

0グッド

0クリップ

投稿2023/05/18 02:15

編集2023/05/18 04:25

実現したいこと

registerで取得した変数に対して、selectattrまたはselectでinstalledの文字列を検索。
もし見つかった場合、下記を確認したい

  1. installedが何行目にあったのか
  2. 任意でregisterの変数の◯◯行目の値を取得したい

こちら実現が可能なのかどうかもきちんと理解しておらず申し訳ございません。
スクリプトを作成するのではなくてplaybook内で実現させたいです。

現状思いつくやり方ですが、chk_hogeの結果を一旦ファイルに保存してから
shellモジュールを使ってUnixコマンドで結果を表示するやり方になるのですが
ファイルに保存などしないで、もっとシンプルにplaybookで出来るやり方をご存知でしたら
ご教授頂けないでしょうか。
宜しくお願い致します。

該当のソースコード

playbook

1- name: Check rpm hoge 2 ansible.builtin.yum: 3 list: hoge 4 register: chk_hoge 5 6- name: Search installed 7 ansible.builtin.debug: 8 var: "installedは◯◯行目です" 9 when: chk_hoge.results | selectattr("yumstate", "match", "installed") | list | length == 1 10or 11 when: chk_hoge.results | select("regex", "installed") | list | length == 1

下記JSON形式に見えますが、一部表記がマッチしていない出力があるためstring形式となります。
そのため、chk_hoge.results.yumstateとしても値にinstalledが取得できない状態です。

chk_hoge.resultsの内容抜粋

1     ・ 2     ・ 3     中略 4 { 5 "arch": "x86_64", 6 "envra": "1:hoge-12.0.6-1.el7.x86_64", 7 "epoch": "1", 8 "name": "hoge", 9 "release": "1.el7", 10 "repo": "hoge-stable", 11 "version": "23.0.6", 12 "yumstate": "available" 13 }, 14 { 15 "arch": "x86_64", 16 "envra": "1:hoge-12.0.6-1.el7.x86_64", 17 "epoch": "1", 18 "name": "hoge", 19 "release": "1.el7", 20 "repo": "installed", 21 "version": "23.0.6", 22 "yumstate": "installed" 23 }, 24 { 25 "arch": "x86_64", 26 "envra": "1:hoge-13.0.0-1.el7.x86_64", 27 "epoch": "1", 28 "name": "hoge", 29 "release": "1.el7", 30 "repo": "hoge-stable", 31 "version": "24.0.0", 32 "yumstate": "available" 33 } 34     ・ 35     ・ 36     中略

試したこと

下記のように shellモジュールにてコマンドを実行することで実現可能になりそうであるが、
この場合registerの結果を一旦ファイルに保存する必要があるため、もっとシンプルなやり方で実現させたいです。

- name: Keyword search ansible.builtin.shell: wc -l {{ 保存したファイル }} ; grep -rn keyword {{ 保存したファイル }} register: grep_result - name: Result command ansible.builtin.debug: var: grep_result

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

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

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

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

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

guest

回答1

0

ベストアンサー

文字列検索されたあとに何をされたいのかがわかりませんが、検索だけならば、json_query()でよいかと思います。

debug: msg: "{{ chk_hoge.results | json_query('[?yumstate==`installed`]') }}"

投稿2023/05/18 04:11

comefigo

総合スコア1051

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

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

khaii21

2023/05/18 05:17 編集

ご確認ありがとうございます。 JSON形式の取得方法を知りませんでしたでのとても勉強になりました。 説明不足で申し訳ございません。該当の変数chk_hogeですが、出力内容の一部形式がJSON型式にマッチしておらずstring型式となっています。その為、chk_hoge.results.yumstateとしても値にinstalledが取得できず悩んでおります。該当のメッセージのある箇所の行数を取得して、紐付ている他の値を行指定して取得したいと考えています。
comefigo

2023/05/18 07:05

> 出力内容の一部形式がJSON型式にマッチしておらずstring型式となっています yumモジュールのregisterはjson形式になっているかと思いますが、その一部もstringになっていますか?
khaii21

2023/05/18 08:27 編集

results配下には幾つかのkeyが存在しており、一見してJSON型式のように見受けられるのですが 全てstring型になっていました。chk_hoge以下には3階層程度まで存在していますが、直下までがJSON型式でした。
khaii21

2023/05/18 11:02

色々とご確認ありがとうございます。 yumモジュールでも正常にJSON型式として取得できるパッケージもありまして 単に私の操作方法に誤りのある可能性もあります。 ご教授頂きましたJSONへの変換を使って一旦は進めてみようと思います。 助かりました。
comefigo

2023/05/18 13:30

進められそうなので、よかったです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問