Ansible |条件检查';item.stat.exists';失败
我有以下代码:Ansible |条件检查';item.stat.exists';失败,ansible,ansible-2.x,ansible-inventory,ansible-facts,ansible-template,Ansible,Ansible 2.x,Ansible Inventory,Ansible Facts,Ansible Template,我有以下代码: **Getting an error like :** "msg": "The conditional check 'item.stat.exists' failed. The error was: error while evaluating conditional (item.stat.exists): 'ansible.utils.unsafe_proxy.AnsibleUnsafeText object' has no attribute 'stat'\n\nThe e
**Getting an error like :**
"msg": "The conditional check 'item.stat.exists' failed. The error was: error while evaluating conditional (item.stat.exists): 'ansible.utils.unsafe_proxy.AnsibleUnsafeText object' has no attribute 'stat'\n\nThe error appears to be in '/Ansible/roles/test/tasks/test1.yml': line 16, column 3, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n- debug:\n ^ here\n"
我试图做的是检查文件夹,如果它们不存在或不存在
我错在哪里?是否可以将not stat.exists与变量列表一起使用
谢谢你的回答 您可以使用:
**Inventory File :**
[test]
192.168.0.61 serverid=2
192.168.0.60 serverid=1
**Variable File :**
devangtest:
- ['1','adsdsdasd']
- ['2','kafka2sda']
- ['2','fggfdfgdf']
**Task File:**
- name: Check directory exists or not.
stat:
path: "/tmp/{{ item[1] }}"
register: alarm_details
when: "{{ serverid }} == {{ item[0] }}"
with_items:
- "{{ devangtest }}"
ignore_errors: yes
- debug:
msg: "{{ alarm_details.results }}"
- debug:
msg: "The file or directory exists"
when: item.stat.exists
with_items:
- alarm_details.results
# when: item.stat.isdir
ignore_errors: yes
- name: Create a directory if it does not exist
file:
path: "/tmp/{{ item[1] }}/test2"
state: directory
when:
- item.stat.exists == true
- "{{ serverid }} == {{ item[0] }}"
with_items:
- "{{ alarm_details.results }}"
- "{{ devangtest }}"
您可以使用:
**Inventory File :**
[test]
192.168.0.61 serverid=2
192.168.0.60 serverid=1
**Variable File :**
devangtest:
- ['1','adsdsdasd']
- ['2','kafka2sda']
- ['2','fggfdfgdf']
**Task File:**
- name: Check directory exists or not.
stat:
path: "/tmp/{{ item[1] }}"
register: alarm_details
when: "{{ serverid }} == {{ item[0] }}"
with_items:
- "{{ devangtest }}"
ignore_errors: yes
- debug:
msg: "{{ alarm_details.results }}"
- debug:
msg: "The file or directory exists"
when: item.stat.exists
with_items:
- alarm_details.results
# when: item.stat.isdir
ignore_errors: yes
- name: Create a directory if it does not exist
file:
path: "/tmp/{{ item[1] }}/test2"
state: directory
when:
- item.stat.exists == true
- "{{ serverid }} == {{ item[0] }}"
with_items:
- "{{ alarm_details.results }}"
- "{{ devangtest }}"
考虑到库存
- name: Create a directory if it does not exist
file:
path: "/tmp/{{ item.1[1] }}/test2"
state: directory
when:
# - item.0.stat.exists = True
- item.0.stat.exists
- "{{ serverid }} == {{ item.1[0] }}"
with_together:
- '{{ alarm_details.results }}'
- '{{ devangtest }}'
剧本
shell> cat hosts
[test]
10.1.0.51 serverid='1'
10.1.0.52 serverid='2'
当不存在任何目录时给出
shell> cat pb.yml
- hosts: test
vars:
devangtest:
- ['1','adsdsdasd']
- ['2','kafka2sda']
- ['2','fggfdfgdf']
tasks:
- name: Check directory exists or not.
stat:
path: "/tmp/{{ item.1 }}"
register: alarm_details
when: serverid|int == item.0|int
loop: "{{ devangtest }}"
- set_fact:
dir_stat: "{{ alarm_details.results|
json_query('[].{dir: item[1], stat: stat.exists}') }}"
- debug:
msg: "/tmp/{{ item }} exists"
loop: "{{ dir_stat|json_query('[?stat].dir') }}"
- name: Create a directory if it does not exist
file:
path: "/tmp/{{ item }}/test2"
state: directory
loop: "{{ dir_stat|json_query('[?stat].dir') }}"
使用现有目录/tmp/adsdsdasd
在主机test\u 01
剧本中给出
shell> ansible-playbook pb.yml
PLAY [test] ***
TASK [Check directory exists or not.] ***
skipping: [10.1.0.52] => (item=[u'1', u'adsdsdasd'])
ok: [10.1.0.51] => (item=[u'1', u'adsdsdasd'])
skipping: [10.1.0.51] => (item=[u'2', u'kafka2sda'])
skipping: [10.1.0.51] => (item=[u'2', u'fggfdfgdf'])
ok: [10.1.0.52] => (item=[u'2', u'kafka2sda'])
ok: [10.1.0.52] => (item=[u'2', u'fggfdfgdf'])
TASK [set_fact] ***
ok: [10.1.0.51]
ok: [10.1.0.52]
TASK [debug] ***
TASK [Create a directory if it does not exist] ***
PLAY RECAP ***
10.1.0.51: ok=2 changed=0 unreachable=0 failed=0 skipped=2 rescued=0 ignored=0
10.1.0.52: ok=2 changed=0 unreachable=0 failed=0 skipped=2 rescued=0 ignored=0
考虑到库存
- name: Create a directory if it does not exist
file:
path: "/tmp/{{ item.1[1] }}/test2"
state: directory
when:
# - item.0.stat.exists = True
- item.0.stat.exists
- "{{ serverid }} == {{ item.1[0] }}"
with_together:
- '{{ alarm_details.results }}'
- '{{ devangtest }}'
剧本
shell> cat hosts
[test]
10.1.0.51 serverid='1'
10.1.0.52 serverid='2'
当不存在任何目录时给出
shell> cat pb.yml
- hosts: test
vars:
devangtest:
- ['1','adsdsdasd']
- ['2','kafka2sda']
- ['2','fggfdfgdf']
tasks:
- name: Check directory exists or not.
stat:
path: "/tmp/{{ item.1 }}"
register: alarm_details
when: serverid|int == item.0|int
loop: "{{ devangtest }}"
- set_fact:
dir_stat: "{{ alarm_details.results|
json_query('[].{dir: item[1], stat: stat.exists}') }}"
- debug:
msg: "/tmp/{{ item }} exists"
loop: "{{ dir_stat|json_query('[?stat].dir') }}"
- name: Create a directory if it does not exist
file:
path: "/tmp/{{ item }}/test2"
state: directory
loop: "{{ dir_stat|json_query('[?stat].dir') }}"
使用现有目录/tmp/adsdsdasd
在主机test\u 01
剧本中给出
shell> ansible-playbook pb.yml
PLAY [test] ***
TASK [Check directory exists or not.] ***
skipping: [10.1.0.52] => (item=[u'1', u'adsdsdasd'])
ok: [10.1.0.51] => (item=[u'1', u'adsdsdasd'])
skipping: [10.1.0.51] => (item=[u'2', u'kafka2sda'])
skipping: [10.1.0.51] => (item=[u'2', u'fggfdfgdf'])
ok: [10.1.0.52] => (item=[u'2', u'kafka2sda'])
ok: [10.1.0.52] => (item=[u'2', u'fggfdfgdf'])
TASK [set_fact] ***
ok: [10.1.0.51]
ok: [10.1.0.52]
TASK [debug] ***
TASK [Create a directory if it does not exist] ***
PLAY RECAP ***
10.1.0.51: ok=2 changed=0 unreachable=0 failed=0 skipped=2 rescued=0 ignored=0
10.1.0.52: ok=2 changed=0 unreachable=0 failed=0 skipped=2 rescued=0 ignored=0
失败!=>{“msg”:“条件检查'item.0.stat.exists==True'失败。错误为:计算条件时出错(item.0.stat.exists==True):“dict object”没有属性“stat”\n\n错误出现在“/data200gb/MFS-5x-Ansible/roles/test/tasks/test1.yml”中:第41行第3列,但可能\n位于文件的其他位置,具体取决于语法问题。\n\n有问题的行可能是:\n\n\n-name:创建一个不存在的目录\n^here\n”}失败!=>{“msg”:“条件检查'item.0.stat.exists==True'失败。错误为:计算条件时出错(item.0.stat.exists==True):“dict object”没有属性“stat”\n\n错误出现在“/data200gb/MFS-5x-Ansible/roles/test/tasks/test1.yml”:第41行,第3列,但可能\n位于文件的其他位置,具体取决于语法问题。\n\n有问题的行可能是:\n\n\n-name:如果目录不存在,请创建目录\n^此处\n”}您应该显示alarm_details.results的输出。您应该显示alarm_details.results的输出。不工作循环检查了4次,而不是playbook为我工作的2次。我已经用详细信息更新了答案。如果目录不存在于我可以实现的相同代码中,我不会失败吗@Vladimir BotkaNot工作循环检查了4次,而不是剧本中为我工作的2次。我已经用详细信息更新了答案。如果目录不存在于我可以实现的相同代码中,我不会失败吗@弗拉基米尔·博特卡