在其他角色中使用注册变量

问题描述 投票:0回答:1

大家好我有问题。

我目前遇到的问题是,无论文件名是否为空,复制文件的角色都会跳过所有文件。

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

基于role1:

---
- name: copy files
  shell: "cat path{{ item }}files"
  register: checkempty
  loop:
    - test1
    - test2
    - test3
    - test4

基于role2:

---
- 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

如何使用with_items设置注册变量并将其输出与“”(无)进行比较?有人可以帮我解决这个问题吗?

ansible
1个回答
1
投票

register变量时,它仅在执行该任务的特定主机上设置。所以如果你在localhost上运行一个角色,那么:

---
- name: Check if sys files Empty
  command: if [ ! -s filenames/"{{ item }}"files ]; then echo "{{ item }}fileempty"; fi
  register: checkempty
  loop:
    - sys
    - wifi
    - recoprop
    - udfprop

然后,当您在另一台主机上运行任务时,您会像这样引用它:

hostvars["localhost"].checkempty

例如:

---
- name: Copy sys Files to prod/stag
  copy:
    src: "{{ git_dest }}{{ git_sys_files }}{{ item }}/"
    dest: "{{ copy_dest_sys }}" #destination path
  loop: "{{ lookup('file', '/home/ansible/repo/hal_ansible/scripts/delta-reco/filenames/sysfiles').split('\n')}}"
  when: 'hostvars["localhost"].checkempty.stdout == "sysfileempty"'

您可以在“Using Variables”文档中阅读更多相关信息。

我也在这里对你的when语法进行了一些修正。一般情况下,你不应该在{{...}}条件下使用when标记,因为when条件总是被评估为Jinja表达式。


但是,您还有另一个问题:

您的“检查sys文件是否为空”任务是使用command模块,但您正在尝试运行shell脚本。那永远都会失败。您需要使用shell模块:

---
- name: Check if sys files Empty
  shell: if [ ! -s filenames/"{{ item }}"files ]; then echo "{{ item }}fileempty"; fi
  register: checkempty
  loop:
    - sys
    - wifi
    - recoprop
    - udfprop
© www.soinside.com 2019 - 2024. All rights reserved.