AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 780256
Accepted
Itai Ganot
Itai Ganot
Asked: 2016-06-02 03:26:29 +0800 CST2016-06-02 03:26:29 +0800 CST 2016-06-02 03:26:29 +0800 CST

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

  • 772

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

知道可能是什么问题吗?

debug ansible ansible-playbook
  • 4 4 个回答
  • 65852 Views

4 个回答

  • Voted
  1. Henrik Pingel
    2016-06-03T11:21:41+08:002016-06-03T11:21:41+08:00

    引用 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 输出。我建议阅读链接的博客文章。

    • 6
  2. lsd
    2016-06-02T06:23:54+08:002016-06-02T06:23:54+08:00

    我敢打赌,问题在于您要查找的文件中的引号不匹配,并且与 msg 中的引号混淆。也许尝试:

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

    或者

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

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

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

    • 1
  3. Best Answer
    Itai Ganot
    2016-06-03T00:46:34+08:002016-06-03T00:46:34+08:00

    我深入浏览了互联网并咨询了一些 Ansible 专业人士。

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

    • 1
  4. Ryder
    2016-06-03T21:24:01+08:002016-06-03T21:24:01+08:00

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

    如果您的身份验证文件中的“坏”文本始终是前导\",那么这个(测试过的)恰好可以工作,产生几乎相同的输出,但用冒号代替这个字符串。

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

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

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

    • 0

相关问题

  • Vista cmd shell 认为是 Windows Server 2008 DEBUG

  • 帮助尝试找出 IIS7 崩溃/锁定/拒绝连接的原因

  • IIS6 网站/应用程序池可以使用的最大内存是多少?

  • 如何调试 IIS 问题,其中排队的请求突然增加并且服务器无法响应?

  • 如何对 Windows 进行故障排除?发布您的清单[关闭]

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve