我写了一本为每个用户安装和配置 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
模块以外的语句。您可能想检查是否将注册的变量保存到文件是一个选项。如果您想在控制器主机上存储 Ansible 变量,可以执行以下操作:编辑我需要纠正一下自己。看看这个 serverfault question。您可以使用该
callback.display
函数调整 Ansible 输出。我建议阅读链接的博客文章。我敢打赌,问题在于您要查找的文件中的引号不匹配,并且与 msg 中的引号混淆。也许尝试:
或者
这应该转义味精中的引号,以便味精周围的引号相互匹配。
这还没有经过测试(我现在无法测试它),但你可以快速尝试一下。
我深入浏览了互联网并咨询了一些 Ansible 专业人士。
据我了解,Ansible 1.8 中没有这样的选项可以将命令的输出重定向到屏幕作为正常输出而不是调试输出。
我对上面的文本块进行了一些测试——将其放置到位并清除使用 details.stdout_lines 添加的 json 引号。
如果您的身份验证文件中的“坏”文本始终是前导
\"
,那么这个(测试过的)恰好可以工作,产生几乎相同的输出,但用冒号代替这个字符串。现在这是一个极其有限的用例,但是如果此处严格定义了 google auth 输出(并且完全有可能是这种情况),那么这应该可以满足您的要求。
但是,它仍然会更容易,并且最好使用
var=details.stdout_lines
在这里获取内容。