#dictionary #ansible #ansible-facts
Вопрос:
У меня есть ситуация, когда у нас есть 2 словаря, определенных по умолчанию в роли ansible, и выбор словаря основан на входной переменной. Я хочу установить факт с помощью одного из определенных ключевых значений диктатора.
Ниже приведен пример кода:
содержимое платежной книжки test.yml:
- hosts: localhost
gather_facts: true
roles:
- role1
tags: ['role1']
роли/роля1/задачи/основное содержимое.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
роли/роля1/по умолчанию/основное содержимое.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"
Запустите playbook:
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'nnThe error appears to be in '/root/roles/role1/tasks/main.yml': line 46, column 3, but maynbe elsewhere in the file depending on the exact syntax problem.nnThe offending line appears to be:nnn- name: set factn ^ heren"}
Пожалуйста, предложите, что нужно сделать, чтобы решить эту проблему.
Спасибо
Ответ №1:
Прямо сейчас вы устанавливаете node_vip
либо буквальную строку "node_vip_no"
, либо "node_vip_yes"
. Но если вы измените его на do {{ node_vip_no }}
/ {{ node_vip_yes }}
, то node_vip
вместо буквальной строки будет значение node_vip_no
переменной node_vip_yes
/.
- 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 ^ ^