1

鉴于以下剧本:

---
- name: "foo bar"
  hosts: localhost
  connection: local
  gather_facts: false
  vars:
    foo:
     -
       a: aa
       b: bb
     -
       a: cc
       b: dd

  tasks:
   - debug:
       msg: " filter {{foo}} to  {{ foo | json_query(query)}} "

     vars:
       bar:  ['dd','ee']
       query: "[?a == 'cc' && contains (['dd','ee'],b)]"
       #query: "[?a == 'cc' && contains ( {{bar}} ,b)]"

我想将 ansible 中定义的变量传递bar: ['dd','ee']给 jmes_path 查询,例如"[?a == 'cc' && contains ( {{bar}} ,b)]". 不幸的是,这不起作用,脚本失败。

致命的:[本地主机]:失败!=> {“failed”:true,“msg”:“字段'args'的值无效([]),无法转换为dict。错误是:期望:逗号,得到:文字:解析错误在第 28 列,标记 \"dd\" (LITERAL),用于表达式:\n\"[?a == 'cc' && contains ( [u'dd', u'ee'] ,b)]\"\ n ^\n\n错误似乎出现在“/home/vagrant/testnew/lieferschein-deployment/stack.yml”中:第 16 行第 6 列,但可能\n在文件中的其他位置,具体取决于确切的语法问题。 \n\n违规行似乎是:\n\n tasks:\n - debug:\n ^ here\n"}

但是,在查询本身中定义列表,像 inline 一样"[?a == 'cc' && contains (['dd','ee'],b)]",它可以正常工作

TASK [debug] *******************************************************************
ok: [localhost] => {
    "msg": " filter [{u'a': u'aa', u'b': u'bb'}, {u'a': u'cc', u'b': u'dd'}] to  [{u'a': u'cc', u'b': u'dd'}] "
}

是否可以将 Ansible 变量放入查询中,如果可以,如何?

4

1 回答 1

4

改变:

bar:  ['dd','ee']

至:

bar: "['dd','ee']"

否则它被定义为一个对象,但你想要一个字符串。


如果你已经定义了一个列表,你需要检查文档,找到一个合适的过滤器并修改它以满足你的需要:

要将列表连接成字符串:

{{ list | join(" ") }}
于 2017-03-09T12:57:26.690 回答