Ansible:是否有可能“猫文件”,并将其输出到屏幕上,而不是作为debugging?

我写了一个安装和configuration每个用户的Google身份validation器的手册。

我希望playbook的最后一步捕获google_authenticatorconfiguration文件。

使用“debugging”模块,我能够获得数据显示在屏幕上,但只能作为debugging消息:

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

任何想法可能是什么问题?

引用Jinjafilter应该解决报价问题。 像这样使用它:

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

对于另一个问题,我不知道一个模块打印debug模块以外的语句。 您可能想要检查保存注册variables文件是一个选项。 如果你想在控制器主机上存储Ansiblevariables,可以这样做:

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

编辑我需要纠正自己一点。 看看这个服务器错误的问题 。 您可以使用callback.display函数来调整Ansible输出。 我build议阅读链接的博客文章 。

我敢打赌,问题是你正在抓的文件中的引号是不匹配的,并与味精中的引号混淆。 也许尝试:

 -  debug:msg =“{{details.stdout_lines | regex_escape()}”

要么

 -  debug:msg =“{{details.stdout_lines | regex_replace('”','\'')}“

这应该在msg中转义引号,以便msg周围的引号将相互匹配。

这还没有经过testing(我现在无法testing它),但是你可以真正快速地尝试一下,看看。

我已经通过互联网深入了解,并与一些Ansible专业人员检查。

据我所知,在Ansible 1.8中没有这样的选项将命令的输出作为正常输出而不是debugging输出redirect到屏幕上。

我对上面的文本块进行了一些testing – 将其放入到位,并使用details.stdout_lines清除了添加的json引号。

如果auth文件中的'bad'文本始终是一个前导\" ,那么这个(testing)恰好工作,产生很多相同的输出,但冒号取代了这一个string。

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

现在这是一个非常有限的用例,但是如果谷歌authentication输出在这里是严格定义的(这是完全可能的),那么这应该做你想要的。

但是,它仍然会更容易,最好使用var=details.stdout_lines来获取这里的内容。