Ansible:为每个任务使用默认变量

时间:2016-04-13 12:03:32

标签: variables module ansible ansible-playbook

如果之前已经讨论过,或者如果有关于此主题的文档,我很抱歉,但我无法在任何地方找到解决方法。

我无法找到如何在playbook中为每个任务使用主变量,而无需每次都指定它们。我正在研究一些模块,用于通过API配置RouterOS设备,使用ansible本地连接。每次执行任务时,我都需要为其提供设备,用户名和密码的IP地址。

我的主机文件如下所示:

[routers]  
mikrotik hostname=192.168.1.100 username=admin password=password123 dns_servers=192.168.1.1,8.8.8.8
[virtual]
virtual1 hostname=192.168.116.100 username=admin password=somepass dns_servers=192.168.116.1 gw_address=192.168.116.100/24
virtual2 hostname=192.168.116.110 username=admin password=somepass2 dns_servers=192.168.116.1 gw_address=192.168.116.110/24

我的剧本看起来像这样:

- name: Mikrotik TEST
  hosts: all
  connection: local
  gather_facts: no
  vars:
    dhcp_pool: testpool
  tasks:
  - name: DNS Setup
    mt_dns: username={{username}} hostname={{hostname}} password={{password}} servers=192.168.1.1,8.8.8.8 remote_requests="true"
  - name: IP address setup
    mt_ip: username={{username}} hostname={{hostname}} password={{password}} address={{et2addr}} interface=ether2 disabled="false"
  - name: DHCP Pool Setup
    mt_ip_pool: username={{username}} hostname={{hostname}} password={{password}} pool_name={{dhcp_pool}} pool_range=192.168.116.10-192.168.116.20
  - name: DHCP Server Setup
    mt_dhcp_srv: username={{username}} hostname={{hostname}} password={{password}} name=TestServer address_pool={{dhcp_pool}} disabled="true" interface=ether1
  - name: DHCP Options Setup
    mt_dhcp_net: username={{username}} hostname={{hostname}} password={{password}} network_address=192.168.116.0/24 gateway=192.168.116.1 dns_server=192.168.116.1
  - name: Set static route
    mt_static_route: username={{username}} hostname={{hostname}} password={{password}} dst_address=192.168.10.0/24 gateway=192.168.10.1
  - name: Source NAT
    mt_nat: username={{username}} hostname={{hostname}} password={{password}} chain=dstnat action=dst-nat dst_port=8022 to_addresses=192.168.116.20 to_ports=22 protocol=tcp

正如您所看到的,每次都指定主机名,用户名和密码会使剧本看起来过于复杂。有没有办法为每个任务预定义变量?我是新手,我相信有一种方法可以做到这一点,我只是无法找到它。

感谢您提出任何建议。

1 个答案:

答案 0 :(得分:0)

您应该为playbook使用全局变量/默认变量 如果您想要定义变量use inventory,还应该in such manner

ansible-playbook -i / $ HOME / inventory -l mikrotik ....

/ $ HOME /库存:

[routers]  
mikrotik hostname=192.168.1.100 username=admin password=password123 dns_servers=192.168.1.1,8.8.8.8
[virtual]
virtual1 hostname=192.168.116.100 username=admin password=somepass dns_servers=192.168.116.1 gw_address=192.168.116.100/24
virtual2 hostname=192.168.116.110 username=admin password=somepass2 dns_servers=192.168.116.1 gw_address=192.168.116.110/24

你也应该provide the variables through -e存档:

从Ansible 1.3开始,可以使用@ syntax:

从JSON文件加载额外的变量
--extra-vars "@some_file.json"

同样在Ansible 1.3中,可以在命令行或上面的文件中将额外的变量格式化为YAML。