LINUX.ORG.RU
ФорумAdmin

Ansible задача

 , , ,


1

1
  1. Есть таск, который не делает корректно создание команды внутри файла.
    - name: TASK1
      lineinfile: 'dest=/etc/task1.txt line=""iptables -t nat -A POSTROUTING -s 10.0.{variable}.0/22 -j SNAT --to-source {{ item.value }}""'
      with_dict: ""{{ ansible_local.ip_addresses }}""
    
    Результат должен выглядеть таким образом
    iptables -t nat -A POSTROUTING -s 10.0.0.0/22 -j SNAT --to-source 1.1.1.1
    iptables -t nat -A POSTROUTING -s 10.0.4.0/22 -j SNAT --to-source 1.1.2.1
    iptables -t nat -A POSTROUTING -s 10.0.8.0/22 -j SNAT --to-source 1.1.3.1
    
    IP адрес вставляется при каждой итерации, а номера итерации, к примеру 0,4,8 вместо {variable} - нет. Каким образом можно создать какой-то пул переменных и загружать в зависимости от номера итерации?
  2. Вставлять только четные числа внутри файлов, или только не четные в зависимости от итерации. Например, если проходит операция с первым айпи адресом, то вставляет 0 и 2, если доп. айпи, то 3 и 4 и т.д.


Последнее исправление: beastie (всего исправлений: 3)

В чем прикол пихать в ансибл скрипты не обладающие свойством идемпотентности?

af5 ★★★★★
()
Ответ на: комментарий от NoHerohere

Идемпотентность - это когда операцию можно повторять много раз, и результат не изменится. Например, вызов rm с ключом -f является идемпотентным, а без него - нет (т. к. после первого раза выдаст ошибку о несуществующем файле).

anonymous
()
Ответ на: комментарий от NoHerohere

идемпотентность - свойство операции, когда при повторном исполнении результат не меняется. например, а=а+0=а+0+0=а+0+0+0=а - сколько бы раз мы не прибавили ноль, все равно получим а.

ваша операция не идемпотентна, потому что если ее выполнить второй раз, правила задублируются.

по вопросу - попробуйте вместо with_dict использовать with_indexed_items. тогда в item.0 у вас будет номер итерации, в item.1 - текущий объект, по-моему так.

l0stparadise ★★★★★
()

Файлы лучше создавать через template.

- name: TASK1
template: src=iptables.j2 dest=/etc/task1.txt

Файл iptables.j2:

{% for subnet in list_subnet %}
iptables -t nat -A POSTROUTING -s 10.0.{{ subnet.source }}.0/22 -j SNAT >--to-source {{ subnet.to-source }}
{% endfor %}

Что-то в этом духе.

nikita-b
()
Ответ на: комментарий от l0stparadise

Для ansible есть модули для управления iptables, но ни один из них не смог решить простые задачи что у нас стояли (часто из-за глупых багов).

Поэтому я тупо создал отдельную цепочку в iptables и ansible тупо каждый раз делает iptables -F mychain и добавляет правила заново. Нам для тестирования сойдёт :). В общем, иногда простой шелл-скрипт лучше кривых модулей ансибля.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

У меня аналогично. Сервера в ведении все разноплановые, любой оркестратор - оверхед, поэтому гораздо проще все на шелле набросать =)

l0stparadise ★★★★★
()

Заметил, что нормально поддерживаются только те сценарии, с которыми часто сталкиваются мейнтейнеры пакетов. Например, dagwieers занимается модулями, связанными с Windows, и активно правит там возникающие у него же в процессе эксплуатации баги.

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