Ansible — установить путь к среде в качестве переменной инвентаря

Медиаплееру Osmc требуется определенный путь для плейбуков https://github.com/osmc/osmc/issues/319

environment:
  PATH: "{{ ansible_env.PATH }}:/sbin:/usr/sbin"

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

При обычном использовании - может ли этот путь вызвать проблемы для обычных машин * nix, если он реализован на установках, отличных от osmc?

Если вы не можете установить это как переменную инвентаря: это только потому, что это не реализовано/полезно для большинства? Или потому, что инвентарь не имеет отношения к пути - например. он не вызывается в этот момент?

Или для всего этого лучше использовать переменную/задачу, специфичную для машины, в роли? Как бы это выглядело, пожалуйста?

Новичок в ansible и все еще пытаюсь понять некоторые концепции.


person beardedfool    schedule 28.08.2018    source источник
comment
Ключевое слово environment можно использовать только на уровне задачи или сборника сценариев. Почему вы должны использовать разные плейбуки? Просто переменные по умолчанию для вашей функциональности. Помните, что вы работаете над проблемой.   -  person imjoseangel    schedule 29.08.2018
comment
Спасибо imjoseaangel. Приятно знать об окружающей среде, и если это ответ, не стесняйтесь исправлять его как таковой, и я приму это. Просто переменные по умолчанию для вашей функциональности. Не могли бы вы объяснить немного подробнее, пожалуйста? Установить переменные на основе роли? Или применить этот путь ко всем машинам, потому что обычно это нормально? Извините, если я глуп, каждый день узнаю больше об этом, но еще не совсем там. Продолжайте ходить по старой документации/учебникам, где это изменилось.   -  person beardedfool    schedule 30.08.2018


Ответы (1)


Как уже говорилось, ключевое слово environment можно использовать только на уровне задачи или сборника сценариев.

Вы сможете использовать стандартный playbook, просто добавив следующее:

---
- name: Environment
  hosts: localhost
  connection: local
  gather_facts: False

  tasks:

  - name: Setup
    setup:
      gather_subset:
        - "!all"

or

---
- name: Environment
  hosts: localhost
  connection: local
  gather_facts: True
  gather_subset:
    - "!all"

Если вы отлаживаете переменную:

---
- name: Environment
  hosts: localhost
  connection: local
  gather_facts: False

  tasks:

  - name: Setup
    setup:
      gather_subset:
        - "!all"

  - name: Debug
    debug:
      var: ansible_env.PATH

Вы получите что-то вроде:

TASK [Setup] *******************************************************************************************************************************************************
ok: [localhost]

TASK [Debug] *******************************************************************************************************************************************************
ok: [localhost] => {
    "ansible_env.PATH": "/Users/imjoseangel/source/venv/ansible/bin:/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"
}

А что, если вы хотите передать эту переменную в другую игру с другим инвентарем?

Просто сделай hostvars.localhost.ansible_env.PATH

- name: Environment2
  hosts: windows
  connection: local
  gather_facts: False


  tasks:

  - name: Debug
    debug:
      var: hostvars.localhost.ansible_env.PATH

Итак

environment:
  PATH: "{{ ansible_env.PATH }}:/sbin:/usr/sbin"

Будет действителен только с модулем collect_facts или setup в рамках определенного инвентаря, но вам не нужно разбивать плейбуки.

person imjoseangel    schedule 30.08.2018