Как установить переменные конфигурации ANSIBLE во время выполнения - PullRequest
4 голосов
/ 11 июля 2019

Мне нужно установить некоторые переменные конфигурации во время выполнения в playbook. Я попробовал следующее, но это не работает:

--> cat site.yml
- hosts: localhost
  tasks:
    - set_fact:
        log_path: "/home/monk/test/ansible_set_run_time"

- hosts: localhost
  environment:
    log_path: "{{ log_path }}"
  tasks:
    - shell: "echo $log_path"
      register: res

    - debug:
        msg: "log_path = {{ res.stdout }}"

ansible.cfg содержимое в текущем каталоге:

-->cat /home/monk/test/ansible.cfg
[defaults]
log_path = /home/monk/test/ansiblelog_from_cfg

При этом всегда создается файл журнала, установленный /home/monk/test/ansible.cfg, а не * log_path, установленным в книге воспроизведения.

Почему я не хочу использовать /etc/ansible/ansible.cfg, $PWD/ansible.cfg или $HOME/.ansible.cfg?

Причина: я буду запускать это на удаленном узле, где уже существует файл /etc/ansible/ansible.cfg, который содержит глобальные настройки, которые я не могу изменить. В то же время я не могу использовать $PWD/ansible.cfg, потому что мне также нужно содержание /etc/ansible/ansible.cfg.

Итак, TLDR, мне нужно прочитать содержимое /etc/ansible/ansible.cfg и локальное ansible.cfg и использовать их оба. Я могу объединить их все, но не могу контролировать изменения /etc/ansible/ansible.cfg, поэтому мои объединенные изменения могут быть устаревшими. Вот почему я хочу определить свою конфигурационную переменную, хранящуюся в книгах воспроизведения, и я буду продолжать читать /etc/ansible/ansible.cfg.

ansible --version
ansible 2.5.2
  config file = /home/monk/.ansible.cfg
  configured module search path = [u'/home/monk/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/local/lib/python2.7/dist-packages/ansible
  executable location = /usr/local/bin/ansible
  python version = 2.7.15rc1 (default, Nov 12 2018, 14:31:15) [GCC 7.3.0]

Я вижу, что set_fact показывает желаемое значение, но log_path не вступает в силу для playbook:

ansible-playbook  -i data.ini  playbook.yml

PLAY [localhost] **********************************************************************************************************************************************************************************************

TASK [Gathering Facts] ****************************************************************************************************************************************************************************************
ok: [127.0.0.1]

TASK [set_fact] ***********************************************************************************************************************************************************************************************
ok: [127.0.0.1]

PLAY [localhost] **********************************************************************************************************************************************************************************************

TASK [Gathering Facts] ****************************************************************************************************************************************************************************************
ok: [127.0.0.1]

TASK [command] ************************************************************************************************************************************************************************************************
changed: [127.0.0.1]

TASK [debug] **************************************************************************************************************************************************************************************************
ok: [127.0.0.1] => {
    "msg": "log_path = /home/monk/test/ansible_set_run_time"
}

PLAY RECAP ****************************************************************************************************************************************************************************************************
127.0.0.1                  : ok=5    changed=1    unreachable=0    failed=0

Ответы [ 2 ]

2 голосов
/ 11 июля 2019

Попробуйте ниже. Вы можете установить с помощью переменной среды оболочки.

export ANSIBLE_LOG_PATH="/home/monk/test/ansible_set_run_time"
ansible-playbook playbook.yml 
0 голосов
/ 12 июля 2019

Это не модификация переменной конфигурации во время выполнения, но это может помочь суть вашего требования. Вы можете прочитать все файлы конфигурации и объединить их в $PWD/ansible.cfg.

Это приоритет файлов ansible.cfg, читаемых ansible:

ANSIBLE_CONFIG (environment variable if set)
ansible.cfg (in the current directory)
~/.ansible.cfg (in the home directory)
/etc/ansible/ansible.cfg

Итак, вам нужно начать чтение, начиная с следующей последовательности, чтобы вы могли сохранить приоритет:

/etc/ansible/ansible.cfg
~/.ansible.cfg (in the home directory)
ansible.cfg (in the current directory)
ANSIBLE_CONFIG (environment variable if set)

Что это будет делать:

Это сохранит вашу конфигурацию одновременно с сохранением конфигурации других файлов ansible.cfg. Конечно, это перезапишет перекрывающиеся переменные между файлами, сохраняя приоритет перед последним файлом.

Начиная с версии 2.6 это единственное известное решение. Обратите внимание, что чем позже переменная в объединенном файле, она будет перезаписывать предыдущее вхождение этой же переменной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...