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

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

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

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

Q&A

解決済

1回答

870閲覧

Ansibleで実行結果の値を使ってコマンド実行させるには

hap_cmd

総合スコア3

Ansible

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

0グッド

0クリップ

投稿2022/09/18 05:08

編集2022/10/24 06:43

ローカルにあるファイルをリモート側のサーバに同じファイル名としてコピーした後
ファイル内容が更新された事を確認して
反映コマンドを実行させる事が目的です

前提として、下記のようなディレクトリ・ファイル構成となります
ローカル側の dir/dir-A/test リモート側の dir/dir-X/test と紐づきます
ローカル側の dir/dir-B/test リモート側の dir/dir-Y/test  と紐づきます

今、試している事として
copyモジュール実行タスクにおいてファイル内容をdiffした結果をregisterに
入れて、指定した条件と合致すれば反映コマンド実行させようとしています

例えば、msgで出力される値( result.follow )を条件として試しました dry&run結果は下記となりました

"msg": "The conditional check '{{ result.follow == false }}' failed. The error was: error while evaluating conditional ({{ result.follow == false }}): 'dict object' has no attribute 'follow'\n\nThe error appears to be in '/Users/aaaa/git/test-ansible/roles/test/tasks/copy_test.yml': line 27, column 5, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n - name: run command file\n ^ here\n"

また、registerに格納する条件を
when: result.changed == true

とすると、dir-Aとdir-B配下にあるファイルに対してコマンド実行されてしまいます

作成中のansibleは以下となります

########## copy file and run command ########## - name: copy test file copy: src: "{{ item.src }}" dest: "{{ item.dest }}" owner: root group: root mode: 0644 # backup: yes # check_mode: yes diff: yes # register: result with_items: # "{{ copy }}" - { src: dir/dir-A/test, dest: dir/dir-X/test } - { src: dir/dir-B/test, dest: dir/dir-Y/test } register: result - name: excute debug: msg: "{{ result }}" - name: run command command: /usr/sbin/script.sh args: chdir: "/etc/{{ item }}/" when: result.follow == 'false' # when: result.changed == true with_items: - dir-X - dir-Y tags: copy_test

copyモジュールで更新したファイルがあれば、更新したファイルがあるディレクトリ配下にあるファイルを対象のみに、run command実行させるにはどのようにすればよろしいかご教示願います

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

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

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

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

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

guest

回答1

0

ベストアンサー

run command のタスクの以下のようにした場合はいかがでしょうか。

yaml

1 - name: run command 2 command: /usr/sbin/script.sh 3 args: 4 chdir: "/etc/{{ item }}/" 5 when: result.results[ansible_loop.index0].changed 6 with_items: 7 - dir-A 8 - dir-B 9 loop_control: 10 extended: yes

ループのたびに、when の条件を微妙に変えるように工夫しています。
1周目のループでは、- { src: dir/dir-A/test, dest: dir/dir-X/test } のコピーが changed だったかどうか、
2周目のループでは、- { src: dir/dir-B/test, dest: dir/dir-Y/test } のコピーが changed だったかどうか、
入ります。

この仕組みにより、それぞれのコピー結果が changed かどうかによって、
対応する run command も実行するかどうかを判定しています。

when の中で、いまループの何番目か(0始まり)を参照する変数を使うために

yaml

1 loop_control: 2 extended: yes

もあわせて追記しています。

なお、お試しされていた result.changed == true の場合は、
コピーのタスクのループの中でどれか一つでも changed な場合に True 扱いになります。
結果として、コピーのタスクで dir-A だけ、または dir-B だけ changed であっても
run command のタスクでは両ディレクトリに対して実行されてしまいます。

投稿2022/09/18 08:08

編集2022/09/18 08:10
yabusakadeny

総合スコア157

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

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

hap_cmd

2022/09/20 08:47

