如何从 Ansible 中的 lookup() 模块的结果中删除换行符 '\n'?

Posted

技术标签:

【中文标题】如何从 Ansible 中的 lookup() 模块的结果中删除换行符 \'\\n\'?【英文标题】:How to remove the line breaker character '\n' from the result of lookup() module in Ansible?如何从 Ansible 中的 lookup() 模块的结果中删除换行符 '\n'? 【发布时间】:2022-01-23 13:31:14 【问题描述】:

我正在使用 [file lookup] 读取整个文件并将内容存储在变量中。我的剧本是这样的:

  - name: Store foo.xml contents in a variable
    set_fact:
     foo_content: " lookup('file', 'foo.xml' ) | replace('\n', '')"

所以上面的代码读取foo.xml文件并存储在变量中,但问题是当foo.xml中有换行符时,它还包括变量中的换行符。

我的foo.xml是这个文件:

<?xml version="1.0" encoding="utf-8"?>
<initialize_param>
    <secrets>
        <my_secret id="99">3VMjII6Hw+pd1zHV5THSI712y421USUS8124487128745812sajfhsakjfasbfvcasvnjasjkvbhasdfasgfsfaj5G8A9+n8CkLxk7Dqu0G8Jclg0eb1A5xeFzR3rrJHrb2GBBa7PJNVx8tFJP3AtF6ek/F/WvlBIs2leX2fq+/bGryKlySuFmbcwBsThmPJC5Z5AwPJgGZx</my_secret>
    </secrets>
</initialize_param>

输出删除换行符 \n 但也包括制表符 \r & \t

我需要摆脱 \n ,也需要摆脱额外的格式(\r & \t),此外,在替换过滤器之后,我在触发数据库更新查询时遇到错误

stderr: /bin/sh: 1: cannot open ?xml: No such file

【问题讨论】:

我的猜测是 \n 只是调试输出的产物,并且在那里得到了正确处理。 不,它实际上将其存储为 \n ,然后当我将变量推送到数据库中时,它会引发错误: 你能澄清一下什么样的错误以及你是如何推送到数据库的吗? stderr: /bin/sh: 2: 语法错误:意外换行 请使用完整信息编辑问题,包括您的脚本、数据库信息等。给定的错误消息没有提供更多信息。 【参考方案1】:

您可以使用regex_replace 过滤器,因为trim 不会清除问题中提到的其他换行符。

"  some_stdout_to_clear | regex_replace('[\\r\\n\\t]+','') "

【讨论】:

【参考方案2】:

使用 Jinja trim 过滤器:

" lookup('file', 'foo.xml' ) | trim "

【讨论】:

哇,它成功了。我发誓我已经为此工作了好几个小时。我试图使用 uri_module 发布到服务器的 JSON 字符串中有一个尾随 \n。 replace('\n', '') 并没有摆脱它,我想,这到底是什么,我会试试这个,它成功了。啊。我认为这有多个层面的问题,但谢谢您,先生!【参考方案3】:

您可以通过replace filter 做到这一点?

contents: " lookup('file', '/etc/foo.txt') | replace('\n', '')"

【讨论】:

是的,它做到了.. 但是如果 txt 文件被替换为 .xml 怎么办.. 我可能会重新构建我的问题 我们如何在查找中使用多个替换??我正在尝试删除更多像 \r soo 这样的字符,期待这样的内容:“lookup('file', '/etc/foo.txt') | replace('\n', '') | replace(' \r', '') " 在@andreas-maier 的回答中使用 Jinja 修剪过滤器是更合适和可读的解决方案。 @RyanFisher 不,不是。 trim 删除前导和尾随字符,而 op 想要删除所有这些字符,也在中间。另请注意,自发布答案以来,该问题已被大量修改,因此可能没有太大意义。无论如何,感谢您的反对。 :) 在我的情况下 trim 过滤器会起作用(只有一个尾随换行符)。但是,我的变量是 Vault 加密的,并且 trim 没有首先解密。 replace 正确处理它(解密,然后删除换行符)。谢谢!

以上是关于如何从 Ansible 中的 lookup() 模块的结果中删除换行符 '\n'?的主要内容,如果未能解决你的问题,请参考以下文章

Ansible如何使用lookup插件模板化外部数据

Ansible自动化运维Ansible变量之lookup生成变量方法

Ansible12:lookup

Jenkins中的Ansible Playbook错误

如何从两个不同的工作表中使用 LOOKUP?

Excel关联匹配函数