Ansibleで特定の出力エラー文字列を無視して成功したと見なす方法

Ansibleで特定の出力エラー文字列を無視して成功したと見なす方法

次のエラーメッセージと一緒にプレイブック出力の特定のエラーメッセージを無視しようとしています。

致命的:[192.168.0.1]:失敗しました! => {"changed": false, "failed": true, "msg": "SSL/TLS なしでプレーンテキストでパスワードを送信することは非常に安全ではありません。 Query == CHANGE MASTER TO ['MASTER_HOST= %(master_host) s' , 'MASTER_USER=%(master_user)s', 'MASTER_PASSWORD=%(master_password)s', 'MASTER_LOG_FILE=%(master_log_file)s', 'MASTER_LOG_POS=%(master_log_pos)s']"}

> Task: 
> - name: Setup Replication   
    become: true   
    mysql_replication:
>      login_host: "{{ slave_ip }}"
>      login_user: "user"
>      login_password: "***"
>      mode: changemaster
>      master_host: "{{ master_ip }}"
>      master_log_file: mysql-bin.000001
>      master_log_pos: 107
>      master_user: "{{ mysql_replicator_user }}"
>      master_password: "{{ mysql_replicator_password }}"

ラッキーですか?この目標を達成する方法は?

編集:Marcoの答えへの答え - さて、それは問題です。どのエラーが発生するのかわかりません。ただし、エラーメッセージに「SSLなしでプレーンテキストでパスワードを送信する」が含まれている場合は無視し、他のエラーでない限り無視しないでください。簡単に説明すると、「エラーメッセージに-> 'null'またはSSLが含まれていない場合は例外が発生します。」

答え1

Ansibleにはエラー処理のためのいくつかのオプションがあります。ignore_errors: yesジョブで属性を使用できます。すべてのエラーを無視したくない場合は、次のようにエラーを構成する要素を正確に指定できます。

- name: task name
  module: arguments ...
  register: out
  failed_when: 'error message' in out.stderr 

より複雑な障害チェックを追加するには、次のようにエラー処理を別のタスクに分割できます。

- name: test
  shell: echo error; exit 123
  register: out
  ignore_errors: yes

- fail: msg="{{ out.stdout }}"
  when: "out.rc != 0 and 'error' not in out.stdout"

この例では、最初のジョブはコード123で失敗し、標準出力に「error」を出力します。これは登録されますが無視されます。 2番目の操作は出力値を分析し、戻りコードがゼロではなく標準出力に "error"文字列が含まれていない場合にのみ失敗します。

Ansibleドキュメントから詳細を読むことができます。https://docs.ansible.com/ansible/playbooks_error_handling.html

答え2

Ignore_errorsが単なる例/いいえ確認ではないことを心から願っています。これは私たちの生活をはるかに単純にします。最近、私はこの素晴らしいトリックを見つけました。このアプローチを使用すると、特定の既知の出力を無視できます。この例では、Sending passwords in plain text without SSL登録された変数でテキストを探しています。テキストが見つかるとゼロと評価されます。その後、-1文字列が見つからない場合は、 find 関数の戻りコードと比較します。最終0 == -1的にFalse私たちの状況はfailed_when: False

一方、文字列が見つからない場合、式は次のようになります。-1 == -1=>failed_when: Trueモジュールのデフォルトの失敗動作をオーバーライドするので、この方法を使用するときは注意してください。したがって、終了コードなどの複数の条件を組み合わせるのが最善です。

- name: Risky task
  command: echo "Sending passwords in plain text without SSL"
  register: result
  changed_when: false
  failed_when:
    # returns -1 if string not found
    - result.stdout.find("Sending passwords in plain text without SSL") == -1
    # best to combine additional checks like return code
    - result.rc != 0

result.stdout.find("Sending passwords in plain text without SSL") != 0or のようなものが使えそうですが、'"Sending passwords in plain text without SSL" not in result.stdout'二重不正文は理解するのが少し難しいでしょう。

関連情報