ansible 变量

ansible的变量定义可以在很多地方定义,如下:

1、命令行设置变量

命令行直接使用变量,在运行playboox的时候,使用--extra-vars或者-e选项指定额外的变量

#ansible-playbook -e "test=123" install_nginx.yml

也可以将变量写入到一个JSON或者yaml文件中,命令行通过导入文件来获取变量。

#ansible-playbook -e "@test.json" install_nginx.yml 
#ansible-playbook -e "@test.yaml" install_nginx.yml 

2、playboox中定义变量

(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关键字导入。

---
- hosts: hadoop
  remote_user: root
  gather_facts: no
  vars_files:
    - test.yml

  tasks:
    - name: test var
      debug:
        msg: "return var test ,value is {{ test }}"

3、ansible内置变量,使用setup模块获取到的值。可以在命令行通过如下命令获取所有的变量。

ansible hadoop -m setup

4、在主机清单中定义变量

在hosts(默认是/etc/ansible/hosts)文件中,变量会被定义在主机名的后面或者组名的下方,如下:

//为某个主机定义变量
[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文件,表示定义所有的机器的环境变量。

5、注册变量 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 }}"

6、数组变量或者叫列表变量

---
 - 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语法

7、字典变量(有点类似字典)

如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获取字典的值。

8、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'] }}"

9、远程设置主机本地变量

设置远程主机的本地变量,需要定义在/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
}