使用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 ^ ^
我有这样一种情况,我们在 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 ^ ^