从远程主机上的JSON文件中读取变量,并将其用作ansible剧本中任务的条件

时间:2019-01-23 19:06:00

标签: json variables ansible

我在hostA上有一堆JSON文件。我正在开发服务器上运行剧本。我的目标是从hostA上的JSON文件中读取变量,并将该变量用作我的剧本中的条件来执行其他任务。我可以使用include_vars在我的开发服务器上读取JSON文件,并将变量用作执行任务的条件。但是,我无法读取hostA上的JSON文件。看起来include_vars仅适用于localhost。我还有其他模块可以用来实现我的目标吗?我的剧本看起来像这样:

---
- hosts: hostA
  tasks:      
    - include_vars: 
         file: /mypath/myfile.json
         name: my_var

    - name: Create file if var_a in json file is less than 5
      file:
         path: /mypath/myfile
         state: touch
      when: '"{{ my_var.var_a|int }}" < 5' 

2 个答案:

答案 0 :(得分:0)

fetch文件,并在 include_vars 中使用它。

答案 1 :(得分:0)

使用fetch和include_vars的方法一次不能在多台计算机上使用,因为您将无法在每台计算机上分离事实。

相反,您可以考虑使用事实来实现目标。下面,我在远程计算机(例如,hostA)上的/etc/ansible/facts.d中创建了一个脚本,并使其对所有人可执行:

server.Router.BeforeRouting

当我运行它时,它会生成json

$ cd /etc/ansible/facts.d
$ chmod 0755 example.fact
$ cat example.fact

#!/usr/bin/env python
import json
kv = {'mykey': 'myvalue'}
print json.dumps(kv)

将其添加到您的角色或剧本-它会运行/etc/ansible/facts.d中的所有脚本。

$ ./example.fact
{"mykey": "myvalue"}

并确认您得到了想要的东西

- name: read local facts
  setup:
    filter: ansible_local

Ansible输出:

- name: debug
  debug:
    var: ansible_local.example

如果您想从远程计算机中将自定义值读入您的剧本执行中,现在所需要做的就是修改example.fact脚本以使用该信息并将其生成为json,例如:

ok: [hostA] => {
    "ansible_local.example": {
        "mykey": "myvalue"
    }
}