如何在ansible中将寄存器值存储为dict?

时间:2017-10-13 04:25:43

标签: python ansible

我试图转换字符串

来自"{ip: 10.213.151.76, mask: 255.255.252.0},{ip: 10.213.151.799, mask: 255.255.252.0}"

[{ip: 10.213.151.76, mask: 255.255.252.0}, {ip: 10.213.151.76, mask: 255.255.252.0}]

Playbook code

- hosts: localhost
  vars:
    - vari: "[{ip: 10.213.151.76, mask: 255.255.252.0},{ip: 10.213.151.799, mask: 255.255.252.0}]"
    - foo: []
  tasks:
    - set_fact: testing={{vari[1:-1] | regex_findall('\{(.*?)\}')}}
#    - set_fact: testing={{vari[1:-1]}}
    - debug: var=testing
    - name: run my script!
      command: python ../test.py  "{{item}}"
      delegate_to: 127.0.0.1
      register: hash
      with_items: "{{testing}}"
    - debug: var=hash
    - set_fact: foo={{foo + item.stdout_lines}}
      with_items: "{{hash.results}}"
    - debug: var=foo

pyhon脚本,它将字符串转换为字典。

#!/usr/bin/python
import sys
import json
ip_str = str(sys.argv[1])
print dict(s.split(': ') for s in (ip_str.split(', ')))

当前 foo 变量值就是这样。

ok: [localhost] => {
    "foo": [
        "{'ip': '10.213.151.76', 'mask': '255.255.252.0'}",
        "{'ip': '10.213.151.799', 'mask': '255.255.252.0'}"
    ]
}

基本上,我希望这个值在哈希格式列表中:[{ip:10.213.151.76,mask:255.255.252.0},{ip:10.213.151.76,mask:255.255.252.0}]。

Python脚本将值作为字典返回,但是寄存器将其存储为字符串。 ansible无法将其转换为dictonary。

有任何帮助吗?在此先感谢。

1 个答案:

答案 0 :(得分:0)

为了记录,如果这是复杂的,我认为你应该考虑重新设计。然而...

你可以在一个剧本中写一个变量文件,并在下一个节目中阅读。

- name: dynamic vars file write test
  hosts: localhost
  gather_facts: no
  tasks:
    - name: write it
      shell: ' echo "foo: bar">tst.yml '

- name: dynamic vars file read test
  hosts: localhost
  gather_facts: no
  vars_files:
   - tst.yml
  tasks:
   - name: read it
     debug:
       msg: "{{foo}}"

哪个输出:

PLAY [dynamic vars file write test]   
********************************************

TASK [write it]
********************************************
changed: [localhost]

PLAY [dynamic vars file read test]     
********************************************

TASK [read it]
********************************************
ok: [localhost] => {
    "changed": false,
    "msg": "bar"
}

这使得格式化和解析变得更容易,至少对我而言。