Доступ к фактам из другой роли в Ansible

Я установил некоторые факты во время моей игры, используя pre_tasks:

    - name: set site name variables
      set_fact: 
        site_name: '{{ ansible_hostname | regex_replace("^([a-z]{3}[0-9]).*", "\1") }}'
        site_name_upper: '{{ ansible_hostname | regex_replace("^([a-z]{3}[0-9]).*", "\1") | upper }}'

и теперь я хотел бы получить доступ к ним из роли, которую я разрабатываю. Когда я пытаюсь получить доступ к ним напрямую, я получаю сообщение об ошибке, что переменная не определена:

TASK [monitoring-server : debug] ****************************************************************************************************************************************************************************************************
fatal: [hostname]: FAILED! => {"msg": "the field 'args' has an invalid value, which appears to include a variable that is undefined.The error was: 'site_name' is undefined\n\nThe error appears to have been in '/opt/ansible/dv-ansible/roles/linux-monitoring-server/tasks/smokeping.yaml': line 55, 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: debug\n  ^ here\n\nexception type: <class 'ansible.errors.AnsibleUndefinedVariable'>\nexception: 'site_name' is undefined"}
    to retry, use: --limit @/opt/ansible/.ansible-retry/linux_monitoring_server.retry

Согласно некоторым статьям, которые я прочитал, мне нужно использовать hostvars искать факты, установленные в другой пьесе, например:

{{ hostvars[{{ansible_hostname}}]['site_name'] }}

Тем не менее, есть очевидные проблемы с этим (переменная внутри переменной). Я знаю, что могу просто определить свои факты в каждой роли, которой нужен доступ к ним, но это кажется грязным и определенно не СУХОЙ.

Мне просто нужен способ установить и получить доступ к "глобальным" фактам / переменным, которые могут быть доступны из нескольких пьес и ролей. Каков наилучший способ сделать это?

1 ответ

Вау, теперь я чувствую себя глупо. Просто понял, что вы можете поместить динамически исполняемого Джинджу в group_vars а также host_vars файлы.

Ответ, конечно, заключается в том, чтобы просто переместить site_name определения к group_vars/all/all.yaml,

Другие вопросы по тегам