У меня есть куча серверов в разных подсетях. Я хочу настроить точку монтирования 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