使用ansible访问字典值

Dictionary value access using ansible

我有这样一种情况,我们在 ansible role default 中定义了 2 个字典,并且字典的选择是基于输入变量的。我想用字典的特定键值之一设置事实。

下面是示例代码:

test.yml支付簿内容:

- hosts: localhost
  gather_facts: true
  roles:
    - role1
  tags: ['role1']

roles/role1/tasks/main.yml内容:

- name: set fact
  set_fact:
    node_vip: "{% if node_vip_run == 'no' %}node_vip_no{% elif node_vip_run == 'yes' %}node_vip_yes{% endif %}"

- debug:
    var: node_vip
    verbosity: 1

- debug:
    var: "{{ node_vip }}.ece_endpoint"
    verbosity: 1

- name: set fact
  set_fact:
    ece_endpoint_fact: "{{ node_vip[ece_endpoint] }}"

- debug:
    var: ece_endpoint
    verbosity: 1

roles/role1/defaults/main.yml内容:

node_vip_yes:
  ece_endpoint: "https://1.1.1.1:8080"
  cac_endpoint: "https:2.2.2.2:8080"
node_vip_no:
  ece_endpoint: "http://3.3.3.3:8080"
  cac_endpoint: "http:4.4.4.4:8080"

运行 剧本:

ansible-playbook test.yaml --extra-vars 'node_vip_run=no' -v

变量“ece_endpoint_fact”的设置事实应具有值“https://1.1.1.1:8080 或 http://3.3.3.3:8080",具体取决于 ansible 命令中输入的参数。但我一直在获取以下错误:

TASK [role1 : set fact] *******************************************************************************************************
fatal: [localhost]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'unicode object' has no attribute u'http://3.3.3.3:8080'\n\nThe error appears to be in '/root/roles/role1/tasks/main.yml': line 46, column 3, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n- name: set fact\n  ^ here\n"}

请建议需要做什么来解决这个问题。

谢谢

现在,您将 node_vip 设置为文字字符串 "node_vip_no""node_vip_yes"。但是,如果您将其更改为 {{ node_vip_no }} / {{ node_vip_yes }},则 node_vip 将具有 变量 node_vip_no / [= 的值20=] 而不是文字字符串。

- name: set fact
  set_fact:
    node_vip: "{% if node_vip_run == 'no' %}{{ node_vip_no }}{% elif node_vip_run == 'yes' %}{{ node_vip_yes }}{% endif %}"

这将使 node_vip 的值类似于:

TASK [debug] ***************************************************************
ok: [localhost] => {
    "node_vip": {
        "cac_endpoint": "https:2.2.2.2:8080",
        "ece_endpoint": "https://1.1.1.1:8080"
    }
}

然后在你的另一个 set_fact 中,如果你在 属性 名称周围加上引号,它应该可以工作:

- name: set fact
  set_fact:
    ece_endpoint_fact: "{{ node_vip['ece_endpoint'] }}"
#                     Added quotes  ^            ^