如何使用with_items让Ansible执行多个命令?

时间:2014-04-27 19:42:00

标签: shell ansible

我想使用Ansible配置UFW以允许从IP地址列表连接到端口80:

tasks:
    - name: Allow port 80 HTTP
      action: shell ufw allow from {{item}} to any 80/tcp
      with_items: allowed_ips

IP地址列表作为哈希存储在YAML文件中,在我的playbook的vars/目录中:

---
allowed_ips:
  xxx.xxx.xxx.xxx
  xxx.xxx.xxx.xxx

我正在使用with_items将IP地址拉入命令,但是当Ansible运行playbook时,它会连接IP地址,在每个IP之间插入一个空格:

ufw allow from xxx.xxx.xxx.xxx xxx.xxx.xxx.xxx to any 80/tcp

ufw不接受此语法,因此我想为每个IP地址运行ufw一次。我怎么能这样做?

2 个答案:

答案 0 :(得分:5)

Ansible 1.6有一个管理ufw的模块。 http://docs.ansible.com/ufw_module.html它支持您尝试实现的列表。

ufw: rule=allow src={{ item }} port=80 proto=tcp
with_items:
- 10.0.0.0/8
- 172.16.0.0/12
- 192.168.0.0/16

或者,您可以尝试https://galaxy.ansible.com ufw,其中有一些可以使用的{{1}}角色,其中一些也支持IP列表。

答案 1 :(得分:2)

Ansible行为正确,因为当前allowed_ips不是列表而是单个变量。将变量设为YAML列表:

---
allowed_ips:
  - xxx.xxx.xxx.xxx
  - xxx.xxx.xxx.xxx

现在,该动作的执行次数与allowed_ips列表中的项目一样多。