首页 > 解决方案 > Ansible:在另一个变量声明中使用一个变量

问题描述

我一直试图在另一个变量声明中使用一个变量。这是我的剧本中的代码:

- hosts: operate
  roles:
    - { role: dns, vargroup: 'test' }

- hosts: test
  roles:
    - common
    - certbot
    - ...

现在我的 dns 角色的第一行:

- debug: var=vargroup

- name: Extracting IP(s) {{vargroup}}
  vars:
    extractip: "{{ hostvars[groups['{{ vargroup }}'][0]]['ip'] }}"
  set_fact:
    newip: "{{ item.expose }}"
  with_items: 
    - '{{ extractip }}'

Vargroup 在调试和我的任务名称中正确打印。但是在 extractip 部分,我遇到了这个错误:

{
    "msg": "'dict object' has no attribute '{{ vargroup }}'",
    "_ansible_no_log": false
}

显然,我尝试硬编码该行,例如:

    extractip: "{{ hostvars[groups['test'][0]]['ip'] }}"

它就像一个魅力。我真的不知道如何在我的 var 声明中使用这个 var :)

标签: variablesansible

解决方案


这可能是由 YAML 中引号的工作方式引起的。变量替换后'{{ extractip }}'会变成'{{ hostvars[groups['{{ vargroup }}'][0]]['ip'] }}'. 它将尝试解释'{{ vargroup }}'为纯字符串而不是变量。

只需使用双引号即可

  with_items: 
    - "{{ extractip }}"

由于 Ansible 不支持嵌套 "{{ }}" 构造,但您可以简单地删除该部分并使用"{{ hostvars[groups[vargroup][0]]['ip'] }}".


推荐阅读