1、Ansible变量简介
Ansible支持利用变量来存储值,并在Ansible项目的所有文件中重复使用这些值。这可以简化项目的创建和维护,并减少错误的数量。
通过变量,可以轻松地在Ansible项目中管理给定环境的动态值。例如,变量可能包含下面这些值:
- 要创建的用户
- 要安装的软件包
- 要重新启动的服务
- 要删除的文件
- 要从互联网检索的存档
2、命名变量
变量的名称必须以字母开头,并且只能包含字母、数字和下划线
无效的变量名称 | 有效的变量名称 |
---|---|
web server | web_server |
remote.file | remote_file |
1st file | file_1 |
remoteserver$1 | remote_server_1 |
3、定义变量
可以在Ansible项目中的多个位置定义变量。不过,这些变量大致可简化为三个范围级别:
- 全局范围:从命令行或Ansible配置设置的变量
- Play范围:在play和相关结构中设置的变量
- 主机范围:由清单、事实收集或注册的任务,在主机组和个别主机上设置的变量
如果在多个xeklh定义了相同名称的变量,则采用优先级别最高的变量。窄范围优先于更广泛的范围:由清单定义的变量将被playbook定义的变量覆盖,后者将被命令行中定义的变量覆盖。
4、playbook中的变量
编写playbook时,可以定义自己的变量,然后在任务中调用这些值。例如,名为web_package的变量可以使用值httpd来定义。然后,任务可以使用yum模块调用该变量来安装httpd软件包。
Playbook变量可以通过多种方式定义。一种常见的方式是将变量放在playbook开头的vars块中:
[root@master playbook]# vim test.yml
---
- hosts: apache
gather_facts: no
vars:
name: t
uid: 2000
tasks:
- name:
user:
name: "{{ name }}"
uid: "{{ uid }}"
state: present
[root@master playbook]# ansible-playbook test.yml
[WARNING]: Found variable using reserved name: name
PLAY [apache] ******************************************************************
TASK [user] ********************************************************************
changed: [192.168.47.159]
PLAY RECAP *********************************************************************
192.168.47.159 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[root@localhost ~]# id t
uid=2000(t) gid=2000(t) 组=2000(t)
也可以在外部文件中定义playbook变量。此时不使用playbook中的vars块,可以改为使用vars_files指令,后面跟上相对于playbook位置的外部变量文件名称列表:
[root@master playbook]# cat lly.yml
---
- hosts: apache
gather_facts: on
vars:
- vars/yy.yml
tsaks:
- name: tom
shell: echo {{ cc }} > /opt/ll
[root@master vars]# cat yy.yml
cc: helo word
[root@ansible playbook]# ansible-playbook lly.yml
PLAY [apache] ******************************************************************
TASK [Gathering Facts] *********************************************************
ok: [192.168.47.159]
TASK [tom] *********************************************************************
changed: [192.168.47.159]
PLAY RECAP *********************************************************************
192.168.47.159 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[root@localhost ~]# cd /opt/
[root@localhost opt]# cat ll
helo word
在playbook中使用变量
声明了变量后,可以在任务中使用这些变量。若要引用变量,可以将变量名放在双大括号内。在任务执行时,Ansible会将变量替换为其值。
例:
vars:
user: joe
tasks:
# This line will read: Creates the user joe
- name: Creates the user {{ user }}
user:
# This line will create the user named joe
name: "{{ user }}"
注意:当变量用作开始一个值的第一元素时,必须使用引号。这可以防止Ansible将变量引用视为YAML字典的开头
5、主机变量和组变量
直接应用于主机的清单变量分为两在类:
- 主机变量,应用于特定主机
- 组管理,应用于一个主机组或一组主机组中的所有主机
主机变量优先于组变量,但playbook中定义的变量的优先级比这两者更高。
若要定义主机变量和组变量,一种方法是直接在清单文件中定义。这是较旧的做法,不建议采用,但你可能会在未来的工作当中遇到。
定义192.168.47.159 ansible_user主机变量:
[servers]
192.168.47.159 ansible_user=root ansible_passwd=1
定义servers主机组的user组变量:
192.168.47.159
192.168.47.157
[servers:vars]
user=root
定义servers组的user组变量,该组由两个主机组成,每个主机组有两个服务器:
[servers1]
node1
node2
[servers2]
node3
node4
[servers:children]
servers1
servers2
[servers:vars]
user=test
6、命令行覆盖变量
清单变量可被playbook中设置的变量覆盖,这两种变量又可通过在命令行中传递参数到ansible或ansible-playbook命令来覆盖。在命令行上设置的变量称为额外变量。
当需要覆盖一次性运行的playbook的变量的已定义值时,额外变量非常有用。例如:
[root@master playbook]# vim user.yml
---
- name:
gather_facts: no
hosts: apache
tasks:
- name: 创建用户 {{ user }}
user:
name: "{{ user }}"
state: present
[root@master playbook]# ansible-playbook -e "user=tom" user.yml
PLAY [192.168.47.159] *********************************************************
TASK [创建用户 tom] **************************************************************
changed: [192.168.47.159]
PLAY RECAP *********************************************************************
192.168.47.159 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[root@localhost opt]# id tom
uid=9990(tom) gid=9990(tom) 组=9990(tom)
7、使用已注册变量捕获命令输出
可以使用register语句捕获命令输出。输出保存在一个临时变量中,然后在playbook中可用于调试用途或者达成其他目的,例如基于命令输出的特定配置
例
[root@master playbook]# vim xx.yml
[root@master playbook]# cat xx.yml
---
- hosts: apache
gather_facts: no
tasks:
- name: register variables
command: "df -h"
register: result
- debug: var=result
[root@master playbook]# ansible-playbook xx.yml
PLAY [apache] ******************************************************************
TASK [register variables] ******************************************************
changed: [192.168.47.159]
TASK [debug] *******************************************************************
ok: [192.168.47.159] => {
"result": {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": true,
"cmd": [
"df",
"-h"
],
"delta": "0:00:00.002627",
"end": "2021-07-23 18:41:12.697724",
"failed": false,
"rc": 0,
"start": "2021-07-23 18:41:12.695097",
"stderr": "",
"stderr_lines": [],
"stdout": "文件系统 容量 已用 可用 已用% 挂载点\ndevtmpfs 1.9G 0 1.9G 0% /dev\ntmpfs 1.9G 0 1.9G 0% /dev/shm\ntmpfs 1.9G 9.7M 1.9G 1% /run\ntmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup\n/dev/mapper/rhel-root 50G 4.6G 46G 10% /\n/dev/mapper/rhel-home 46G 354M 45G 1% /home\n/dev/nvme0n1p1 1014M 229M 786M 23% /boot\ntmpfs 376M 1.2M 375M 1% /run/user/42\ntmpfs 376M 4.0K 376M 1% /run/user/0",
"stdout_lines": [
"文件系统 容量 已用 可用 已用% 挂载点",
"devtmpfs 1.9G 0 1.9G 0% /dev",
"tmpfs 1.9G 0 1.9G 0% /dev/shm",
"tmpfs 1.9G 9.7M 1.9G 1% /run",
"tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup",
"/dev/mapper/rhel-root 50G 4.6G 46G 10% /",
"/dev/mapper/rhel-home 46G 354M 45G 1% /home",
"/dev/nvme0n1p1 1014M 229M 786M 23% /boot",
"tmpfs 376M 1.2M 375M 1% /run/user/42",
"tmpfs 376M 4.0K 376M 1% /run/user/0"
]
}
}
PLAY RECAP *********************************************************************
192.168.47.159 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[root@master playbook]# cat xx.yml
---
- hosts: apache
gather_facts: no
tasks:
- name: register variables
command: "df -h"
register: result
- debug: var=result["stdout_lines"]
[root@master playbook]# ansible-playbook xx.yml
PLAY [apache] ******************************************************************
TASK [register variables] ******************************************************
changed: [192.168.47.159]
TASK [debug] *******************************************************************
ok: [192.168.47.159] => {
"result[\"stdout_lines\"]": [
"文件系统 容量 已用 可用 已用% 挂载点",
"devtmpfs 1.9G 0 1.9G 0% /dev",
"tmpfs 1.9G 0 1.9G 0% /dev/shm",
"tmpfs 1.9G 9.7M 1.9G 1% /run",
"tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup",
"/dev/mapper/rhel-root 50G 4.6G 46G 10% /",
"/dev/mapper/rhel-home 46G 354M 45G 1% /home",
"/dev/nvme0n1p1 1014M 229M 786M 23% /boot",
"tmpfs 376M 1.2M 375M 1% /run/user/42",
"tmpfs 376M 4.0K 376M 1% /run/user/0"
]
}
PLAY RECAP *********************************************************************
192.168.47.159 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0