2016-04-13 27 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,無論是在命令行還是上面的文件中。