变量名:仅能由字母、数字和下划线组成,且只能以字母开头

变量来源:

1.ansible all -m setup 远程主机的所有变量都可直接调用

#显示所有变量
ansible all -m setup
#显示特定的变量
ansible all -m setup -a 'filter=ansible_fqdn'
ansible all -m setup -a 'filter=ansible_hostname'
ansible all -m setup -a 'filter=*address*'

2.在/etc/ansible/hosts中定义

  • 普通变量:主机组中主机单独定义,优先级高于公共变量
  • 公共(组)变量:针对主机组中所有主机定义统一变量

3.通过命令行指定变量,优先级最高

ansible-playbook –e varname=value

4.在playbook中定义

vars:
  – var1: value1
  – var2: value2

5.在role中定义

变量定义:key=value

示例:http_port=80

变量调用方式:

  • 通过{{ variable_name }} 调用变量,且变量名前后必须有空格,有时用”{{ variable_name }}”才生效
  • ansible-playbook –e 选项指定
ansible-playbook test.yml -e "hosts=www user=sogou"

变量调用优先级:

命令行(-e) > playbook定义 > hosts普通变量 > hosts分组变量

示例1:命令行变量赋值

vim app.yml
---
- hosts: appsrvs
  remote_user: root

  tasks:
    – name: install package
      yum: name={{ pkname }}
    – name: start service
      service: name={{ pkname }} state=started enabled=yes

# 变量赋值并执行:
ansible-playbook -e 'pkname=vsftpd' app.yml

示例2:playbook中赋值变量

vim app.yml
---
- hosts: appsrvs
  remote_user: root
  vars:
    – pkname1: httpd
    – pkname2: vsftpd

  tasks:
    – name: install package
      yum: name={{ pkname1 }}
    – name: install package
      yum: name={{ pkname2 }}

#执行play-book
ansible-playbook app.yml
#验证
ansible appsrvs -m shell -a 'rpm -q httpd vsftpd'
#卸载
ansible appsrvs -m shell -a 'yum -y remove httpd vsftpd'

示例3:在ansible的清单文件(/etc/ansible/hosts)中定义普通变量

vim /etc/ansible/hosts
[websrvs]
192.168.30.101 httpd_port=81
192.168.30.102 httpd_port=82

vim hostname.yml
---
- hosts: websrvs
  remote_user: root

  tasks:
    – name: set hostname
      hostname: name=www{{httpd_port}}.sogou.com

#语法检查      
ansible-playbook -C hostname.yml
#执行Playbook
ansible-playbook hostname.yml
#检查
ansible websrvs -a 'hostname'

示例4:在ansible的清单文件(/etc/ansible/hosts)中定义分组变量

vim /etc/ansible/hosts
[websrvs]
192.168.30.101 httpd_port=81
192.168.30.102 httpd_port=82

[websrvs:vars]
nodename=www
domainname=sogou.com

vim hostname.yml
---
– hosts: websrvs
  remote_user: root

  tasks:
    – name: set hostname
      hostname: name={{nodename}}{{http_port}}.{{domainname}}

#语法检查      
ansible-playbook -C hostname.yml
#执行Playbook
ansible-playbook hostname.yml
#检查
ansible websrvs -a 'hostname'

示例5:引用系统自带(setup)变量

ansible all -m setup |grep ansible_fqdn     #查看系统自带变量
vim var.yml
---
- hosts: websrvs
  remote_user: root

  tasks:
    – name: create log file
      file: name=/search/{{ ansible_fqdn }}.log state=touch mode=600 owner=op_biz
      
#语法检查      
ansible-playbook -C var.yml
#执行Playbook
ansible-playbook var.yml
#检查
ansible websrvs -a 'ls -l /search'

示例6:定义变量到一个文件中

vim vars.yml
var1: httpd
var2: vsftpd

vim testvar.yml
---
- hosts: websrvs
  remote_user: root
  vars_files:
    - vars.yml

  tasks:
    – name: install package
      yum: name={{ var1 }}
    – name: create file
      file: name=/search/{{ var2 }}.log state=touch mode=600 owner=op_biz
      
