Совместное использование или включение переменных для указанных c задач в Ansible - PullRequest
0 голосов
/ 25 марта 2020

У меня есть следующая книга воспроизведения:

# Some tasks which uses the default user specified in group_vars/all

- name: Check if installer exists
  win_stat:
    path: \\path_to_installer\installer.exe
  vars:
    # TODO Reuse variables
    ansible_become: yes
    ansible_become_method: runas
    ansible_become_user: "{{ network_share_user }}"
    ansible_become_password: "{{ network_share_user_pw }}"
    ansible_become_flags: logon_type=new_credentials logon_flags=netcredentials_only
  register: installer_info

- name: Run installation
  win_package:
    path: \\path_to_installer\installer.exe
    product_id: '...'
    arguments: '/q'
  vars:
    # TODO Reuse variables
    ansible_become: yes
    ansible_become_method: runas
    ansible_become_user: "{{ network_share_user }}"
    ansible_become_password: "{{ network_share_user_pw }}"
    ansible_become_flags: logon_type=new_credentials logon_flags=netcredentials_only
  when: installer_info.stat.exists == True

# Some other tasks

Пользователь для обычных задач определен в group_vars/all, но если мне нужен доступ к общему сетевому ресурсу, я должен использовать пользователя c generi. (см. раздел «Playbook vars» выше).

Как я могу поделиться этим блоком переменных только для указанных c задач «сетевой диск»? Не влияет на другие задачи в сборнике.

Лучше всего поместить переменные в отдельный файл и включить их в задачи, например, с помощью include_vars или vars_files. Но, к сожалению, эти команды нельзя использовать для конкретных c задач.

Ответы [ 3 ]

0 голосов
/ 30 марта 2020

Это невозможно с ansible. Руководство по использованию переменных гласит, что по поводу области видимости:

Ansible имеет 3 основных области действия:

Global: это устанавливается конфигурацией, переменными среды и командная строка Play: каждая игра и содержащиеся в ней структуры, записи переменных (vars; vars_files; vars_prompt), значения по умолчанию для ролей и переменные. Хост: переменные, непосредственно связанные с хостом, такие как инвентарь, include_vars, факты или выходные данные зарегистрированных задач

0 голосов
/ 08 апреля 2020

Поскольку, похоже, нет общего решения, я искал альтернативы, которые хотя бы охватывают этот вариант использования.

Подход 1: Использование блока и определение переменные для всего блока:

- block:
  - name: Check if installer exists
    win_stat:
      path: \\path_to_installer\installer.exe
    register: installer_info

  - name: Run installation
    win_package:
      path: \\path_to_installer\installer.exe
      product_id: '...'
      arguments: '/q'
    when: installer_info.stat.exists == True
  vars:
      ansible_become: yes
      ansible_become_method: runas
      ansible_become_user: "{{ network_share_user }}"
      ansible_become_password: "{{ network_share_user_pw }}"
      ansible_become_flags: logon_type=new_credentials logon_flags=netcredentials_only

Подход 2: Пройдем немного дальше (если у вас несколько одинаковых блоков). Используйте отдельный файл и включите его:

Файл install_software.yml:

- block:
  - name: Check if installer exists
    win_stat:
      path: "{{ path }}"
    register: installer_info

  - name: Run installation
    win_package:
      path: "{{ path }}"
      product_id: "{{ product_id }}"
      arguments: "{{ arguments }}"
    when: installer_info.stat.exists == True
  vars:
      ansible_become: yes
      ansible_become_method: runas
      ansible_become_user: "{{ network_share_user }}"
      ansible_become_password: "{{ network_share_user_pw }}"
      ansible_become_flags: logon_type=new_credentials logon_flags=netcredentials_only

Основная книга воспроизведения:

- import_tasks: install_software.yml
  vars:
    path: \\path_to_installer\installer1.exe
    product_id: '...'
    arguments: '/q'

- import_tasks: install_software.yml
  vars:
    path: \\path_to_installer\installer2.exe
    product_id: '...'
    arguments: '/q'
0 голосов
/ 26 марта 2020

Короче говоря:

- name: "Your Playbook"
  hosts:
    - your_host

  vars:
    ansible_become: yes
    ansible_become_method: runas
    ansible_become_user: "{{ network_share_user }}"
    ansible_become_password: "{{ network_share_user_pw }}"
    ansible_become_flags: logon_type=new_credentials logon_flags=netcredentials_only

  tasks:
  - name: Check if installer exists
    win_stat:
      path: \\path_to_installer\installer.exe
    register: installer_info

  - name: Run installation
    win_package:
      path: \\path_to_installer\installer.exe
      product_id: '...'
      arguments: '/q'
    when: installer_info.stat.exists == True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...