Ansible:デバッグとしてではなく、プレイブックの再生中に「catファイル」を作成して出力を画面にエクスポートできますか?


22

ユーザーごとにGoogle認証システムをインストールして構成するプレイブックを作成しました。

catgoogle_authenticator構成ファイルへのプレイブックの最後のステップが必要です。

「デバッグ」モジュールを使用すると、画面にデータを表示できますが、デバッグメッセージとしてのみ取得できます。

TASK: [debug var=details.stdout_lines] ****************************************
ok: [localhost] => {
    "details.stdout_lines": [
        "ZKMFTE2ADYA2OYCH",
        "\"RATE_LIMIT 3 30",
        "\" DISALLOW_REUSE",
        "\" TOTP_AUTH",
        "12920994",
        "88224784",
        "69464205",
        "38144121",
        "45634120"
    ]
}

私はそのようなことができるとオンラインで読みました:

  - name: Print to screen google authenticator details
    command: /bin/cat {{ google_authenticator_secret_file_location }}
    register: details
    tags: google_2fa_user

  - debug: msg="{{ details.stdout_lines }}"

しかし、実行するとエラーが発生します。

TASK: [Print to screen google authenticator details] **************************
changed: [localhost]

TASK: [debug msg="{{details.stdout_lines}}"] **********************************
fatal: [localhost] => Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/ansible/runner/__init__.py", line 532, in _executor
    exec_rc = self._executor_internal(host, new_stdin)
  File "/usr/lib/python2.7/dist-packages/ansible/runner/__init__.py", line 629, in _executor_internal
    return self._executor_internal_inner(host, self.module_name, self.module_args, inject, port, complex_args=complex_args)
  File "/usr/lib/python2.7/dist-packages/ansible/runner/__init__.py", line 815, in _executor_internal_inner
    result = handler.run(conn, tmp, module_name, module_args, inject, complex_args)
  File "/usr/lib/python2.7/dist-packages/ansible/runner/action_plugins/debug.py", line 41, in run
    kv = utils.parse_kv(module_args)
  File "/usr/lib/python2.7/dist-packages/ansible/utils/__init__.py", line 526, in parse_kv
    vargs = [x.decode('utf-8') for x in shlex.split(args, posix=True)]
  File "/usr/lib/python2.7/shlex.py", line 279, in split
    return list(lex)
  File "/usr/lib/python2.7/shlex.py", line 269, in next
    token = self.get_token()
  File "/usr/lib/python2.7/shlex.py", line 96, in get_token
    raw = self.read_token()
  File "/usr/lib/python2.7/shlex.py", line 172, in read_token
    raise ValueError, "No closing quotation"
ValueError: No closing quotation


FATAL: all hosts have already failed -- aborting

PLAY RECAP ********************************************************************

エラーには、引用符で囲まれていますが、「閉じ引用符なし」と表示されます。また試してみました:

 - debug: msg= "{{ details.stdout_lines }}"

何が問題になる可能性がありますか?

回答:


3

引用神社フィルタは、引用問題を解決する必要があります。次のように使用します。

  - debug: msg="{{ details.stdout_lines | quote }}"

他の質問については、モジュール以外のステートメントを出力するモジュールを知りませんdebug登録された変数をファイルに保存するオプションがあるかどうかを確認することができます。コントローラホストにAnsible変数を保存する場合、次のようなことができます。

- local_action: copy content={{ details.stdout_lines }} dest=/path/to/destination/file

編集自分で少し修正する必要があります。このserverfaultの質問を見てください。このcallback.display関数を使用して、Ansible出力を調整できます。リンクされたブログ投稿を読むことをお勧めします。


1

問題は、cat'ingしているファイル内の引用符が一致せず、msg内の引用符が乱れていることでしょう。たぶん試してみてください:

-デバッグ:msg = "{{details.stdout_lines | regex_escape()}"

または

-デバッグ:msg = "{{details.stdout_lines | regex_replace( '"'、 '\ "')}"

これにより、msg内の引用符がエスケープされ、msgを囲む引用符が互いに一致します。

これはテストされていません(私は今すぐテストする立場にありません)が、実際にすばやく試してみることができます。


両方試してみました...うまくいきませんでした。
イタイガノ16年

うーん、私は上記の私の提案なしにそれを実行しましたが、最初と同じ出力を得ました。しかし、デバッグ用の独自のログモジュールを記述したり、シェルやperlスクリプトなどにパイプすることなく、デバッグ以外の形式で取得できるようには見えません。このリンクには良い答えがありましたstackoverflow.com/questions/28564811/…–
lsd

1

私はインターネットを詳しく調べ、Ansibleの専門家に確認しました。

私の知る限り、Ansible 1.8には、コマンドの出力をデバッグ出力ではなく通常の出力として画面にリダイレクトするようなオプションはありません。


2
Ansible 2.2に関しては、デバッグを使用する以外に画面に印刷するオプションはまだありません。
イタイガノ

0

上記のテキストブロックに対していくつかのテストを実行しました。所定の場所にドロップし、details.stdout_linesを使用して追加されたJSON引用符を削除しました。

authファイルの「悪い」テキストが常に先頭にある\"場合、この(テスト済みの)動作するだけで、ほぼ同じ出力が生成されますが、この1つの文字列の代わりにコロンが使用されます。

- debug: msg="{{ details.stdout.replace('\\"',':').split('\n') }}"

これは非常に限られたユースケースですが、google authの出力がここで厳密に定義されている場合(それが完全に可能である場合)、これはあなたが望むことをするはずです。

ただし、var=details.stdout_linesここでコンテンツを取得するために使用する方が簡単であり、望ましいでしょう。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.