Перечислять хосты в ansible - PullRequest
0 голосов
/ 13 марта 2020

В процессе установки инструмента на Linux серверах с использованием Ansible я хотел бы настроить файл конфигурации с уникальным номером внутри кластера.

Представьте себе 3-узел cluster

[mycluster]
machine07
machine08
machine09

Конфигурация - это просто файл шаблона, настроенный в зависимости от компьютера:

- template:
    src: admin.json.j2
    dest: /home/my_user/tool/mytool/admin.json

Этот шаблон содержит такие динамические элементы c:

...
"contextPath": "/web-interface-{{id_number}}",
...

Я бы хотел найти способ правильно настроить эту динамическую c деталь, например:

на машине07:

...
"contextPath": "/web-interface-1",
...

на машине08

...
"contextPath": "/web-interface-2",
...

на машине09

...
"contextPath": "/web-interface-3",
...

Как я мог это сделать?

Я пытался использовать скрипт оболочки, в настоящее время я борюсь с индексами, но у меня не так много успеха, если он Возможно, я не хочу создавать файл инвентаризации для каждого узла. У вас есть идея, как мне это сделать?

спасибо за аванс

Ответы [ 2 ]

1 голос
/ 13 марта 2020

Я думаю, что может быть несколько способов. Первый способ, который приходит мне в голову, - это использование index() в группе. Я попробовал эту простую книгу:

---
- name: test enumerate
  hosts: all
  gather_facts: no
  tasks:
    - debug:
        msg: "host-{{ groups['mycluster'].index(inventory_hostname) }}"

С вашим инвентарем это дает:

TASK [debug] *********
ok: [machine07] => {
    "msg": "host-0"
}
ok: [machine08] => {
    "msg": "host-1"
}
ok: [machine09] => {
    "msg": "host-2"
}

Так что в вашем шаблоне вы можете попробовать что-то вроде:

"contextPath": "/web-interface-{{ groups['mycluster'].index(inventory_hostname) }}",

Второй способ - использовать хост-переменные. Например, инвентарь будет:

[mycluster]
machine07 num=1
machine08 num=2
machine09 num=3

И в шаблоне вы будете использовать:

"/web-interface-{{ hostvars[inventory_hostname].num }}"

Это даст тот же результат, что и выше.

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

Я использовал первую идею Рольфа с небольшими изменениями.

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

- set_fact:
   id_number: "{{ansible_play_hosts.index(inventory_hostname) + 1 }}"

- template:
    src: admin.json.j2
    dest: /home/my_user/tool/mytool/admin.json

И в шаблоне

...
"contextPath": "/web-interface-{{id_number}}",
...

Итак, в конце мы получаем другое значение в зависимости от хоста, оценивающего индексный номер + 1

на машине07:

...
"contextPath": "/web-interface-1",
...

в machine08

...
"contextPath": "/web-interface-2",
...

на машине09

...
"contextPath": "/web-interface-3",
...

Спасибо!

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