Могу ли я получить IP-адреса всех хостов в файле инвентаризации при запуске playbook с флагом —limit?

#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 при сканировании файла инвентаризации.