在 jinj2a 模板中循环主机,尊重 --limit
loop over hosts in jinj2a template, respecting --limit
我知道 ansible 支持这种形式的模板循环:
{% for host in groups['all'] %}
"{{ host }}"{% if not loop.last %},{% endif %}
{% endfor %}
当我 运行 ansible 时,这会循环遍历主机文件中的所有内容,正如人们所期望的那样。
当我 运行 使用 --limit 命令行参数 ansible 时,我只想循环匹配限制的主机。有没有办法在 jinja2 模板中表达该循环?
您可以使用 vars
中的 play_hosts
变量,例如:
{% for host in vars['play_hosts'] %}
"{{ host }}"{% if not loop.last %},{% endif %}
{% endfor %}
想象一下这个设置:
# hosts
[all-hosts]
ansible ansible_ssh_host=192.168.42.2
webapp ansible_ssh_host=192.168.42.10
postgresql ansible_ssh_host=192.168.42.20
#playbook.yml
---
- hosts: all
gather_facts: no
tasks:
- name: Hosts
template: src=myhosts.j2 dest=./myhosts.json
delegate_to: 127.0.0.1
run_once: yes
然后 运行 它没有限制会给你相同的结果,但是当你指定限制时它只会产生 "limited" 主机名:
ansible-playbook -i hosts playbook.yml --limit postgresql,ansible
输出:
"ansible", "postgresql"
我知道 ansible 支持这种形式的模板循环:
{% for host in groups['all'] %}
"{{ host }}"{% if not loop.last %},{% endif %}
{% endfor %}
当我 运行 ansible 时,这会循环遍历主机文件中的所有内容,正如人们所期望的那样。
当我 运行 使用 --limit 命令行参数 ansible 时,我只想循环匹配限制的主机。有没有办法在 jinja2 模板中表达该循环?
您可以使用 vars
中的 play_hosts
变量,例如:
{% for host in vars['play_hosts'] %}
"{{ host }}"{% if not loop.last %},{% endif %}
{% endfor %}
想象一下这个设置:
# hosts
[all-hosts]
ansible ansible_ssh_host=192.168.42.2
webapp ansible_ssh_host=192.168.42.10
postgresql ansible_ssh_host=192.168.42.20
#playbook.yml
---
- hosts: all
gather_facts: no
tasks:
- name: Hosts
template: src=myhosts.j2 dest=./myhosts.json
delegate_to: 127.0.0.1
run_once: yes
然后 运行 它没有限制会给你相同的结果,但是当你指定限制时它只会产生 "limited" 主机名:
ansible-playbook -i hosts playbook.yml --limit postgresql,ansible
输出:
"ansible", "postgresql"