首页 > 解决方案 > Ansible 在标签选项中使用变量

问题描述

我的 ansible tasks/main.yml 看起来像这样的 atm:

---
- name: Create Directories
  file:
    path: "{{ item.path }}"
    recurse: yes
    owner: "{{ item.owner | default(\"nobody\") }}"
    group: "{{ item.group | default(\"nogroup\") }}"
    state: directory
  with_items:
    - "{{ app_dirs }}"

- name: Move Templates
  template:
    src: "{{  item.src  }}"
    dest: "{{  item.dest  }}"
    owner: "{{  item.owner | default(\"nobody\")  }}"
    group: "{{ item.group | default(\"nogroup\")  }}"
  with_items: "{{ app_templates }}"

- name: Move Dependencies
  copy:
    src: "{{  item.src  }}"
    dest: "{{  item.dest  }}"
    owner: "{{  item.owner | default(\"nobody\")  }}"
    group: "{{ item.group | default(\"nogroup\")  }}"
  with_items: "{{ app_dependencies }}"

我必须将几个依赖项和模板移动到远程机器上。现在我需要添加一些条件或标签,以便我们可以决定是要复制所有依赖项还是只复制其中的一些。我试过这样:

- name: Create Directories
  file:
    path: "{{ item.path }}"
    recurse: yes
    owner: "{{ item.owner | default(\"nobody\") }}"
    group: "{{ item.group | default(\"nogroup\") }}"
    state: directory
  tags: "{{ item.tag }}"
  with_items:
    - "{{ app_dirs }}"

但是 Ansible 会抛出这个错误:ERROR!“项目”未定义。可能标签选项必须在“文件”块内,因此with_items知道item.tag的来源。但是标签选项必须是这样的。有没有办法为标签选项使用变量?我实际上很喜欢这个 tasks/main.yml 的结构,它更容易在一个地方处理所有变量。我的另一个想法是使用以下条件创建块:

tasks:
- name: Install app1
  block:
    - name: Create Directory
      file:
        ....
    - name: Move Templates
      template:
        ....
    - name: Move Dependencies
      copy:
        ....
  tags:
    - app1

- name: Install app2
  block: .....
  

使用这种方法,我不能像以前一样将所有变量存储为字典。如果没有其他方法,我将使用块方法,但我希望有人有更好的主意。提前致谢!

标签: automationansible

解决方案


推荐阅读