Как зарегистрировать переменную в ansible на основе другой переменной? - PullRequest
1 голос
/ 11 марта 2020

У меня есть куча серверов в разных подсетях. Я хочу настроить точку монтирования NFS для каждого, выбрав, какой NFS-сервер зависит от того, на каком su bnet они работают. Я легко могу сделать это с несколькими кодовыми блоками, каждый из которых имеет свое условие when, но с более чем несколькими сетями это приводит к огромному количеству дублирования кода:

- name: mount /home for 192.168.1.0
  mount:
    path: /home
    src: nfsserver-1.domain.net:/vol/home
    fstype: nfs
    opts: tcp,hard,intr,bg
    state: mounted
  when: ansible_default_ipv4.network == '192.168.1.0'

- name: mount /home for 192.168.2.0
  mount:
    path: /home
    src: nfsserver-2.domain.net:/vol/home
    fstype: nfs
    opts: tcp,hard,intr,bg
    state: mounted
  when: ansible_default_ipv4.network == '192.168.2.0'

Как можно Ли я зарегистрировать переменную, основанную на другой переменной? Когда я пытаюсь выполнить приведенный ниже блок кода, происходит сбой, поскольку несколько задач регистрируются detected_nfs_server и конфликтуют друг с другом. (Переменная не просто регистрируется, когда применяется блок when).

- name: detected_nfs_server initialize to blank
  shell: echo ''
  register: detected_nfs_server
  changed_when: False

- name: detected_nfs_server nfsserver-1.domain.net
  shell: echo 'nfsserver-1.domain.net'
  register: detected_nfs_server
  when: ansible_default_ipv4.network == '192.168.1.0'
  changed_when: False

- name: detected_nfs_server nfsserver-2.domain.net
  shell: echo 'nfsserver-2.domain.net'
  register: detected_nfs_server
  when: ansible_default_ipv4.network == '192.168.2.0'
  changed_when: False

- name: Fail detected_nfs_server
  fail:
    msg: "'domain.net' not in detected_nfs_server.stdout"
  when: "'domain.net' not in detected_nfs_server.stdout"

- name: mount /home
  mount:
    path: /home
    src: {{ detected_nfs_server.stdout }}:/vol/home
    fstype: nfs
    opts: tcp,hard,intr,bg
    state: mounted

На данный момент лучшее решение, которое я нашел, - это запустить скрипт оболочки, как показано ниже. Это прекрасно работает, но требует использования сценария оболочки вместо манипулирования переменными внутри ansible. Есть ли хороший способ зарегистрировать переменную в ansible, основанную на другой переменной, а не в зависимости от сценария оболочки?

- name: detect_nfs_server
  shell: if [ '{{ ansible_default_ipv4.network }}' = '192.168.1.0' ] ; then echo 'nfsserver-1.domain.net' ; elif [ '{{ ansible_default_ipv4.network }}' = '192.168.2.0' ] ; then echo 'nfsserver-2.domain.net' ; else echo 'domain not detected' ; fi
  register: detected_nfs_server
  changed_when: False

- name: fail if domain not detected
  fail:
    msg: 'domain not detected'
  when: detected_domain.stdout == 'domain not detected'

- name: mount /home
  mount:
    path: /home
    src: {{ detected_nfs_server.stdout }}:/vol/home
    fstype: nfs
    opts: tcp,hard,intr,bg
    state: mounted

Ответы [ 2 ]

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

Есть еще варианты. Можно использовать словарь (хранится в group_vars?). Например,

vars:
  detected_nfs_server:
    192.168.1.0: nfsserver-1.domain.net
    192.168.2.0: nfsserver-2.domain.net
    192.168.3.0: nfsserver-3.domain.net
tasks:
- name: mount /home
  mount:
    path: /home
    src: "{{ detected_nfs_server[ansible_default_ipv4.network] }}:/vol/home"
    fstype: nfs
    opts: tcp,hard,intr,bg
    state: mounted

Следующая опция - генерировать имя сервера. Например

- set_fact:
    detected_nfs_server: "{{ 'nfsserver-' ~
                              address.split('.').2 ~
                             '.domain.net' }}"
- name: mount /home
  mount:
    path: /home
    src: "{{ detected_nfs_server }}:/vol/home"
    fstype: nfs
    opts: tcp,hard,intr,bg
    state: mounted
1 голос
/ 11 марта 2020

одним из вариантов может быть загрузка файла var с каждого из серверов NFS в разных подсетях. Тогда вы можете ссылаться на переменные.

nfs1 = 192.168.1.x
nfs2 = 192.168.2.x
nfs3 = 192.168.3.x
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...