Ansible

Ansible:是否可以在播放劇本而不是調試時“cat文件”並將其輸出導出到螢幕?

  • April 10, 2017

我寫了一本為每個使用者安裝和配置 Google Authenticator 的劇本。

我想要劇本的最後一步到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 }}"

知道可能是什麼問題嗎?

引用 Jinja 過濾器應該解決引用問題。像這樣使用它:

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

對於另一個問題,我不知道有一個模組可以列印該debug模組以外的語句。您可能想檢查是否將註冊的變數保存到文件是一個選項。如果您想在控制器主機上儲存 Ansible 變數,可以執行以下操作:

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

編輯我需要糾正一下自己。看看這個 serverfault question。您可以使用該callback.display函式調整 Ansible 輸出。我建議閱讀連結的部落格文章

我敢打賭,問題在於您要查找的文件中的引號不匹配,並且與 msg 中的引號混淆。也許嘗試:

- 調試:msg="{{ details.stdout_lines | regex_escape() }"

或者

- 調試:msg="{{ details.stdout_lines | regex_replace('"', '\"') }"

這應該轉義味精中的引號,以便味精周圍的引號相互匹配。

這尚未經過測試(我現在無法測試它),但您可以快速嘗試並查看。

引用自:https://serverfault.com/questions/780256