🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ansible

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

Q&A

解決済

1回答

1476閲覧

Ansibleでコマンド実行結果(メッセージ内容)によって結果を条件分岐したい。

bananalove

総合スコア2

Ansible

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

0グッド

0クリップ

投稿2020/11/24 07:42

編集2020/11/24 08:16

前提・実現したいこと

パッチのインストールを実行するときに既にインストール済みのホストの場合は「OK」、未インストールホストにインストールできた場合は「changed」、インストール失敗した場合は「FAILED」としたい。

発生している問題・エラーメッセージ

fatal: [node01]: FAILED! => {"changed": false, "cmd": ["sh", "install.sh"], "delta": "0:00:01.709752", "end": "2020-11-24 16:13:06.643825", "msg": "non-zero return code", "rc": 1, "start": "2020-11-24 16:13:04.934073", "stderr": "", "stderr_lines": [], "stdout": "Check system ......\nStarting to install package. Please wait.\nThe current installation of ServerProtect on your system is splx-3.0-sp1-patch8-1.0-1575.x86_64.\nPackage has been installed. Install process exits.", "stdout_lines": ["Check system ......", "Starting to install package. Please wait.", "The current installation of ServerProtect on your system is splx-3.0-sp1-patch8-1.0-1575.x86_64.", "Package has been installed. Install process exits."]}

該当のソースコード

ansible

1- name: install criticalpatch 2 command: sh install.sh 3 register: patch_result 4 args: 5 chdir: /tmp/splx/splx_30_lx_en_criticalpatch1633 6 changed_when: '"Package has been installed. Install process exits." not in patch_result.stdout'

補足情報

既にパッチがインストール済みの場合、実行すると下記メッセージが返ってきます。

[root@node01 splx_30_lx_en_criticalpatch1633]# ./install.sh Check system ...... Starting to install package. Please wait. The current installation of ServerProtect on your system is splx-3.0-sp1-patch8-1.0-1575.x86_64. Package has been installed. Install process exits. [root@node01 splx_30_lx_en_criticalpatch1633]#

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

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

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

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

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

guest

回答1

0

ベストアンサー

シェルを実行されているようですので、必ずchangedかfailedになるかと思います。
failedになるには、install.sh内で条件判定して頂いて、exit 1(0以外)だとエラー扱いになります。
ただ、okのステータスはシェル実行の戻り値では実現できないと思われます。

強制的にchangedを発生しない方法もあるので、ご参考までにどうぞ。
https://qiita.com/ryurock/items/639e5f7e49d25c3b6d75

投稿2020/11/24 13:00

comefigo

総合スコア1051

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

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

bananalove

2020/11/27 02:53

シェルを実行すると必ずchangedかfailedになるのですね。changed_whenではなくfailed_whenを使って該当のメッセージが出力されていない場合はfailedにするという処理にしました。 ご回答ありがとうございました。
comefigo

2020/11/27 04:16

shellモジュールだと残念ながら冪等性は実行するシェルスクリプト内で担保しなければならないです。なので、余裕があればシェルスクリプト内の処理をAnsibleモジュールに置き換えることでより安心できる処理になると思います。 また、自作モジュールも簡単で実装できるので、検討してみてはいかがでしょうか。 https://dev.classmethod.jp/articles/ansible-develop-module-basis/
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問