2016-04-13 24 views
0

对不起,如果之前讨论过这个问题,或者有关此主题的文档,但我无法找到方法在任何地方执行此操作。Ansible:对每个任务使用默认变量

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

我的hosts文件看起来是这样的:

[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 

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

谢谢你的任何建议。

+0

Ansible怎么可能知道为什么变量与参数一致?如果碰巧有一个变量的名称与模块上的某个参数相同,但您完全不打算使用该参数,会发生什么?因此,您必须始终指定您希望使用的每个参数。 – ydaetskcoR

+0

所以没有办法完全实现这一点?我试图在模块级别上做一个解决方法,通过创建函数来处理槽主机文件并从那里使用证书。但是我被卡在事实上,模块无法分辨它运行的是哪个主机。我想一个解决方案可能是使用主机名作为参数,使其成为一个变量而不是三个...或者可能创建连接插件,但是我担心这远离我的编程技能。 –

+0

您可以编写一个角色,使用默认值执行这些配置,然后仅覆盖要覆盖的内容 – user2599522

回答

0

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

ansible-剧本-i/$ HOME /库存-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,可以使用@语法从JSON文件中加载额外的变量:

--extra-vars "@some_file.json" 

同样来自Ansible 1.3,额外的变量可以被格式化为YAML,无论是在命令行还是上面的文件中。