【问题标题】:Ansible to print the variable value having another variable inside itAnsible 打印其中包含另一个变量的变量值
【发布时间】:2022-07-07 01:34:34
【问题描述】:

在 .yml 文件中,我存储了如下数据

---
 Server:
   "Node1" : ["Node1", "Owner1", "ID1"]
   "Node2" : ["Node2", "Owner2", "ID2"]

现在,在 xyz.yml 剧本中,我尝试调试如下变量,并在命令行中传递 Node_Name (ansible-playbook xyz.yml -e "Node_Name=Node1")

---
 - name: "Print Variable value"
   hosts: all
   gather_facts: no
   vars:
     Node_Name: Node
     ID_Name: "{{ Server.{{ Node_Name }}[2] }}"
   tasks:
   - name: "Print the id"
     debug:
       msg:
         - "The id is {{ ID_Name }}"

但这失败并出现错误 - Template error while templating string :expected name or number

请有人帮忙解决这个问题,让我知道如何将 ID 打印为输出。这里预期的输出是 ID1

【问题讨论】:

  • 什么是data1
  • 哦,我的错,应该是 Node_Name
  • 更正:ID_Name: "{{ Server.{{ Node_Name }}[2] }}"
  • 更新您的问题,使其包含正确的信息。
  • 也更正了这个问题。谢谢

标签: ansible


【解决方案1】:

您永远不会嵌套 {{...}} 标记。

回想一下访问嵌套变量。语法Server.Node1 完全等同于Server["Node1"]。第二种语法允许我们在键上使用变量(和字符串插值),所以我们可以这样写:

Server[Node_Name]

换句话说:

- name: "Print Variable value"
  hosts: all
  gather_facts: no
  vars:
    Node_Name: Node
    ID_Name: "{{ Server[Node_Name][2] }}"
  tasks:
  - name: "Print the id"
    debug:
      msg:
        - "The id is {{ ID_Name }}"

【讨论】:

  • 非常感谢。效果很好。
  • 在 playbook 中,我删除了 DOT 并将行设为 ID_Name: "{{ Server[Node_name][2] }}"