Доступ к значениям словаря с помощью ansible

#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  ^            ^