Ansible 在循环中设置已注册变量并在其他角色中使用
大家好,我有个问题 我现在遇到的问题是,复制文件的角色将跳过所有文件,无论文件名为空与否 在Role1中,我想为每个文件保存cat的输出。在when条件中的Role2中,如果注册的输出为==“”,我希望任务跳过 角色1:Ansible 在循环中设置已注册变量并在其他角色中使用,ansible,Ansible,大家好,我有个问题 我现在遇到的问题是,复制文件的角色将跳过所有文件,无论文件名为空与否 在Role1中,我想为每个文件保存cat的输出。在when条件中的Role2中,如果注册的输出为==“”,我希望任务跳过 角色1: --- - name: copy files shell: "cat path{{ item }}files" register: checkempty loop: - test1 - test2 - test3 - test4 角
---
- name: copy files
shell: "cat path{{ item }}files"
register: checkempty
loop:
- test1
- test2
- test3
- test4
角色2:
---
- name: Copy Files
copy:
src: "{{ var1 }}{{ var2 }}{{ var3 }}{{ var4 }}{{ item }}/"
dest: "{{ copy_dest_sys }}" #destination path
loop: "{{ lookup('file', 'pathtofile/file').split('\n')}}"
when: hostvars['localhost'].checkempty.results == ""
剧本:
- name: check emptiness
hosts: localhost
become: yes
vars_files:
- ../variables/varsfile
roles:
- ../variables/role1
- name: Copy Files to prod/stag
hosts: "{{hosts_exec}}"
become: yes
vars_files:
- ../vars/recommendation-delta.yml
roles:
- ../roles/role2
如何设置带有_项的注册变量,并将其输出与“”(无)进行比较?
有人能帮我解决这个问题吗?复制整个目录的问题正在发生,因为{{item}}是空的,而您的文件名是空的。它将src视为
src: "{{ git_dest }}{{ git_recoprop_files }}"
尽管
src: "{{ git_dest }}{{ git_recoprop_files }}{{ item }}/"
因为{item}}是空的。我不确定您是否必须使用第一个角色来检查文件是否为空。如果不是强制性的,则您可以将您的第二个角色更新为
when: item != ""
除此之外-
checkempty.results==“”
这也是错误的。无论文件是否为空,这都将为每个循环项的结果提供一个字典数组。字典中有很多东西的kay值对,比如条目、标准输出等等。
样本:-
{
"_ansible_ignore_errors": null,
"_ansible_item_label": "inventory1",
"_ansible_item_result": true,
"_ansible_no_log": false,
"_ansible_parsed": true,
"changed": true,
"cmd": "cat /home/rohit/ansible/inventory1",
"delta": "0:00:00.004505",
"end": "2019-04-21 21:13:55.042776",
"failed": false,
"invocation": {
"module_args": {
"_raw_params": "cat /home/rohit/ansible/inventory1",
"_uses_shell": true,
"argv": null,
"chdir": null,
"creates": null,
"executable": null,
"removes": null,
"stdin": null,
"warn": true
}
},
"item": "inventory1",
"rc": 0,
"start": "2019-04-21 21:13:55.038271",
"stderr": "",
"stderr_lines": [],
"stdout": "inventory\nplaybook.yml",
"stdout_lines": [
"inventory",
"playbook.yml"
]
}
]
我认为主要问题是您需要使用stdout而不是checkempty变量的结果,如下所示:
when: hostvars['localhost'].checkempty.stdout != ""
- name: Copy sys Files to prod/stag
copy:
src: "{{ git_dest }}{{ git_sys_files }}{{ item }}/"
dest: "{{ copy_dest_sys }}" #destination path
loop: "{{ hostvars['localhost'].checkempty.stdout_lines }}"
when: hostvars['localhost'].checkempty.stdout != ""
看来你的逻辑也倒过来了,我想你要用而不是==
我建议您通过在循环中使用stdout_行进行重构并简化代码,如下所示:
when: hostvars['localhost'].checkempty.stdout != ""
- name: Copy sys Files to prod/stag
copy:
src: "{{ git_dest }}{{ git_sys_files }}{{ item }}/"
dest: "{{ copy_dest_sys }}" #destination path
loop: "{{ hostvars['localhost'].checkempty.stdout_lines }}"
when: hostvars['localhost'].checkempty.stdout != ""
stdout_行将在文件中为您提供一个行数组,您无需使用查找和拆分代码。可能重复的