Ansible
Ansible:是否可以在播放劇本而不是調試時“cat文件”並將其輸出導出到螢幕?
我寫了一本為每個使用者安裝和配置 Google Authenticator 的劇本。
我想要劇本的最後一步到
cat
google_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('"', '\"') }"
這應該轉義味精中的引號,以便味精周圍的引號相互匹配。
這尚未經過測試(我現在無法測試它),但您可以快速嘗試並查看。