Ansible Как определить связанные хосты? - PullRequest
1 голос
/ 13 февраля 2020

Я использую Ansible для создания многосерверной среды, в которой находятся два набора серверов баз данных в конфигурации «главный-подчиненный», то есть всего четыре хоста.

Мой файл инвентаря в настоящее время настроен следующим образом:

[dbmaster]
set1-db-master
set2-db-master

[dbslave]
set1-db-slave
set2-db-slave

В книгах игр я обычно использую пункты when, чтобы различать guish между мастерами и рабами как часть общей установки. Например:

  - name: Stop the Slave Database. 
    command: systemctl stop mysql
    when: inventory_hostname in groups['dbslave']

, который отлично подходит для большинства задач. Однако сейчас у меня есть одна конкретная проблема, и я не могу придумать, как правильно ее решить. При настройке конфигурации «ведущий / ведомый» я должен иметь возможность собрать вместе 10 ie соответствующего главного и подчиненного, но их может быть больше одного!

То есть set1-db-slave должен знать, на какого мастера он должен указывать: set1-db-master или set2-db-master.

Я предполагаю, что процесс будет следующим:

  1. сначала выясните, какую позицию занимает текущий узел в массиве groups['dbslave'], и
  2. , затем используйте это для ссылки groups.dbslave[i]

Но является ли это безопасным предположением относительно позиций массива? И даже тогда я не уверен в синтаксисе для достижения этого.

1 Ответ

1 голос
/ 13 февраля 2020

Q: "Как определить связанные хосты? "

A: Возможно создать словарь и использовать его позже. Например,

- hosts: all
  tasks:
    - set_fact:
        dbsrv: "{{ dict(groups.dbmaster|sort|zip(groups.dbslave|sort)) }}"
      run_once: true
    - debug:
        var: dbsrv
      run_once: true

- hosts: dbmaster
  tasks:
    - debug:
        msg: "Related slave: {{ dbsrv[inventory_hostname] }}"

дает

ok: [set1-db-master] => {
    "dbsrv": {
        "set1-db-master": "set1-db-slave", 
        "set2-db-master": "set2-db-slave"
    }
}

ok: [set1-db-master] => {
    "msg": "Related slave: set1-db-slave"
}
ok: [set2-db-master] => {
    "msg": "Related slave: set2-db-slave"
}

Q: «Но безопасное ли это предположение относительно позиций массива?»

A: Можно создавать алфавитные отношения (например, set1-db-master: set1-db-slave) и использовать фильтр sort

dbsrv: "{{ dict(groups.dbmaster|sort|zip(groups.dbslave|sort)) }}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...