在 Ansible 任务中使用主机组作为变量

Using Host Group as Variable in Ansible Task

我正在编写一个剧本,将本地事实脚本部署到我的 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" 用于数据库组中的主机。这样我就不必复制和粘贴此任务并为每个组分配自定义变量。将不胜感激关于如何实现这一点的任何建议。

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

请注意,当您 运行 剧本时,这些组变量会被压缩到宿主变量中。列在多个组中的主机将以基于优先顺序的变量结束

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

official documentation中描述为

group_names List of groups the current host is part of

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

TLDR;

使用group_names[0].