休日の中、ご回答ありがとうございます 教示いただきました内容を記載して実行させてみました src: dir/dir-A/test, dest: dir/dir-X/test src: dir/dir-B/test, dest: dir/dir-Y/test srcの異なるdir以下のそれぞれのファイルを更新した場合は dest: dir/dir-X/test dest: dir/dir-Y/test ファイルcopyされ、その後の反映するcommand実行はされました src: dir/dir-A/testのみを更新した場合は dest: dir/dir-X/testファイルにcopyされますが、 その反映コマンドが実行されない代わりに dest: dir/dir-Y/test 側に反映コマンドが実行されてしまいました その時のログは以下になります TASK [postfix : run command] ***************************************************************************************** task path: skipping: [xxxxxxxx..com] => (item=dir-X) => { "ansible_loop": { "allitems": [ "dir-X", "dir-Y" ], "first": true, "index": 1, "index0": 0, "last": false, "length": 2, "nextitem": "dir-Y", "revindex": 2, "revindex0": 1 }, "ansible_loop_var": "item", "changed": false, "item": "dir-X", "skip_reason": "Conditional result was False" } changed: [xxxxxxxx.com] => (item=dir-Y) => { "ansible_loop": { "allitems": [ "dir-X "dir-Y" ], "first": false, "index": 2, "index0": 1, "last": true, "length": 2, "previtem": "dir-X", "revindex": 1, "revindex0": 0 }, "ansible_loop_var": "item", "changed": true, "cmd": [ "/usr/sbin/script.sh", "test" ], "delta": "0:00:00.030671", "end": "2022-09-20 17:23:15.558768", "invocation": { "module_args": { "_raw_params": "/usr/sbin/script.sh test", "_uses_shell": false, "argv": null, "chdir": "dir/dir-Y/", "creates": null, "executable": null, "removes": null, "stdin": null, "stdin_add_newline": true, "strip_empty_ends": true, "warn": false } }, "item": "dir-Y", "msg": "", "rc": 0, "start": "2022-09-20 17:23:15.528097", "stderr": "/usr/sbin/script.sh: warning: test, line 66: expected format: key whitespace value\npostmap: warning: sender, line 67: expected format: key whitespace value", "stderr_lines": [ "postmap: warning: sender, line 66: expected format: key whitespace value", "postmap: warning: sender, line 67: expected format: key whitespace value" ], "stdout": "", "stdout_lines": [] } お手数ですが、修正内容などお分かりになれば、ご教示いただけますと幸いです
yabusakadeny

2022/09/20 11:56

今一度、修正後の試した Playbook をご提示いただけますでしょうか。 私が提示した タスクが with_items: - dir-A - dir-B というループだったのに対して、 頂いたログを拝見すると with_items: - dir-X - dir-Y と設定されているかのようなログになっています。
hap_cmd

2022/10/24 06:44 編集

すみません お手数お掛けします name: run command タスク処理記載のwith_itemsに誤記がありました
hap_cmd

2022/09/21 08:10

すみません changed: [bbbbbbb.com] => (item=dir-Y) => { は changed: [aaaaaaaa.com] => (item=dir-Y) => { aaaaaaaa.comとなります
hap_cmd

2022/10/24 06:47 編集

こちらの件ですが、リモートにあるファイルのバックアップを取得後にローカルからリモートへのcopyします バックアップファイルとcopy後のファイルのchecksum文字列とを比較して バックアップファイルのchecksumと異なれば、次のtaskのcommand実行処理を行うようにしようかと考えています - name: check sender file stat: path: "/etc/{{ item }}/test" get_checksum: yes # checksum: sha1 with_items: - dir-X - dir-Y register: check_test1 - name: backup file check stat: path: "/etc/{{ item }}/test-bak" get_checksum: yes # checksum: sha1 with_items: - dir-X - dir-Y register: check_tesr2 - name: /usr/sbin/script.sh test file command: /usr/sbin/script.sh test when: check_test1.stat.checksum != check_test2.stat.checksum args: chdir: "/etc/{{ item }}/" with_items: - dir-X - dir-X
yabusakadeny

2022/10/06 12:50

せっかくご提示いただいたのに、状況を理解できなくてすみませんでした・・ 解決済とマークされたことは確認いたしました。
hap_cmd

2022/10/14 04:37

すみません ご回答頂けました内容で実現は出来ました 何か他の記述が邪魔していたのかもしれませんでしたので 綺麗にして実行しました
hap_cmd

2022/10/24 06:45

ご教示ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.45%

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

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

質問する

関連した質問