【问题标题】:Using Host Group as Variable in Ansible Task在 Ansible 任务中使用主机组作为变量
【发布时间】:2018-09-24 16:36:56
【问题描述】:

我正在编写一个剧本,将本地事实脚本部署到我的 Ansible 清单中的各个组,并且我将能够利用正在处理的组名称作为任务本身的变量。对于这个例子,假设我在我的 Ansible 机器上有传统的 Ansible 角色目录结构,并且在“files”目录下有名为“apache”、“web”和“db”的子目录。我现在举例说明,...

---
- hosts: apache:web:db

  tasks:
  - name: Set facts for facts directories
    set_fact:
      facts_dir_local: "files/{{ group_name }}"
      facts_dir_remote: "/etc/ansible/facts.d"

   - name: Deploy local facts
     copy:
       src: "{{ item }}"
       dest: "{{ facts_dir_remote }}"
       owner: ansible
       group: ansible
       mode: 0750
     with_fileglob:
      - "{{ facts_dir_local }}/*.fact"

目标是让上面的{{ group_name }} 为 apache 组中的主机取值“apache”,为 web 组中的主机取值“web”,为 db 组中的主机取值“db” .这样我就不必复制和粘贴此任务并为每个组分配自定义变量。任何有关如何完成此任务的建议将不胜感激。

【问题讨论】:

  • 那么,您遇到了什么问题?您的任务根本没有工作或没有按您的意愿工作?
  • @KelsonSilva 我只想让 {{ group_name }} 承担正在执行剧本的组的价值。例如,如果它当前在我的“db”组中的所有节点上工作,我希望 {{ group_name }} 成为字符串“db”
  • @KelsonSilva 我认为在我的文件目录中有不同的子目录会很方便,这样我就可以说“将所有 .fact 文件从这个目录复制到那个目录”,所以我想组织这些目录并在我的清单中以组名命名它们是个好主意(即“db”、“web”、“apache”);例如,在 files/facts 下,我们将拥有子目录 files/facts/db、files/facts/web 和 files/facts/apache,在这些子目录下,我们将拥有实际的 .fact 文件

标签: ansible ansible-facts


【解决方案1】:

虽然 ansible 中没有 group_name 变量,但有一个 group_names(复数)。这是因为任何主机都可能属于一个或多个组。

official documentation中描述为

组名 当前主机所属的组列表

在最常见的情况下,每个主机都只是一个组的一部分,因此您只需说 group_names[0] 即可获得所需的内容。

TLDR;

使用group_names[0]

【讨论】:

    【解决方案2】:

    您可以使用组变量来实现此目的,可以在清单文件或单独的 group_vars/<group> 文件中指定 - 请参阅 https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html

    请注意,当您运行 playbook 时,这些组变量会被压缩为主机变量。列在多个组中的主机将根据优先顺序得到变量

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多