在特定任务中加载 ansible vars

Load ansible vars in specific tasks

我觉得我一定是错过了这个答案,因为它看起来很明显,但我已经阅读了很多帖子,但无法让它发挥作用。

目前我正在加载然后根据清单主机名从文件中模板化变量,如下所示:

  - name: load unique dev vars from file
    include_vars:
      file: ~/ansible/env-dev.yml
    when: inventory_hostname in groups[ 'devs' ]

  - name: load unique prod vars from file
    include_vars:
      file: ~/ansible/env-prod.yml
    when: inventory_hostname == 'prod'

  - name: copy .env dev file with templated vars
    ansible.builtin.template:
      src: ~/ansible/env-dev.j2
      dest: /home/{{ inventory_hostname }}/.env
      owner: '{{ inventory_hostname }}'
      group: '{{ inventory_hostname }}'
      mode: '0600'
    when: inventory_hostname in groups[ 'devs' ]

这很好用,但最终它需要我创建大量的 .yml 文件,而我宁愿在某些步骤中包含一些变量。

是否可以为特定任务加载变量?我已经尝试了很多解决方案,但还没有成功。请参阅下文,了解我在任务结束时尝试使用 vars 的一种方法。

  - name: copy .env dev file with templated vars
    ansible.builtin.template:
      src: ~/ansible/env-dev.j2
      dest: /home/{{ inventory_hostname }}/.env
      owner: '{{ inventory_hostname }}'
      group: '{{ inventory_hostname }}'
      mode: '0600'
    when: inventory_hostname in groups[ 'devs' ]
    vars:
       NODE_ENV: development
       PORT: 66

组织 Ansible 代码的关键是依赖 group vars

此功能允许根据主机所属的组加载变量。您有几种方法可以做到这一点,最清晰的方法之一是使用 group_vars 文件夹中以组名命名的 yaml 文件(加上匹配所有主机的 all.yaml )。 Ansible 会自动为您选择它们​​,因此您可以摆脱前两个 include_vars。您可以将它们与特定于角色和/或剧本的变量结合起来。因此,您以一组来自主机(目标)和角色/剧本(要实现的任务)的变量结束。

要替换硬编码 src: ~/ansible/env-dev.j2,您可以在每个组中定义一个变量。

---
# dev.yaml
template_name: "env-dev.j2"
---
# prod.yaml
template_name: "env-prod.j2"

然后在你的剧本/角色中使用它src: "{{ template_name }}"