#语法检查      
ansible-playbook -C testvar.yml
#执行Playbook
ansible-playbook testvar.yml
#检查
ansible websrvs -m shell -a 'rpm -q httpd' 
ansible websrvs -m shell -a 'ls -l /search'

6.注册变量

注册变量,其实就是将操作结果,包括标准输出和标准错误输出,保存到变量中,然后再根据这个变量的内容来决定下一步的操作,在这个过程中用来保存操作结果的变量就叫注册变量。

[root@test2 playbook]# cat test.yml 
---                       #标记文件的开始
 - hosts: all
   remote_user: root
   gather_facts: no      #不收集对应主机的信息,这样运行会快点。
   tasks:
     - name: test the register variables
       shell: uptime
       register: results                    #使用关键字register声明注册变量,上面uptime命令产生的结果,存入到results中。结果是字典形式。

     - name: print the register result
       debug: msg="{{ results.stdout }}"    #使用debug模块,打印出上面命令的输出结果。

上面的playbook执行结果如下:

[root@test2 playbook]# ansible-playbook test.yml 

PLAY [all] ******************************************************************** 

TASK: [test the register variables] ******************************************* 
changed: [10.0.102.212]
changed: [10.0.102.200]
changed: [10.0.102.162]

TASK: [print the register result] ********************************************* 
ok: [10.0.102.212] => {
    "msg": " 00:18:01 up 3 days,  2:56,  3 users,  load average: 0.02, 0.03, 0.05"     # msg的结果就是注册变量的标准输出
}
ok: [10.0.102.200] => {
    "msg": " 00:18:04 up 4 days,  7:45,  3 users,  load average: 0.03, 0.06, 0.05"
}
ok: [10.0.102.162] => {
    "msg": " 00:18:04 up 4 days,  7:45,  3 users,  load average: 0.01, 0.02, 0.05"
}

PLAY RECAP ******************************************************************** 
10.0.102.162               : ok=2    changed=1    unreachable=0    failed=0   
10.0.102.200               : ok=2    changed=1    unreachable=0    failed=0   
10.0.102.212               : ok=2    changed=1    unreachable=0    failed=0   

[root@test2 playbook]#

一个注册变量通常会有以下属性:

  • changed:任务是否对远程主机造成的变更。
  • delta:任务运行所用的时间。
  • stdout:正常的输出信息。
  • stderr:错误信息。
  • rc:返回值

显示全部全量

[@bjyf_50_20 ansible]# cat test1.yml
---
- hosts: songwanbo
  remote_user: root
  gather_facts: no
  tasks:
    - name: test the register variables
      shell: uptime
      register: results

    - name: print the register result
      debug: msg="{{ results }}"
[@bjyf_50_20 ansible]#

结果

TASK [print the register result] *********************************************************
ok: [10.160.13.139] => {
    "msg": {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/bin/python"
        },
        "changed": true,
        "cmd": "uptime",
        "delta": "0:00:00.012288",
        "end": "2020-12-23 10:56:50.202287",
        "failed": false,
        "rc": 0,
        "start": "2020-12-23 10:56:50.189999",
        "stderr": "",
        "stderr_lines": [],
        "stdout": " 10:56:50 up 376 days, 17:56,  2 users,  load average: 0.26, 0.18, 0.10",
        "stdout_lines": [
            " 10:56:50 up 376 days, 17:56,  2 users,  load average: 0.26, 0.18, 0.10"
        ]
    }
}

7.高阶变量

对于普通变量,在ansible命令行设定的,在hosts文件中定义的,或者在playbook中定义的等,这些都是普通变量,在引用时,可以使用使用{{ variable }}的形式。
ansible是用python语言写的,因此也支持一种叫做列表的变量,形式如下:

[root@test2 playbook]# cat test.yml 
---
 - hosts: all
   remote_user: root
   gather_facts: no
   vars:
      var_list:               #注意形式,定义了var_list列表,取值方法和列表取值一样,不推荐使用jinja2的方法取值。
          - one
          - two
          - three
   tasks:
     - name: test the list variables
       shell: echo {{ var_list[0] }}            #取列表中的第一个字,也就是one
       register: results

     - name: print the register result
       debug: msg="{{ results.stdout }}"