Отобразить специальный файл в зависимости от сети с помощью ansible - PullRequest
1 голос
/ 08 января 2020

Мне нужна помощь. Я хочу развернуть некоторые файлы с некоторыми изменениями. Политика развертывания такова, что в зависимости от сети, к которой принадлежит сервер, он будет развертывать некоторые файлы или другие.

Моя идея состоит в том, чтобы создать .yml (Определение сетей) с именем сетей. (vars_file)

Например:

Работа: 192.168.2.XXX Тип файла отправки A

Офис: 192.168.3.XXX

Мой главный Идея заключалась в том, чтобы использовать условия в Ansible.

Когда сервер имеет интерфейс, который принадлежит 192.168.2.XXX, он отправляет текстовый файл, например.

Когда он принадлежит 192.168 .3.XXX отправляет аудиофайл

Варианты файлов:

---

vlan:
- networkname: Work
  netname: 192.168.3.0
  netmask: 255.255.255.0
  netface: "{{vars.ansible_facts[ansible_interfaces]}}"

Playbook

- name: Test move
  hosts: all
  vars_files:
   - vlan.yml
  tasks:
    - name: Copy
      copy:
         src:  "/tmp/file.mp3"
         dest: "/opt/tmp/file.mp3"
      when: 
        - (hostvars[inventory_hostname]['ansible_%s' % item]|default({})).get('ipv4', {}).get('address') = {{item.netname}}
      with_items:
        - "{{vlan.netface}}"

Первый сбой:

"FAILED! => {"msg": "dict object has no element [u'lo', u'ens192', u'ens160']"}"

Ответы [ 3 ]

0 голосов
/ 09 января 2020

Я не могу заставить условие работать.

Я изменил get "addres" через "сеть"

(hostvars [инвентарь-имя_хоста] ['ansible_ % s '% item.1] | default ({})). get (' ipv4 ', {}). get (' address ') = {{item.0.netname}}

(hostvars [инвентарь_хоста] ['ansible_% s'% item.1] | по умолчанию ({})). get ('ipv4', {}). get ('network') = {{item.0.netname}}

Сообщение об ошибке:

FAILED! => {"msg": "Условная проверка" (hostvars [имя_хоста_ инвентаря] ['ansible_% s'% item.1] | default ({})) .get ('ipv4', {}). get ('network ') = {{item.0.netname}}' не удалось. Ошибка была: Обнаружено недопустимое условие: недопустимый синтаксис (, строка 1) \ n \ nОшибка обнаружена в «test.yml»: строка 8, столбец 6 , но может \ n находиться в другом месте файла, в зависимости от точной синтаксической проблемы. \ n \ nВредной строкой является: \ n \ n tasks: \ n - name: Copy \ n ^ here \ n "}

Playbook:

  tasks:
   - name: Copy
     copy:
      src: "/tmp/file.mp3"
      dest: "/opt/tmp/file.mp3"
     when:
      (hostvars[inventory_hostname]['ansible_%s' % item.1]|default({}))
       .get('ipv4', {}).get('network') = {{item.0.netname}}
     with_subelements:
      - "{{ vlan }}"
      - netface

BR

Thx @ Zeitounator

0 голосов
/ 15 января 2020

Я хочу упростить

Я хочу создать файл, только если сервер принадлежит определенной сети.

---
- name: Create file
  hosts: server
  gather_facts: true
  vars:
    vlan:
      - netname: 192.168.3.0
        netface: "{{ ansible_interfaces }}"

Задачи:

  tasks:
   - name: 
     file:
      path: /tmp/filetest
      state: touch
     when:
        (hostvars[inventory_hostname]['ansible_%s' % item.0.netface]|default({}))
        .get('ipv4', {}).get('network') == item.0.netname
     loop:
     - "{{ vlan }}"

У меня есть сеть 192.168.3.0, но она не создает файл.

 ok: [server] => {
    "ansible_default_ipv4.network": "192.168.3.0"
}

 skipping: [server] => (item=[{u'netface': [u'lo', u'eth3', u'eth2', u'eth1', u'eth0'], u'netname': u'192.168.3.0'}])  => {
    "ansible_loop_var": "item", 
    "changed": false, 
    "item": [
        {
            "netface": [
                "lo", 
                "eth3", 
                "eth2", 
                "eth1", 
                "eth0"
            ], 
            "netname": "192.168.3.0"
        }
    ], 
    "skip_reason": "Conditional result was False"
}

Мне нужен способ узнать, как сравнивать важные факты со значением в переменной.

Спасибо

0 голосов
/ 09 января 2020

Несколько проблем в приведенном выше примере.

Текущая ошибка, которую вы получаете, связана с объявлением vlan.yml. Следующая строка будет вызывать ошибку каждый раз, когда она интерпретируется, в результате чего весь ваш vlan var все равно будет неопределенным.

netface: "{{vars.ansible_facts[ansible_interfaces]}}"
  1. ansible_interfaces - это ключ (в виде строки), в котором вы находитесь используя его значение.
  2. Вам не нужно искать этот факт, он уже доступен непосредственно

Вы можете исправить с помощью следующего:

netface: "{{ ansible_interfaces }}"

Теперь ваш vlan var окончательно определен

Ваша следующая проблема - vlan - это список, поэтому vlan.netface не существует ... но vlan[0].netface существует. Если вы хотите l oop на каждом интерфейсе каждого vlan, самый простой способ здесь - это использовать подэлементов l oop.

Следующее (не проверено) должно поставить вас на правильном пути

    - name: Copy
      copy:
         src:  "/tmp/file.mp3"
         dest: "/opt/tmp/file.mp3"
      when: 
        - (hostvars[inventory_hostname]['ansible_%s' % item.1]|default({})).get('ipv4', {}).get('address') = {{item.0.netname}}
      with_subelements:
        - "{{ vlan }}"
        - netface

У вас могут быть другие проблемы, которые нужно исправить в предложении when, которые я не смог проверить на этом этапе.

...