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

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

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

知道可能是什么问题吗?

答案1

引用 Jinja 过滤器应该可以解决引用问题。像这样使用:

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

对于另一个问题,我不知道除了debug模块之外还有其他模块可以打印语句。您可能需要检查保存注册变量到文件是一个选项。如果你想在控制器主机上存储 Ansible 变量,可以这样做:

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

编辑我需要稍微纠正一下。看看这个 serverfault 问题。您可以使用该callback.display函数调整 Ansible 输出。我建议阅读链接博客文章

答案2

我敢打赌,问题在于你正在处理的文件中的引号不匹配,并且与消息中的引号混淆了。也许可以尝试:

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

或者

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

这应该转义消息中的引号,以便消息周围的引号相互匹配。

这还没有经过测试(我现在还不能测试它),但你可以快速尝试一下并看看。

答案3

我深入查阅了互联网,并咨询了一些 Ansible 专业人士。

据我所知,Ansible 1.8 中没有这样的选项可以将命令的输出重定向到屏幕作为正常输出而不是调试输出。

答案4

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

如果您的身份验证文件中的“错误”文本始终以 为前导\",那么此方法(已测试)恰好有效,产生相同的输出,但用冒号代替这一字符串。

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

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

var=details.stdout_lines但是,直接在这里获取内容仍然更简单,而且更可取。

相关内容