web-dev-qa-db-ja.com

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

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

プレイブックの最後のステップでgoogle_authenticator設定ファイルをcatしたいと思います。

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

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 }}"

問題は何でしょうか?

22
Itai Ganot

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

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

1
Itai Ganot

引用Jinjaフィルター は引用問題を解決するはずです。次のように使用します。

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

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

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

[〜#〜] edit [〜#〜]少し修正する必要があります。 このサーバー障害の質問 を見てください。 callback.display関数を使用して、Ansible出力を微調整できます。リンクされている ブログ投稿 を読むことをお勧めします。

4
Henrik Pingel

問題は、あなたがキャットしているファイル内の引用符が一致しておらず、メッセージ内の引用符が乱れていることだと思います。多分試してください:

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

または

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

これは、メッセージ内の引用符をエスケープして、メッセージを囲む引用符が互いに一致するようにする必要があります。

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

1
lsd

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

認証ファイルの「悪い」テキストが常に先頭の\"である場合、これ(テスト済み)はたまたま機能し、ほとんど同じ出力を生成しますが、この1つの文字列の代わりにコロンが付いています。

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

これは非常に限定されたユースケースですが、google authの出力がここで厳密に定義されている場合(そしてそれが完全に可能である場合)、これで必要なことを実行できます。

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

0
Ryder