LINUX.ORG.RU

Как в Ansible установить разные значения переменных для разных хостов?

 , , , ,


0

1

Мне нужно сделать разные настройки PostgreSql для хостов из разных групп. Ну, то есть, одни хосты «мощные» (armHosts), выделены для обслуживания многих процессов. Другие хосты «слабые» (kmHosts), обслуживают менее нагруженные задачи.

Сейчас я делаю так, и это только для одной переменной:

  - name: Set facts for kmHosts group
    set_fact: max_connection=100
    when: "'kmHosts' in group_names"

  - name: Set facts for armHosts group
    set_fact: max_connection=2000
    when: "'armHosts' in group_names"

  - name: Connection count
    debug: msg="{{ max_connection }}"

Но переменных много, и хотелось бы сократить код и сделать какой-нибудь таблицей.

Как можно более кратко сделать установку значения переменной для хостов из разных групп?

★★★★★

Ответ на: комментарий от AnDoR

Ещё можно использовать hiera
Она и будет твоей «таблицей».

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

Xintrea ★★★★★ ()
Ответ на: комментарий от Xintrea

Ммм, не очень удобно. В одном файле добавил переменную, в другом забыл, и этого сразу не видно.

Если дефолта какого-нибудь нету, то упадёт на неопределённой переменной.

Либо можно свой хак assert сделать с валидацией что переменные определены, не так уж сложно.

AnDoR ★★★★★ ()
Ответ на: комментарий от Xintrea

В теории:

- name: hiera lookup
  set_fact:
    max_connections: "{{ lookup('hiera', 'max_connection hostgroup=' ~ groupname) }}"

В любом случае в ансиболи регулярно не хватает фич hiera из puppet’а и даже вот этот вот lookup - костылище.

AnDoR ★★★★★ ()
Ответ на: комментарий от AnDoR

Понятия не имею :)

Вот и я не имею. В Ansible такой переменной нет. А если бы она была, я б не долбался, и сделал бы просто словарь, и использовал что-то наподобе:

myMap[{{ groupname }}].kernel_shmmax

Но понятия «текущая группа» при выполнении плейбуков нет. Есть понятие «текущие группы», представляемое переменной group_names, но эта не то что нам нужно.

Xintrea ★★★★★ ()
Ответ на: комментарий от Xintrea

Если тебе неудобен стандартный способ в ansible, не используй ansible.

P.S. Групповые переменные для этого и созданы, чтобы были разные значения для одной переменной.

На крайний случай можешь в файле инвентаря определить переменные:

[foo:vars]
var1='bla'

[bar:vars]
var1='alb'
FireFighter ★★★ ()
Последнее исправление: FireFighter (всего исправлений: 4)
Ответ на: комментарий от FireFighter

На крайний случай можешь в файле инвентаря определить переменные

Я бы определил переменные в отдельном файле инвентаря, но не могу найти инфы как как инклюдить инвентарные файлы один в другой.

Вот тут молчат как партизаны:

https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html

Инклюд вообще возможен?

Xintrea ★★★★★ ()
Ответ на: комментарий от Xintrea

Ммм, не очень удобно. В одном файле добавил переменную, в другом забыл, и этого сразу не видно.

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

Anoxemian ★★★★★ ()
Ответ на: комментарий от Xintrea

Инклюд вообще возможен?

Нет. А зачем?
Не понятно что ты хочешь на самом деле, зачем используется set_facts не для динамических переменных? Почему ты не хочешь использовать стандартные group_vars?

bass ★★★★★ ()
Ответ на: комментарий от Xintrea

есть понятие «текущий хост» и тебе доступны все переменные групп в которые он входит, если переменной нет, выстави дефолтное поведение
{{ hostvars[inventory_hostname].kernel_shmmax | default('128000') }}

в дополнение к инклудам - можно использовать симлинки в group_vars

загляни ещё сюда, правда я в твоей задаче не вижу динамики
https://docs.ansible.com/ansible/latest/user_guide/intro_dynamic_inventory.html

bass ★★★★★ ()
Последнее исправление: bass (всего исправлений: 2)
Ответ на: комментарий от AnDoR

нельзя - как был ямл, так и осталсч.

мы пользуемся папетом, но те же грабли везде - это туда не просунуть, то так не вынуть...

а забикс и нагиос ваще удивляют - вроде начинание хорошее, а реализация полное говно.

и что с этим всем делать яхз.

deep-purple ★★★★★ ()
Ответ на: комментарий от deep-purple

Что за грабли? Можешь привести небольшую задачу чтобы сразу было понятно.
Мы ушли с puppet на ansible, но из-за низкого порога вхождения девелоперов модулей. Там всё сложно в плане бизнеса, нужны были наглядные со свистелками дашборды для заказчиков. Не то чтобы эти разрабатываемые callback модули галерой в 30 человек как-то повлияли на общий функционал ansible, скорее это ara на стероидах.

bass ★★★★★ ()