ansible的變量定義能夠在不少地方定義,以下:node
一、命令行設置變量python
命令行直接使用變量,在運行playboox的時候,使用--extra-vars或者-e選項指定額外的變量nginx
#ansible-playbook -e "test=123" install_nginx.yml
也能夠將變量寫入到一個JSON或者yaml文件中,命令行經過導入文件來獲取變量。shell
#ansible-playbook -e "@test.json" install_nginx.yml #ansible-playbook -e "@test.yaml" install_nginx.yml
二、playboox中定義變量json
(1)使用vars關鍵字定義變量數組
--- - hosts: hadoop remote_user: root gather_facts: no vars: test: 123 tasks: - name: test var debug: msg: "return var test ,value is {{ test }}"
(2)變量寫入到文件,在playboox中使用vars_files關鍵字導入。oop
--- - hosts: hadoop remote_user: root gather_facts: no vars_files: - test.yml tasks: - name: test var debug: msg: "return var test ,value is {{ test }}"
三、ansible內置變量,使用setup模塊獲取到的值。能夠在命令行經過以下命令獲取全部的變量。spa
ansible hadoop -m setup
四、在主機清單中定義變量命令行
在hosts(默認是/etc/ansible/hosts)文件中,變量會被定義在主機名的後面或者組名的下方,以下:debug
//爲某個主機定義變量
[hadoop]
192.168.4.50 namenode_state=yes
//爲某個組指定變量,做用範圍組內的全部機器。
[hadoop:vars]
yarn_state=yes
當主機過多的時候,在Inventory中定義變量會略顯複雜,官方也不建議這麼作,其實在執行ansible命令的時候,ansible默認會從/etc/ansible/host_vars和/etc/ansible/group_vars/兩個目錄下讀取變量定義,若是不存在,能夠本身建立,而且在這兩個目錄中建立與主機名或者組名同名的文件來定義變量,固然,也能夠建立all文件,表示定義全部的機器的環境變量。
五、註冊變量 register
所謂的註冊變量就是講操做的結果,包括標準輸出和標準錯誤輸出,報錯到變量中,而後跟這個變量的內容來進行下一步的操做,在這個過程當中用來變成操做結果的變量就叫作註冊變量。
--- - hosts: test50 remote_user: root gather_facts: no tasks: - name: test shell: echo 123 > /tmp/aa register: testvar - name: register var debug: msg: "echo {{ testvar }}"
六、數組變量或者叫列表變量
--- - hosts: hadoop remote_user: root gather_facts: no vars: test_list: - one - two - three tasks: - name: test vars_list debug: # msg: "print {{ test_list[0] }}" msg: "print {{ test_list|first }}"
調用數組變量的方法有以下兩種:建議使用第一種
(1)test_list[0] 標準的python用法,0表示第一個元素,依次類推。。。
(2)test_list|first jinja2語法
七、字典變量(有點相似字典)
如ansible的內置變量ansible_br0
--- - hosts: hadoop remote_user: root gather_facts: yes tasks: - name: debug: var: ansible_br0
輸出以下:
[root@manager1 playbook 17:51:14]#ansible-playbook dict_vars.yml PLAY [hadoop] **************************************************************************************************************************************************************************************************************************************************************** TASK [Gathering Facts] ******************************************************************************************************************************************************************************************************************************************************* ok: [192.168.4.50] TASK [debug] ***************************************************************************************************************************************************************************************************************************************************************** ok: [192.168.4.50] => { "ansible_br0": { "active": true, "device": "br0", "features": { "busy_poll": "off [fixed]", "fcoe_mtu": "off [fixed]", "generic_receive_offload": "on", "generic_segmentation_offload": "on", "highdma": "off [requested on]", "hw_tc_offload": "off [fixed]", "l2_fwd_offload": "off [fixed]", "large_receive_offload": "off [fixed]", "loopback": "off [fixed]", "netns_local": "on [fixed]", "ntuple_filters": "off [fixed]", "receive_hashing": "off [fixed]", "rx_all": "off [fixed]",
........
這種變量有點複雜,若是想要獲取其中的值,好比獲取IP地址
可使用
{{ ansible_br0.ipv4.address }}或者
{{ ansible_br0['ipv4']['address'] }} 這種方式有點像python獲取字典的值。
八、hostvars變量
從一臺遠程主機獲取另一臺遠程主機的變量信息。
用法: {{ hostvars['host']['變量'] }}
好比:在主機清單中,定義以下:
[hadoop]
192.168.4.50 admin_user=root
這個時候就能夠經過hostvars來獲取admin_user的變量值
--- - hosts: hadoop remote_user: root gather_facts: yes tasks: - name: debug: msg: "{{ hostvars['192.168.4.50']['admin_user'] }}"
九、遠程設置主機本地變量
設置遠程主機的本地變量,須要定義在/etc/ansible/facts.d目錄下,而且文件以.fact結尾,文件格式能夠是INI或者JSON。
例如:
[root@manager1 playbook 18:16:02]#cat /etc/ansible/facts.d/test.fact [user] yjt=nice
[root@manager1 playbook 18:15:42]#ansible hadoop -m setup -a "filter=ansible_local" #使用filter進行過濾192.168.4.50 | SUCCESS => { "ansible_facts": { "ansible_local": { "test": { "user": { "yjt": "nice" } } }, "discovered_interpreter_python": "/usr/bin/python" }, "changed": false}