Ansible 在同一剧本中创建事实文件时,剧本无法读取本地事实
我有一个简单的剧本,其中我试图将本地事实文件推送到远程主机,然后根据本地事实的比较执行任务。但是,facts文件按预期在远程主机上创建,但未被读取 我认为在文件创建和读取之间一定会有延迟,所以我只能等待,以确保在读取之前创建文件 问:“如果重新运行同一个剧本,第一次不被阅读,效果很好。” 答:在同一剧本中开始新的剧本Ansible 在同一剧本中创建事实文件时,剧本无法读取本地事实,ansible,Ansible,我有一个简单的剧本,其中我试图将本地事实文件推送到远程主机,然后根据本地事实的比较执行任务。但是,facts文件按预期在远程主机上创建,但未被读取 我认为在文件创建和读取之间一定会有延迟,所以我只能等待,以确保在读取之前创建文件 问:“如果重新运行同一个剧本,第一次不被阅读,效果很好。” 答:在同一剧本中开始新的剧本 - hosts: "{{ target }}" vars: abc: "10" xyz: "11" tasks: - name: write c
- hosts: "{{ target }}"
vars:
abc: "10"
xyz: "11"
tasks:
- name: write custom fact
copy:
...
- hosts: "{{ target }}"
tasks:
- debug: var=ansible_local.somefact_a.some_var1
- debug: var=ansible_local.somefact_b.some_var2
...
例如下面的剧本
- hosts: test_01
tasks:
- copy:
dest: /etc/ansible/facts.d/somefact_a.fact
content: |
{"some_var1": 10}
- hosts: test_01
tasks:
- debug:
var: ansible_local.somefact_a.some_var1
给予
注释 1) 需要安装程序来读取变量
$ ansible -i hosts test_01 -m setup -a "filter=ansible_local"
test_01 | SUCCESS => {
"ansible_facts": {
"ansible_local": {
"somefact_a": {
"some_var1": 10
}
}
},
"changed": false
}
2) 没有设置,变量不可用
$ ansible -i hosts test_01 -m debug -a "var=ansible_local"
test_01 | SUCCESS => {
"ansible_local": "VARIABLE IS NOT DEFINED!"
}
3) 同样的负面结果也可以通过collect\u facts:false
{“msg”:“条件检查'ansible\u local.somefact\u a.some\u var1!=ansible\u local.somefact\u b.some\u var2'失败。错误是:计算条件时出错(ansible\u local.somefact\u a.some\u var1!=ansible\u local.somefact\u b.some\u var2):“dict object”没有属性“somefact\u a”\n\n错误似乎出现在
中,您应该在托管主机上创建新事实后调用安装程序
模块。事实收集通常是playbook执行的第一步。上面没有运气-不确定这是否是错误,但我已经报告了这一点。我已经用示例更新了答案。您应该关闭该问题。需要“设置”来读取变量。
$ ansible -i hosts test_01 -m setup -a "filter=ansible_local"
test_01 | SUCCESS => {
"ansible_facts": {
"ansible_local": {
"somefact_a": {
"some_var1": 10
}
}
},
"changed": false
}
$ ansible -i hosts test_01 -m debug -a "var=ansible_local"
test_01 | SUCCESS => {
"ansible_local": "VARIABLE IS NOT DEFINED!"
}
- hosts: test_01
gather_facts: false
tasks:
- debug:
var: ansible_local.somefact_a.some_var1