Ansible 在 ansible-playbook 的 varibale 中传递 json --extra-vars=

use*_*898 3 json ansible

我尝试将 JSON 结构传递到 ansible-playbook 中,但没有成功:这是我尝试传递的命令

ansible-playbook --extra-vars='[{\"${foo1}\": \"somevalue1\", \"${foo2}\": \"somevalue2\"}, {\"${zoo1}\": \"somevalue111\", \"${zoo2}\": \"somevalue222\"}]' test.yml 
Run Code Online (Sandbox Code Playgroud)

出现错误:

ERROR! Syntax Error while loading YAML.
  expected ',' or '}', but got '{'
Run Code Online (Sandbox Code Playgroud)

或这个 :

ansible-playbook --extra-vars='[{"${foo1}":"somevalue1","${foo2}":"somevalue2"},{"${zoo1}":"somevalue111","${zoo2}":"somevalue222"}]' test.yml
Run Code Online (Sandbox Code Playgroud)

没有输出

理想的方法是将 JSON 传递到这样的变量中,这样我就可以在 ansible 中迭代 json 数组:

ansible-playbook --extra-vars="AAA='[{\"${foo1}\": \"somevalue1\", \"${foo2}\": \"somevalue2\"}, {\"${zoo1}\": \"somevalue111\", \"${zoo2}\": \"somevalue222\"}]'" test.yml
  
Run Code Online (Sandbox Code Playgroud)

有了这个剧本:

---
-
  gather_facts: false
  hosts: localhost
  name: test
  tasks:
    - name: debug
      debug:
        msg: "{{ AAA }}"
 
Run Code Online (Sandbox Code Playgroud)

输出是:

ok: [localhost] =>
  msg:
  - ? ''
    : somevalue2
  - ? ''
    : somevalue222
Run Code Online (Sandbox Code Playgroud)

简而言之,在不使用文件的情况下将 JSON 结构传递到 ansible 中的最佳方法是什么?

mda*_*iel 5

我不明白为什么你要转义字符串"的内部',但你会想要放弃KEY=VALUE语法,因为在这种形式下,ansible在空格上进行分割——通过以 开头,{它会通知 ansible --extrav- vars 实际上是 JSON 并且停止使用键值解析器

ansible -e '{"AAA": [{"hello":{"world": true}}, {"array":{"yup":"forsure"}}]}' -m debug -a var=AAA localhost
Run Code Online (Sandbox Code Playgroud)

产生

localhost | SUCCESS => {
    "AAA": [
        {
            "hello": {
                "world": true
            }
        },
        {
            "array": {
                "yup": "forsure"
            }
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)