null

Ansible: установка значения переменной в зависимости от адреса подсети

При разворачивании 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 - в другой.