Назад | Перейти на главную страницу

Синтаксис для set_fact

У меня есть файл инвентаризации Ansible как:

[dev_web:children]
dev_www
dev_auto

[dev_www]
web01_dev    ansible_host=web01-dev.company.com
web02_dev    ansible_host=web02-dev.company.com
web03_dev    ansible_host=web03-dev.company.com

[dev_auto]
auto_dev     ansible_host=auto-dev.company.com

Публикация Ansible "/deploys/patch.yml" как:

- name: patch
  hosts: "{{ configs_target | default('test_servers') }}"
  serial: 1
  vars:
    slack_token: 'slack-token'
    slack_channel: 'slack-channel'
  roles:
    - patch

Основной файл плейбука Ansible "/deploys/roles/patch/tasks/main.yml" как:

---
- name: Include vars of patch.yml
  include_vars:
    file: backend_vars.yml
    name: web_servers

- name: set needed facts
  set_fact:
    backend_name: "{{ [cache_mgmt][configs_target]['backend_name'] }}"

Файл переменных «/deploys/roles/patch/vars/backend_vars.yml» как:

cache_mgmt:
  dev_web:
    backend_name: www_http_be
    backend_hosts: dev_www
  dit_web:
    backend_name: www_http_be
    backend_hosts: dit_www

Я выполняю следующую команду запуска:

ansible-playbook /deploys/patch.yml -e '{"configs_target": "dev_web"}'

Когда я запускаю playbook, я ожидаю, что значение переменной будет backend_name: www_http_be. Но это не удается с ошибкой ниже.

TASK [patch : set needed facts] *****************************************************************************************
fatal: [web01_dev]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'list object' has no attribute 'dev_web'\n\nThe error appears to be in '/deploys/roles/patch/tasks/main.yml': line , column , 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 needed facts\n  ^ here\n"}

Я считаю, что проблема связана с синтаксисом set_fact. Если это правда, какой должна быть правильная форма в этом случае?

Поскольку вары вызываются из файла переменных, нам также необходимо указать назначенное имя. Правильный синтаксис "{{ web_servers['cache_mgmt'][configs_target]['backend_name'] }}"