【问题标题】:How to convert dict or list to string in ansible如何在ansible中将字典或列表转换为字符串
【发布时间】:2021-01-10 19:26:25
【问题描述】:

播放:

  - set_fact:
      irules: "{{ rule | json_query('[*].definition') }}"
  - debug:
      msg: "{{ irules }}"

输出:

"msg": [
    "when HTTP_REQUEST {\n    switch -glob [HTTP::uri] {\n    \"*HAC*\" { pool char.hr.cal.ed.ABC.pool }\n        \n     }\n}"
]

}

我希望输出采用以下格式。

预期输出:

"when HTTP_REQUEST {
     switch -glob [HTTP::uri] {
     "*HAC*" { pool char.hr.cal.ed.ABC.pool }   
 }

我曾尝试将“from_json”解析为上述播放,结果报错:

"({{ rule | json_query('[*].definition') | from_json }}): the JSON object must be str, bytes or ``bytearray, not 'list'"}" 

有没有办法在 ansibe 中将列表转换为字符串? 如果没有,任何其他建议将不胜感激以实现“预期输出”`

【问题讨论】:

  • 您能否准确指出您在definition 变量的实际内容中看到列表/字典的 yaml 或 json 表示的位置?从我所看到的最好的情况来看,您可以将该字符串拆分为新行,以将其输出为应该更具可读性的行列表:msg: "{{ irules.split('\n') }}"。除非您找到能够解析特定语言/表示的模块/过滤器。
  • 感谢您的回复 { "msg": [ { "definition": "when HTTP_REQUEST {\n switch -glob [HTTP::uri] {\n \"*HAC*\" {池 char.hr.cal.ed.HAC.pool }\n \n }\n}", ] }
  • 我尝试使用 msg: "{{ irules.split('\n') }}" 进行拆分,结果出现错误。该任务包括一个带有未定义变量的选项。错误是:“列表对象”没有属性“拆分”\n\n
  • 好的,知道了。那么它应该是msg: "{{ irules[0].split('\n') }}".... 或者您必须使用能够理解该语言/表示的过滤器来解析每个列表元素。

标签: json ansible


【解决方案1】:

Ansible 的模块debug 无法打印回车。它总是逃避它们(将它们转换为\n)。这就是为什么您的调试打印消息中有许多 \n

我知道输出多行变量的唯一选择是使用pause 模块:

- pause:
    seconds: 1
    prompt: "{{ irules[0] }}"

更详细的答案here可以提供帮助。

【讨论】:

  • 非常感谢吉恩。我能够以预期的格式打印。有没有办法将打印的内容存储在变量中。我必须将该内容复制到一个文件中并在该文件中添加几行额外的行,并且必须将该配置内容应用于防火墙。如果您需要任何信息,请立即告诉我
  • 你的变量内容已经很好了。它包含您想要的回车。您已经可以将变量内容写入文件。
  • 我使用了 split msg: "{{ irules[0].split('\n') }}" 并复制到文件中,文件中存储的内容为:["when HTTP_REQUEST { ", " switch -glob [HTTP::uri] {", " \"*HAC*\" { pool char.hr.cal.ed.HAC.pool }", " ", " }", "}"]我想从文件中删除字符 [ 和 " 和 \ 并将其格式设置为类似于预期的输出..
猜你喜欢
  • 2015-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-11
  • 2011-07-12
  • 2014-05-23
相关资源
最近更新 更多