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}