LINUX.ORG.RU
решено ФорумAdmin

Ansible сравнение IP

 , ,


1

0

Здравствуйте уважаемые.

Пишу Вам т.к. у самого пока или знания или понимания не хватает. Начал изучать ansible на досуге. ansible --version -> ansible 2.8.1

Хочу настроить конфигурирование новых девайсов при помощи сего «чюда».

Затик на моменте отнесения девайса к региону. Из хостнейма витягиваю информацию об обозначении региона XX, но хочется добавить больше разума и проверять еще и по первим двум октетам IPv4.

    vars:
      regions: {
        "MK": {"region": "MK", "ip": "172.44"},
        "SP": {"region": "SP", "ip": "172.48"}
     }

Вопрос. Как «обрезать» первые два октета

{{ ansible_default_ipv4.address.split('.')[0] }}.{{ansible_default_ipv4.address.split('.')[1] }}

Работает хорошо, но нельзя засунуть в when (я пока в jinja2 не умею :( )

- debug:
    msg: "{{ item.key }} has region {{ item.value.region }} and ip {{ item.value.ip}}
  when:
    - "ansible_hostname.split('-')[0]|upper == item.value.region"
    - "{{ ansible_default_ipv4.address.split('.')[0] }}.{{ansible_default_ipv4.address.split('.')[1] }} == item.value.ip"  # не работает
  loop: "{{ regions|dict2items }}"

Вот такое есть условие - с одним условием в when - отрабативает хорошо. Когда пробую добавить, что-то типа

"ansible_default_ipv4.address == item.value.ip" - соот-нно ругается, говорит неверно (что не удивительно), т.к. работает не match, а точное соот-вие.

Если коротко - ниосилил. Дома буду курить man, но хочется и пообщатся с людьми знающими)


# {{ test_list | ipaddr('192.0.0.0/8') }}

Вангую, что вот моё решение.

By specifying a network range as a query, you can check if a given value is in that range:

# {{ test_list | ipaddr('192.0.0.0/8') }}
['192.24.2.1', '192.168.32.0/24']

Попробую - отпишу.

i3wm
() автор топика
Ответ на: # {{ test_list | ipaddr('192.0.0.0/8') }} от i3wm

Проблема в том, что нельзя сделать так.

when:
  - "ansible_default_ipv4.address | ipaddr( {{ item.value.ip }}/16)"

В item.value.ip должно подставиться значение в цикле. Добавляем переменную - и он сам прогоняет ее через цикл.

vars:
      regions: {
        "MK": {"region": "MK", "ip": "172.44.0.0"},
        "SP": {"region": "SP", "ip": "172.48.0.0"}
     }

С этим должен был бы справится шаблонизатор jinja2, но я с ним пока не разобрался :( Буду курить дальше.

P.S. Вот такой вариант с захардкоженим IP работает.

when:
  - "ansible_default_ipv4.address | ipaddr(172.48.0.0/16)"

P.P.S Полный код yml-файла

---
  - name: Index
    hosts: all
    gather_facts: yes
    become: yes
    become_method: sudo
    vars:
      regions: {
        "MK": {"region": "MK", "ip": "172.44.0.0"},
        "SP": {"region": "SP", "ip": "172.48.0.0"}
     }


    tasks:
      - name: Check OS version
        block:
          - debug:
              msg: "Not supported version OS. Need version OS => 10.11"

          - meta: end_play
        when: ansible_facts['distribution_version'] < "10.11.*" and ansible_facts['os_family'] == "Darwin"

      - name: Tasks for macOSX
        block:

        - debug:
            msg: "{{ item.key }} has region {{ item.value.region }} and ip {{ item.value.ip}}"
          when:
            - "ansible_hostname.split('-')[0]|upper == item.value.region"
            - "ansible_default_ipv4.address | ipaddr( {{ item.value.ip }}'/16')"
          loop: "{{ regions|dict2items }}"

        when: ansible_facts['distribution_version'] >= "10.11.*" and ansible_facts['os_family'] == "Darwin"
i3wm
() автор топика

Победил подстановку значения вот таким способом:

- debug:
            msg: "{{ item.key }} has region {{ item.value.region }} and ip {{ item.value.ip}}"
          when:
            - ansible_hostname.split('-')[0]|upper == item.value.region
            - ansible_default_ipv4.address | ipaddr( "{{ item.value.ip }}/16")
          loop: "{{ regions|dict2items }}"
i3wm
() автор топика

Чувак, мы понимаем твою эйфорию, что ты что-то там начал понимать в синтаксисе ямла, петона и ансибла. Строить с виду сложные конструкции. Но разбираться в этой рядовой петоновой фигне не будем.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.