ansible groups.variable 在任务中

ansible groups.variable in a tasks

我正在尝试使用我在 group_vars/file.yml 中定义的变量,并将其用于我的角色任务中,例如 groups.my_variable(my_variable 是组在我的库存中定义)

这是我的角色任务:

  ---

- name: "Create strusted storage pool"
  gluster_peer:
    state: "{{ CURRENT_NODES.state }}"
    nodes: "{{groups.group_name}}"
  tags: STORAGE_POOL

我的库存

[gluster]
glusterfs01
glusterfs02
ly-lab-elk
lpic

当我这样使用它时它起作用了:

---
    
    - name: "Create strusted storage pool"
      gluster_peer:
        state: "{{ CURRENT_NODES.state }}"
        nodes: "{{ groups.gluster }}"
      tags: STORAGE_POOL

当我直接在 tasks/pool_storage.yml 中使用 groups.gluster 时,我得到了预期的结果

TASK [debug] ******************************************************************************************************************************************************************************************************
ok: [glusterfs01] => {
    "groups.gluster": [
        "glusterfs01",
        "glusterfs02",
        "ly-lab-elk",
        "lpic"
    ]
}
ok: [glusterfs02] => {
    "groups.gluster": [
        "glusterfs01",
        "glusterfs02",
        "ly-lab-elk",
        "lpic"
    ]
}
ok: [ly-lab-elk] => {
    "groups.gluster": [
        "glusterfs01",
        "glusterfs02",
        "ly-lab-elk",
        "lpic"
    ]
}
ok: [lpic] => {
    "groups.gluster": [
        "glusterfs01",
        "glusterfs02",
        "ly-lab-elk",
        "lpic"
    ]
}

但是当我使用 group_vars/gluster.yml

中设置的变量时
group_names: gluster

在我的任务中tasks/pool_storage.yml

nodes: "{{groups.group_name}}"

这个结果不好

TASK [debug] ******************************************************************************************************************************************************************************************************
ok: [glusterfs01] => {
    "group_names": [
        "gluster"
    ]
}
ok: [glusterfs02] => {
    "group_names": [
        "gluster"
    ]
}
ok: [ly-lab-elk] => {
    "group_names": [
        "gluster"
    ]
}
ok: [lpic] => {
    "group_names": [
        "gluster"
    ]
}

由于我的库存文件中有不同的组,我想使用一个变量,我将在其中定义我的组名,然后将其附加到 groups.group_name 或其他方式,但要获得预期的结果。

有人可以帮忙吗?

提前谢谢你。

将变量放入文件group_vars/gluster.yml,如果你想让组gluster的主机使用它.文件名必须与组名相同。这样 Ansible 将识别目录 group_vars 中的文件属于哪个组。

如果不能把group_vars/file.ymllink改成group_vars/gluster.yml .

例如,给定用于测试的简化清单

shell> cat hosts
[gluster]
glusterfs01
glusterfs02

group_vars

shell> cat group_vars/gluster.yml 
my_variable: foo

和剧本

shell> cat playbook.yml 
- hosts: gluster
  gather_facts: false
  tasks:
    - debug:
        var: my_variable

给出(删节)

shell> ansible-playbook -i hosts playbook.yml

TASK [debug] *******************************************************
ok: [glusterfs01] => 
  my_variable: foo
ok: [glusterfs02] => 
  my_variable: foo

因此,要在 groups 中引用 group_name 变量,您可以尝试使用 groups[group_name] 语法。

库存示例:

[servers]
host-101.xxx.com
host-202.xxx.com

[group1]
g1-server1
g1-server2

一个group_vars/servers.yaml:

group_name: servers

剧本:

- hosts: servers
  connection: local

  tasks:
    - debug:
        var: groups[group_name]

group1 下的服务器定义为 group_name:

ok: [host-101.xxx.com] => {
    "groups[group_name]": [
        "host-101.xxx.com",
        "host-202.xxx.com"
    ]
}
ok: [host-202.xxx.com] => {
    "groups[group_name]": [
        "host-101.xxx.com",
        "host-202.xxx.com"
    ]
}

还有一点需要注意的是,您不需要在 GlusterFS 集群的每个主机上建立对等节点。所以,要么:

  • 定位该组的任意 1 台主机

  • run_once: true添加到任务

示例:

- name: "Create strusted storage pool"
  gluster_peer:
    state: "{{ CURRENT_NODES.state }}"
    nodes: "{{ groups[group_name] }}"
  tags: STORAGE_POOL
  run_once: true