При разворачивании ansible-оркестрации на предприятии с географически распределённой сетевой инфраструктурой, может возникнуть ситуация, когда необходимо монтировать пользовательские домашние каталоги с разных серверов в зависимости от того, в какой сети (то есть в каком здании) они находятся.
Решение этой задачи я далее и приведу.
Приведу отрывок изначальной конфигурации, со статическим адресом сервера домашних каталогов:
- name: Update pam_mount
lineinfile:
path: /etc/security/pam_mount.conf.xml
regexp: "^<volume.*cifs"
insertafter: "<!-- Volume definitions -->"
line:
"<volume user=\"*\" fstype=\"cifs\" \
server=\"192.168.2.1\" path=\"%(USER)\" \
mountpoint=\"/home/%(USER)\" \
options=\"iocharset=utf8,rw,noperm,uid=%(USERUID),gid=%(USERGID)\" />"
Очевидно, правильным решением будет заменить этот адрес на переменную, которую нужно будет установить где-то ранее:
- name: Update pam_mount
lineinfile:
path: /etc/security/pam_mount.conf.xml
regexp: "^<volume.*cifs"
insertafter: "<!-- Volume definitions -->"
line:
"<volume user=\"*\" fstype=\"cifs\" \
server=\"{{ home_mount_server }}\" path=\"%(USER)\" \
mountpoint=\"/home/%(USER)\" \
options=\"iocharset=utf8,rw,noperm,uid=%(USERUID),gid=%(USERGID)\" />"
Для получения информации о текущей сетевой концигурации в ansible, а именно, адреса сети, воспользуемся ansible_default_ipv4.network
. В зависимости от него, с помощью тернарной операции, и будем выбирать нужный адрес сервера. Объявление переменной можно произвести, например, в секции pre_tasks
.
pre_tasks:
- name: Select home mount server
set_fact:
home_mount_server: "{{ (ansible_default_ipv4.network == OFFICE1_NETWORK) | ternary(HOME_MOUNT_SERVER_OFFICE1, HOME_MOUNT_SERVER_OFFICE2) }}"
Где OFFICE1_NETWORK
- адрес сети в одном из офисов, HOME_MOUNT_SERVER_OFFICE1
- адрес сервера домашних каталогов в этой же сети и HOME_MOUNT_SERVER_OFFICE2
- в другой.