管理变量
ansible管理变量
1、ansible变量(variables)简介
Ansible支持利用变量来存储值,并在Ansible项目的所有文件中重复使用这些值。这可以简化项目的创建和维护,并减少错误的数量。
1.1 命名变量
变量的名称必须以字母开头,并且只能包含字母、数字和下划线
1.2 定义变量
三个范围级别:
- 全局范围: 从命令行或 ansible 配置设置的变量
- play 范围: 在 play 和相关结构中设置的变量
- 主机范围:由清单、事实收集或注册的任务,在主机组和个别主机上设置的变量
如果多个级别上定义了相同名称的变量,优先采用级别最高的变量,窄范围优先于广范围
1.3 变量的作用
- 存储数据
- 引用数据直接
1.4 playbook中的变量
变量在Ansible Playbook中发挥着重要作用,因为它们可以简化playbook中变量数据的管理
1.4.1 在play开头定义变量
//创建用户,直接写到palybook里面,将变量放在playbook开头的vars块中
[root@ansible playbook]# vim wjj.yml
[root@ansible playbook]# cat wjj.yml
---
- hosts: apache
gather_facts: no
vars:
name: wang
uid: 2000
tasks:
- name: suibian
user:
name: "{{ name }}"
uid: "{{ uid }}"
state: present
[root@ansible playbook]# ansible-playbook wjj.yml
[WARNING]: Found variable using reserved name: name
PLAY [apache] ******************************************************************
TASK [suibian] *****************************************************************
changed: [192.168.47.129]
PLAY RECAP *********************************************************************
192.168.47.129 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[root@apache ~]# id wang
uid=2000(wang) gid=2000(wang) 组=2000(wang)
1.4.2 文件方式定义变量
[root@ansible playbook]# mkdir vars //创建一个目录
[root@ansible playbook]# vim /vars/bianliang.yml //在目录里面写一个变量文件
content: How old are you? //变量的名字:变量内容
[root@ansible playbook]# vim wjj.yml
- - -
- hosts: apache
gather_facts: no
vars_files: //指变量文件的列表
- vars/bianliang.yml //列表型,前面必须要加-
tasks:
- name: suibian
shell: "echo {{ content }} > /tmp/abc"
[root@ansible playbook]# ansible-playbook wjj.yml
PLAY [apache] *************************************************************************************************************
TASK [suibian] ************************************************************************************************************
changed: [192.168.47.129]
PLAY RECAP ****************************************************************************************************************
192.168.47.129 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[root@apache ~]# cat /tmp/abc
How old are you?
1.5 主机变量与组变量
清单变量分为主机变量和组变量:
- 主机变量:应用于特定主机
- 组变量: 应用于一个主机组或一组主机组中的所有主机
主机变量优先于组变量,但playbook中定义的变量的优先级比这两者更高(范围越小越有效)
1.5.1 定义主机变量和组变量
定义主机变量
针对某一台主机设置的变量,只能在这台主机里面用
[root@ansible ansible]# vim inventory
[webservers]
192.168.47.129 ansible_user=root ansible_password=1
[root@ansible ansible]# ansible all -m ping
192.168.47.129 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
定义组变量
针对主机组里面所有主机用的变量
[root@ansible ansible]# vim inventory
[webservers]
192.168.47.129
[webservers:vars]
ansible_user=root
ansible_password=1
[root@ansible ansible]# ansible all -m ping
192.168.47.129 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
1.5.2 使用目录填充主机和组变量
定义主机和主机组的变量的首选做法是在与清单文件或目录相同的工作目录中,创建group_vars和host_vars两个目录。这两个目录分别包含用于定义组变量和主机变量的文件。
使用host_vars和group_vars目录定义清单变量
主机变量
[root@ansible ansible]# vim inventory //清单文件
[webservers]
192.168.47.129
[root@ansible ansible]# mkdir host_vars
[root@ansible ansible]# vim host_vars/192.168.47.129 //代表192.168.47.129这台主机的变量,主机变量里面写的主机名要跟清单文件里面写的主机ip或主机名一样
ansible_user: root
ansible_password: 1
[root@ansible ansible]# ansible all -m ping
192.168.47.129 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
组变量
//对主机组设置变量
[root@ansible ansible]# vim inventory //清单文件
[webservers]
192.168.47.129
[root@ansible ansible]# makdir group_vars
[root@ansible ansible]# vim group_vars/webservers
ansible_user: root
ansible_password: 1
[root@ansible ansible]# ansible all -m ping
192.168.47.129 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
1.6 从命令行覆盖变量
清单变量可被playbook中设置的变量覆盖,这两种变量又可通过在命令行中传递参数到ansible或ansible-playbook命令来覆盖。在命令行上设置的变量称为额外变量。
当需要覆盖一次性运行的playbook的变量的已定义值时,额外变量非常有用
[root@ansible playbook]# vim user.yml
---
- name: task1
gather_facts:no
hosts: 192.168.47.129
tasks:
- name: 创建用户 {{ user }}
user:
name: "{{user}}"
state: present
[root@ansible ansible]# ansible-playbook -e "user=jing" palybook/user.yml
PLAY [task1] *******************************************************************
TASK [创建用户jing] ****************************************************************
changed: [192.168.47.129]
PLAY RECAP *********************************************************************
192.168.47.129 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[root@apache ~]# id jing
uid=2001(jing) gid=2001(jing) 组=2001(jing)
1.7 使用数组作为变量
除了将同一元素相关的配置数据(软件包列表、服务列表和用户列表等)分配到多个变量外,也可以使用数组。这种做法的一个好处在于,数组是可以浏览的
[root@ansible playbook]# vim vars/info.yml //变量文件
[root@ansible playbook]# cat vars/info.yml
info:
wjj:
first_name: lisa
last_name: wang
age: 19
qzl:
first_name: GD
last_name: quan
age: 33
[root@ansible playbook]# vim test.yml
[root@ansible playbook]# cat test.yml
---
- hosts: apache
gather_facts: no
vars_files:
- vars/info.yml
tasks:
- name: mz
shell: echo {{ info }} > /tmp/abc //或者{{ info['wjj']['first_name'] }}取其中一个
[root@ansible playbook]# ansible-playbook test.yml
PLAY [apache] ******************************************************************
TASK [mz] **********************************************************************
changed: [192.168.47.129]
PLAY RECAP *********************************************************************
192.168.47.129 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
1.8 变量捕捉
使用register语句捕获命令输出。输出保存在一个临时变量中,然后在playbook中可用于调试用途或者达成其他目的
[root@ansible playbook]# vim test.yml
[root@ansible playbook]# cat test.yml
---
- hosts: apache
gather_facts: no
tasks:
- name: register variables
command: "df -h"
register: result //随便定义
- debug: var=result //debug:打印;var=随便定义
[root@ansible playbook]# ansible-playbook test.yml
PLAY [apache] ******************************************************************
TASK [register variables] ******************************************************
changed: [192.168.47.129]
TASK [debug] *******************************************************************
ok: [192.168.47.129] => {
"result": {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": true,
"cmd": [
"df",
"-h"
],
"delta": "0:00:00.006521",
"end": "2021-07-22 14:06:56.064551",
"failed": false,
"rc": 0,
"start": "2021-07-22 14:06:56.058030",
"stderr": "",
"stderr_lines": [],
"stdout": "文件系统 容量 已用 可用 已用% 挂载点\ndevtmpfs 872M 0 872M 0% /dev\ntmpfs 901M 0 901M 0% /dev/shm\ntmpfs 901M 26M 875M 3% /run\ntmpfs 901M 0 901M 0% /sys/fs/cgroup\n/dev/mapper/rhel-root 37G 4.5G 33G 12% /\n/dev/nvme0n1p1 1014M 229M 786M 23% /boot\ntmpfs 181M 1.2M 179M 1% /run/user/42\ntmpfs 181M 4.6M 176M 3% /run/user/0\n/dev/sr0 7.9G 7.9G 0 100% /mnt/cdrom",
"stdout_lines": [
"文件系统 容量 已用 可用 已用% 挂载点",
"devtmpfs 872M 0 872M 0% /dev",
"tmpfs 901M 0 901M 0% /dev/shm",
"tmpfs 901M 26M 875M 3% /run",
"tmpfs 901M 0 901M 0% /sys/fs/cgroup",
"/dev/mapper/rhel-root 37G 4.5G 33G 12% /",
"/dev/nvme0n1p1 1014M 229M 786M 23% /boot",
"tmpfs 181M 1.2M 179M 1% /run/user/42",
"tmpfs 181M 4.6M 176M 3% /run/user/0",
"/dev/sr0 7.9G 7.9G 0 100% /mnt/cdrom"
]
}
}
PLAY RECAP *********************************************************************
192.168.47.129 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
或
[root@ansible playbook]# vim test.yml
[root@ansible playbook]# cat test.yml
---
- hosts: apache
gather_facts: no
tasks:
- name: register variables
user:
name: wj
state: present
register: result
- debug: var=result['uid']
[root@ansible playbook]# ansible-playbook test.yml
PLAY [apache] ******************************************************************
TASK [register variables] ******************************************************
changed: [192.168.47.129]
TASK [debug] *******************************************************************
ok: [192.168.47.129] => {
"result['uid']": "2002"
}
PLAY RECAP *********************************************************************
192.168.47.129 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0