Динамическое создание строк в инвентаре Ansible

У меня есть вопрос, когда я использовал роль Ansible NFS.

Роль NFS: https://github.com/geerlingguy/ansible-role-nfs

Моя ситуация такова: мы создадим список виртуальных машин, которые являются клиентами NFS. И нам нужен контроль доступа на сервере NFS. Итак, мы устанавливаем список с именем «nfs_exports» в инвентаре Ansible в соответствии с ролью, указанной выше.

Некоторые виртуальные машины будут остановлены и выведены из эксплуатации после полной рабочей нагрузки. И мы перезапустим плейбук, включая роль NFS, чтобы обновить настройки сервера NFS. Итак, есть группа хостов 'client_group', и количество хостов является переменным.

Если виртуальная машина одна, список nfs_exports будет таким:

nfs_clients: "{{ groups['client_group'] }}"
nfs_exports:
- "{{ nfs_dirs[0] }}  {{ nfs_clients[0] }}(rw)"
- "{{ nfs_dirs[1] }}  {{ nfs_clients[0] }}(ro)"

А если есть две ВМ,

nfs_clients: "{{ groups['client_group'] }}"
nfs_exports:
- "{{ nfs_dirs[0] }}  {{ nfs_clients[0] }}(rw) {{ nfs_clients[1] }}(rw)"
- "{{ nfs_dirs[1] }}  {{ nfs_clients[0] }}(ro) {{ nfs_clients[1] }}(ro)"

А если есть три ВМ,

nfs_clients: "{{ groups['client_group'] }}"
nfs_exports:
- "{{ nfs_dirs[0] }}  {{ nfs_clients[0] }}(rw) {{ nfs_clients[1] }}(rw) {{ nfs_clients[2] }}(rw)"
- "{{ nfs_dirs[1] }}  {{ nfs_clients[0] }}(ro) {{ nfs_clients[1] }}(ro) {{ nfs_clients[2] }}(ro)"

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

Мне нужно динамически построить строки в списке 'nfs_exports'. Таким образом, если есть одна виртуальная машина, в nfs_exports будет только один клиент. Если ВМ несколько, все ВМ должны автоматически включаться в nfs_exports.

Может ли кто-нибудь предоставить решение о создании строк в «nfs_exports», чтобы не изменять «nfs_exports» вручную при изменении «client_group»?


person Hao Zhang    schedule 16.01.2017    source источник


Ответы (1)


Ну вот:

- hosts: localhost
  gather_facts: no
  vars:
    nfs_clients:
      - server1
      - server2
      - server3
    nfs_dirs:
      - path1
      - path2
    nfs_exports:
      - "{{ nfs_dirs[0] }} {{ ' '.join(nfs_clients | map('regex_replace','$','(rw)')) }}"
      - "{{ nfs_dirs[1] }} {{ ' '.join(nfs_clients | map('regex_replace','$','(ro)')) }}"
  tasks:
    - debug: var=nfs_exports

Выход:

ok: [localhost] => {
    "nfs_exports": [
        "path1 server1(rw) server2(rw) server3(rw)",
        "path2 server1(ro) server2(ro) server3(ro)"
    ]
}
person Konstantin Suvorov    schedule 16.01.2017
comment
Я проверил ваш код, и он работает нормально. Большое спасибо! - person Hao Zhang; 16.01.2017