2015-10-14 2 views
26

У меня есть большой Ansible playbook, где изображения Docker создаются при его запуске. Я использую все большее число в качестве тега для их версии. В настоящее время я должен указать это в каждом разделе hosts:.Можно ли определить переменные playbook-global в Ansible?

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

ответ

11

Если используемый вами тег/версия применим ко всем хостам, то использование group_vars/all является жизнеспособным вариантом.

Если номера версий специфичны для каждой записи хоста в файле host_vars/host_name, это может быть лучше.

Если вы хотите читать и начинать var, а затем увеличивать его после каждой игры, становится немного сложнее сохранить эту информацию во всех играх (или каждый -hosts, как вы говорите) в playbook. Например, если вы хотите развернуть N экземпляров Docker вы могли бы сделать некоторые динамические магии инвентаризации, как это:

- hosts: localhost 
    tasks: 
    - add_host: name=docker_{{item}} groups="dockers,other" tag={{item}} 
    with_sequence: start={{ext_def_start}} count={{ext_def_num}} 


- hosts: dockers 
    tasks: 
    - debug: var=tag 
+0

Я хотел иметь переменные в playbook, потому что у меня это в Git. Затем я прибегаю к обмену файлами инвентаря с переменными и должен его адаптировать. Мне нужны переменные в playbook, потому что, когда все настроено, они не меняются, но хосты в инвентаре могут. – rabejens

+0

Способы обращения с переменными немного неудобны, но это понятно, учитывая, что он сильно зависит от неявных включений (на основе инвентаря) и невозможности легко обменивать переменные между играми. Как показывает мой пример, я прибегал к использованию модулей инвентаризации для ввода данных в инвентарные вары. Факт (см. Модуль set_fact) сохраняется во всех играх, но они основаны на каждом хосте. Имейте в виду, что вы всегда можете написать быстрый скрипт (например, python) для создания динамического инвентаря, включая vars и группировки, который выглядит точно так, как вы хотите. – Petro026

+0

Я думал о чем-то подобном (написав сценарий, который генерирует инвентарь) сам, я думаю, что я это сделаю.Плей-лист предназначен для создания базового кластера Hadoop с поддержкой Spark/YARN, базы данных Cassandra и Zeppelin, и я могу написать сценарий, который сначала просит пользователя перечислить все хосты, а затем установить, какие хосты должны размещать какую службу. – rabejens

10

У Ansible есть группа по умолчанию all, которая, как ни странно, содержит все хосты в файле инвентаря.

Как вы можете сделать, как с любыми группами хостов, и предоставить group_vars для группы хозяев.

Как показано в предыдущей ссылке, они могут быть определены непосредственно в файле инвентаризации или могут содержаться в отдельном файле с именем после группы в каталоге group_vars на том же уровне каталога, что и файл инвентаризации. Структура каталогов

Примером может выглядеть примерно так:

-ansible 
|--inventory 
| |--group_vars 
| | |--all 
| | |--dev 
| | |--test 
| | |--prod 
| | |--webservers 
| | |--databases 
| |--dev 
| |--test 
| |--prod 
|--roles 
    ... 

Ваш файл инвентаризации DEV может выглядеть примерно так:

[dev:children] 
webservers 
databases 

[webservers] 
web1.dev 
web2.dev 

[databases] 
database-master.dev 
database-slave.dev 

Все эти хостами теперь подобрать любой хост конкретные конфигурации (которые могут быть определены либо в строке, либо как и в случае с group_vars, могут быть помещены в папку host_vars), а также config для определенных групп, в которых они находятся, например , а затем группы, на которые они также наследуются, например, dev b ut тоже, по умолчанию, all.

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

Возможно, что во всех случаях могут быть определены такие типы, как серверы NTP, в то время как DNS-серверы могут быть определены на уровне среды (если ваша сеть сегментирована в dev, для тестирования и производства они могут нуждаться в разных DNS-серверах в /etc/resolv.conf), в то время как разные типы серверов могут иметь разные конфигурации вокруг таких вещей, как списки устанавливаемых пакетов. Наконец, некоторые вещи, возможно, должны быть конкретными узлами, такими как установка идентификатора сервера MySQL в группе репликации.

Если, вместо этого, вы только хотите, чтобы определить PlayBook глобальные настройки, а не по инвентаризации (и поэтому могут быть доступны другим playbooks), то вам просто нужно vars блок в вашем play определение следующим образом:

- hosts: webservers 
    vars: 
    http_port: 80 
    tasks: 
    - name: Task1 to be ran against all the webservers 
     ... 

Как упоминалось ранее, вы всегда можете использовать all группу здесь:

- hosts: all 
    vars: 
    ntp_pool: 
     - ntp1.domain 
     - ntp2.domain 
    tasks: 
    - name: Task1 to be ran against all the servers 
     ... 

в общем, хотя, я бы настоятельно рекомендовал использовать роли структурировать то, что вещи побежал к определенным ч osts, а затем используя инвентарь, чтобы объяснить, какие серверы являются тем типом, а затем использовать параметр group_vars на уровне инвентаря, чтобы содержать все переменные для этих групп хостов. Ведение дел таким образом поможет вам сохранить вещи в разумных местах и ​​позволит вам легко повторно использовать базу кода.

+0

Хм, поставив '[{хосты: 'все', ПОСРЕДНИКОВ: {тест: 'hello'}}, {hosts: 'web': role: [...]} 'Когда я попадаю в роли после фазы установки на« все », я все равно получаю« переменную, которая не определена ». error: ( – ThorSummoner

+0

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

+0

Если вам интересно, я напишу свое решение. –

0

Да, глобальные вары возможны, как это,

образец установки Splunk Playbook

splunk/ 
    setup_splunk_playbook.yaml 
    roles/base 
      /tasks/main.yaml 
      /tasks/install.yaml 
     search_head 
      /tasks/configure.yaml 
     indexer 
      /tasks/configure.yaml 
     some_other_role 
      /tasks/some_task.yaml 
    hosts 
    config.yaml 

Поместите ВАР в config.yaml

кошка Splunk/config.yaml

--- 
# global Splunk variables 
splunk_version: 7.0.0 

в вашем PlayBook, включает в себя роли

кошка setup_splunk_playbook.yaml

- hosts: "search_heads" 
    become_user: root 
    become: true 
    gather_facts: true 

    roles: 
    - base 
    - search_head 

в своей роли, включает в себя глобальный Варсе внутри задача

роли кота/основание/задачи/main.yaml

--- 
# install Splunk Base 

- name: include vars 
    include_vars: "{{ playbook_dir }}/config.yaml" 

- include: install.yaml 

вары доступны в задачах теперь, роли

кошка/база/задачи/install.yaml

- name: echo version 
    debug: splunk version is {{ splunk_version }} 
+0

Не работает для использования переменных в свойстве «hosts:». – hakre

Смежные вопросы