【问题标题】:Ansible: Using default variables for every taskAnsible:为每个任务使用默认变量
【发布时间】:2016-04-13 12:03:32
【问题描述】:

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

我很难找出如何为剧本中的每个任务使用主机变量,而不必每次都指定它们。我正在开发一些模块,用于通过 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

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

感谢您的任何建议。

【问题讨论】:

  • Ansible 怎么可能知道为什么变量与参数一致?如果您碰巧有一个变量与模块上的某个参数命名相同,但您根本不打算使用该参数,会发生什么?因此,您必须始终指定要使用的每个参数。
  • 那么根本就没有办法在ansible中实现这一点吗?我试图通过创建将通过主机文件并从那里使用凭据的函数来在模块级别上解决问题。但是我陷入了这样一个事实,即模块无法判断它正在运行哪个主机。我想一种解决方案可能是使用主机名作为参数,使其成为一个变量而不是三个......或者可能创建连接插件,但恐怕这与我的编程技能相去甚远。
  • 您可以编写一个角色,使用默认值执行这些配置,然后只覆盖您想要覆盖的内容

标签: variables module ansible ansible-playbook


【解决方案1】:

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

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 开始,可以使用 @ 语法从 JSON 文件加载额外的变量:

--extra-vars "@some_file.json"

从 Ansible 1.3 开始,额外的变量可以格式化为 YAML,无论是在命令行上还是在上述文件中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多