1.通過Inventory文件定義主機及主機組變量
當機器數量不多的時候,Ansible操控機器的時候會去Inventory里面獲取主機信息,
此時我們就可以將變量傳過去,默認Inventory配置文件為/etc/ansible/hosts.
playbook文件:variable.yaml
--- - hosts: all gather_facts: False tasks: - name: display Host Variable from hostfile debug: msg="The {{ inventory_hostname }} Value is {{ key }}"
執行結果:
上面我們是給每一個主機配置一個key,我們可以配置一個nginx組擁有的key
執行結果:
當然,每個主機自己的變量優先級更高。只有當找不着自己的key才會使用組的key。
如果沒有找到,肯定報錯:
2.通過group_vars和host_vars文件定義主機及主機組變量
首先需要說明的通過這種方式定義的文件名稱需要與hosts中定義的主機和主機組的名稱一致。
比如,在hosts中定義了一個主機組nginx以及129.28.86.57,那么在定義變量名稱是也必須這樣定義
查看變量文件:
上面148寫成140,結果:
系統找不到148.70.122.28這台主機的變量,所以只能引用組變量。
nginx組變量:
需要說明的是,你必須使用group_vars和host_vars這兩個文件名,不然ansible找不到。
對於上面兩個目錄可以存放在三個位置都可以:當前目錄(執行playbook的位置)、home目錄和/etc/ansible/(配置文件位置)
這三個目錄也是ansible所有文件的加載順序。
3.通過ansible-playbook命令行傳參
不論是shell還是python腳本,在執行腳本的時候可以命令行傳參。
playbook也可以看作是腳本,因此也可以通過命令行傳參。
命令行傳參也可以通過文件的方式。支持YAML和JSON格式:
通過YAML格式的文件傳參:
執行結果:
通過JSON格式的文件傳參:
執行結果:
這種方式和第二種方式有些類似,都是通過文件定義。
但是還是有區別,group_vars和host_vars都是寫死的,必須用這個名字,因為ansible就是這樣幫你定義的。
而命令行傳參是可以指定任意文件,只要符合規范都行。
4.在playbook文件內傳參
我們可以直接在playbook腳本中定義變量。
定義variable.yaml文件
--- - hosts: all gather_facts: False vars: key: playbook_var tasks: - name: display Host Variable from hostfile debug: msg="The {{ inventory_hostname }} Value is {{ key }}"
執行結果:
5.在playbook文件內使用vars_files
在playbook中可以通過定義vars的方式來傳參,那么也就可以通過文件的方式
變量配置文件:
playbook文件:
執行結果:
參數的優先級:
命令行>vars_files>vars>host_vars>group_vars>hosts
6.使用register內的變量
在playbook里面,task之間可以互相傳遞結果。
下面這個示例中,第二個task需要用到第一個task的運行結果。
register就是用來定義一個變量接收值,然后被復用
定義variable2.yaml:
--- - hosts: all gather_facts: False tasks: - name: register variable shell: hostname register: info - name: display variable debug: msg="The variable is {{ info }}"
執行結果:
stdout代表輸出。
我們可以看出,這個輸出結果其實是一個字典,我們可以直接去里面的值:
--- - hosts: all gather_facts: False tasks: - name: register variable shell: hostname register: info - name: display variable debug: msg="The variable is {{ info['stdout'] }}"
執行結果:
暫時貌似只會取stdout這個參數的值,后續還要參考官方文檔。
7.使用vars_prompt傳值
Ansible還支持在運行playbook的時候交互式傳參,只需要使用vars_prompt定義變量名即可。
定義prompt.yaml文件:
--- - hosts: all vars_prompt: - name: "one" prompt: "please input one value" private: no - name: "two" prompt: "please input two value" default: "good" private: yes tasks: - name: display one value debug: msg="one value is {{ one }}" - name: display two value debug: msg="two value is {{ two }}"
執行結果: