Ansible 在循环中设置已注册变量并在其他角色中使用

Ansible 在循环中设置已注册变量并在其他角色中使用,ansible,Ansible,大家好,我有个问题 我现在遇到的问题是,复制文件的角色将跳过所有文件,无论文件名为空与否 在Role1中,我想为每个文件保存cat的输出。在when条件中的Role2中,如果注册的输出为==“”,我希望任务跳过 角色1: --- - name: copy files shell: "cat path{{ item }}files" register: checkempty loop: - test1 - test2 - test3 - test4 角

大家好,我有个问题

我现在遇到的问题是,复制文件的角色将跳过所有文件,无论文件名为空与否

在Role1中,我想为每个文件保存cat的输出。在when条件中的Role2中,如果注册的输出为==“”,我希望任务跳过

角色1:

---
- 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_行将在文件中为您提供一个行数组,您无需使用查找和拆分代码。

可能重复的