Доступ к переменной ansible.cfg в задаче

Как я могу ссылаться на remote_tmp (или любое другое) значение, определенное в ansible.cfg, в своих задачах? Например, в my_task/defaults/main.yml:

file_ver: "1.5"
deb_file: "{{ defaults.remote_tmp }}/deb_file_{{ file_ver }}.deb"

выдает ошибку:

fatal: [x.x.x.x]: FAILED! => {"failed": true, 
    "msg": "the field 'args' has an invalid value, 
            which appears to include a variable that is undefined. 
            The error was: {{ defaults.remote_tmp }}/deb_file_{{ file_ver }}.deb: 
           'defaults' is undefined\... }

person Ivan Velichko    schedule 25.10.2016    source источник
comment
вы пробовали только {{ remote_tmp }}?   -  person ddavison    schedule 25.10.2016
comment
@sircapsalot, конечно, 'remote_tmp' is undefined.   -  person Ivan Velichko    schedule 25.10.2016
comment
это наводит меня на мысль, что файл ansible.cfg читается неправильно. где твой cfg файл? корень проекта?   -  person ddavison    schedule 25.10.2016
comment
@sircapsalot, у меня есть собственный ansible.cfg, расположенный в корне каталога моего проекта, только с одной записью [defaults]\nroles_path = /home/deploy/devops/ansible/roles.   -  person Ivan Velichko    schedule 25.10.2016
comment
это может иметь какое-то отношение к тому, что вы помещаете пользовательскую переменную внутри [default]. согласно документам, в разделе [значения по умолчанию] ansible.cfg можно настроить следующие параметры. это утверждение заставляет меня поверить, что оно считывает только определенные значения под [default]   -  person ddavison    schedule 25.10.2016
comment
@sircapsalot, но и roles_path, и remote_tmp являются стандартными параметрами ansible.   -  person Ivan Velichko    schedule 25.10.2016
comment
о, моя ошибка. ты прав. если я что-то замечу, я дам вам знать   -  person ddavison    schedule 25.10.2016


Ответы (2)


Вы не можете сделать это из коробки.
Вам понадобится либо подключаемый модуль действия, либо подключаемый модуль vars для считывания различных параметров конфигурации.
Если вы используете подключаемый модуль действия, вам придется вызвать только что созданное действие, чтобы получить remote_tmp определено.
Если вы выберете способ плагина vars, remote_tmp будет определено с другими переменными хоста во время инициализации инвентаризации.

Пример ./vars_plugins/tmp_dir.py:

from ansible import constants as C

class VarsModule(object):

    def __init__(self, inventory):
        pass

    def run(self, host, vault_password=None):
        return dict(remote_tmp = C.DEFAULT_REMOTE_TMP)

Обратите внимание, что папка vars_plugins должна находиться рядом с вашим файлом hosts, или вы должны явно определить ее в своем файле ansible.cfg.

Теперь вы можете протестировать его с помощью:

$ ansible localhost -i hosts -m debug -a "var=remote_tmp"
localhost | SUCCESS => {
    "remote_tmp": "$HOME/.ansible/tmp"
}
person Konstantin Suvorov    schedule 25.10.2016

Вы можете использовать lookup.

file_ver: "1.5"
deb_file: "{{ lookup('ini', 'remote_tmp section=defaults file=ansible.cfg' }}/deb_file_{{ file_ver }}.deb"

ИЗМЕНИТЬ

Если вы не знаете путь к файлу конфигурации, вы можете установить его, выполнив следующие задачи.

- name: look for ansible.cfg, see http://docs.ansible.com/ansible/intro_configuration.html
  local_action: stat path={{ item }}
  register: ansible_cfg_stat
  when: (item | length) and not (ansible_cfg_stat is defined and ansible_cfg_stat.stat.exists)
  with_items:
    - "{{ lookup('env', 'ANSIBLE_CONFIG') }}"
    - ansible.cfg
    - "{{ lookup('env', 'HOME') }}/.ansible.cfg"
    - /etc/ansible/ansible.cfg

- name: set fact for later use
  set_fact:
    ansible_cfg: "{{ item.item }}"
  when: item.stat is defined and item.stat.exists
  with_items: "{{ ansible_cfg_stat.results }}"

Затем вы можете написать:

file_ver: "1.5"
deb_file: "{{ lookup('ini', 'remote_tmp section=defaults file=' + ansible_cfg) }}/deb_file_{{ file_ver }}.deb"
person kimamula    schedule 03.04.2017
comment
А что если ansible.cfg не в текущем каталоге? - person Konstantin Suvorov; 03.04.2017
comment
Иван написал, что у меня есть свой файл ansible.cfg, который находится в корне папки моего проекта, и это работает в этой ситуации. - person kimamula; 03.04.2017
comment
Я обновил свой ответ, чтобы он работал с любым ansible.cfg местоположением. - person kimamula; 03.04.2017
comment
Это не очень надежный метод. В некоторых конфигурациях произойдет сбой (macOS с установленным на Homebrew Python, вероятно, некоторые виртуальные окружения Python). Один из способов определить используемый файл конфигурации — запустить ansible-playbook --version и проанализировать вывод. Тем не менее, это может не дать того же результата, что и для текущего процесса. Кроме того, это не удастся, если настройки не было. - person techraf; 03.04.2017