Ansible:是否可以在播放剧本时将“ cat文件”“ cat文件”并将其输出导出到屏幕,而不是作为调试?


22

我写了一部剧本,每个用户都可以安装和配置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 }}"

知道可能是什么问题吗?

Answers:


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

我敢打赌,问题在于您所关注的文件中的引号不匹配,并且与味精中的引号混淆。也许尝试:

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

要么

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

这应转义味精中的引号,以便味精周围的引号将彼此匹配。

尚未对此进行测试(我现在无法对其进行测试),但是您可以真正地快速尝试并查看。


都试过了...没有用。
Itai Ganot

嗯,我只是在没有上面我的建议的情况下运行了它,并获得了与开始时相同的输出。但是,它似乎并没有以除调试以外的其他格式获得,而无需编写自己的日志模块以获取ansible或管道传输到Shell或perl脚本等。此链接有一个很好的答案stackoverflow.com/questions/28564811/…–
lsd

1

我已经在互联网上进行了深入调查,并与Ansible专业人员进行了核对。

据我了解,Ansible 1.8中没有这样的选项可以将命令的输出重定向到屏幕上,而不是调试输出。


2
至于Ansible 2.2,除了使用debug之外,没有其他选择可以打印到屏幕上。
Itai Ganot

0

我对上面的文本块进行了一些测试-将其放到适当的位置,并使用details.stdout_lines清除了添加的json引号。

如果您的auth文件中的“坏”文本始终是前导\",则此(已测试)恰好起作用,产生的输出几乎相同,但用冒号代替了一个字符串。

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

现在这是一个极其有限的用例,但是如果在这里严格定义了google auth输出(完全有可能是这种情况),那么这应该做您想要的。

但是,它仍然会更容易使用,并且更可取的是只使用var=details.stdout_lines此处的内容。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.