#ansible #iptables #ansible-inventory
#ansible #iptables #ansible-инвентаризация
Вопрос:
Я пытаюсь применить правила iptable к набору хостов, где я хочу, чтобы все порты были открыты для хостов в определенной группе. Но я не могу запустить этот рецепт для всех хостов вместе в рабочей среде. Итак, я использую флаг —limit для запуска playbook. Но это не удается, выдавая приведенную ниже ошибку:
fatal: [test-vm1]: FAILED! => {"changed": false, "msg": "AnsibleUndefinedVariable: 'ansible.vars.hostvars.HostVarsVars object' has no attribute 'ansible_default_ipv4'"}
inventory-file
[all]
test-vm1 ansible_ssh_host=10.x.x.x
test-vm2 ansible_ssh_host=10.x.x.x
test-vm3 ansible_ssh_host=10.x.x.x
my-playbook.yml
- hosts: all
become: yes
gather_facts: yes
roles:
- iptables
список правил.j2
#Allow communication within hosts in a group
{% for host in groups['all'] %}
iptables -A INPUT -s {{ hostvars[host]['ansible_default_ipv4']['address'] }} -j ACCEPT
{% endfor %}
роли / iptables /задачи/main.yml
- name: Prepare iptables rules
template: dest='/etc/sysconfig/iptable-config' src=rules-list.j2 owner=root group=root mode=0744
notify: save iptables rules
Команда, которую я пытаюсь выполнить, это-
ansible-playbook -i inventory-file my-playbook.yml --limit test-vm1
Если я выполняю приведенную выше команду без флага limit, она выполняется нормально, без сбоев, т.Е.
ansible-playbook -i inventory-file my-playbook.yml
Ответ №1:
Я думаю, что ваш шаблон перебирает groups[all]
хосты и включает в себя ВСЕ хосты, а не только ограниченные. И поскольку вы ограничиваете доступ к некоторым хостам, ansible не собирает факты для остальных, и вашему шаблону не удается найти ipv4 для остальных хостов.
Вы пробовали ansible_play_batch
или ansible_play_hosts
? https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html
Комментарии:
1. Я хочу запустить правила для определенного набора хостов, используя флаг —limit . В моем инвентаре я намеренно сохранил хосты в группах [все], поскольку я хочу перебрать все хосты, чтобы собрать их ip / DNS-имя, чтобы разрешить трафик для всех этих IP-адресов. Я смог добиться этого, используя hostvars [host] [‘ansible_ssh_host’] реже, чем hostvars [host] [‘ansible_default_ipv4’] [‘адрес’]. Я думаю, что для получения ipv4-адреса ansible должен подключиться по ssh к этому конкретному хосту, который я ограничил только 1 хостом, но значение ansible_ssh_host сохраняется в host_vars при сканировании файла инвентаризации.