变量的名字有字母、下划线和数字组成,必须以字母开头
如下变量命名为正确:
good_a
ok_b
如下变量命名错误:
_aa
12bb
注意:保留的关键字不能作为变量名称
二、变量类型根据变量的作用范围大概的将变量分为:
- 全局变量
- 剧本变量
- 资产变量
但只有一个比较粗糙的划分,不能囊括Ansible中的所有变量;
1. 全局变量
全局变量,使我们使用ansible或者使用ansible-playbook时,手动通过 -e 参数传递给Ansible的变量
通过ansible或ansible-playbook的help帮助,可以获取具体的格式使用方法
[root@ansible-01 ~]# ansible -h | grep var
path for many features including roles/ group_vars/
-e EXTRA_VARS, --extra-vars EXTRA_VARS
set additional variables as key=value or YAML/JSON, if
[root@ansible-01 ~]# ansible-playbook -h | grep var
-e EXTRA_VARS, --extra-vars EXTRA_VARS
set additional variables as key=value or YAML/JSON, if
练习
传递普通的key=value的形式
# [root@ansible-01 ~]# ansible all -i localhost, -m debug -a "msg='my key is {{ key }}'" -e "key=value"
传递一个YAML/JSON的形式(注意不管是YAML还是JSON,它们的最终格式一定是个字典)
==================JSOM格式=================================
[root@ansible-01 ~]# cat a.json
{"name":"mage","tpye":"school"}
[root@ansible-01 ~]# ansible all -i localhost, -m debug -a "msg='name is {{ name }} type is {{ type }}'" -e @a.json
[WARNING]: Found variable using reserved name: name
localhost | SUCCESS => {
"msg": "name is mage type is school"
}
=======================YAML格式============================
[root@ansible-01 ~]# cat a.yml
---
name: mage
type: study
...
[root@ansible-01 ~]# ansible all -i localhost, -m debug -a "msg='name is {{ name }} type is {{ type }}'" -e @a.yml
[WARNING]: Found variable using reserved name: name
localhost | SUCCESS => {
"msg": "name is mage type is study"
}
2. 剧本变量
此种变量的playbook有关,定义在playbook中的,它的定义方式有多种;
通过PLAY属性vars定义
---
- name: test play vars
hosts: all
vars:
user: xiaoge
home: /home/xiaoge
通过PLAY属性vars_files定义
当通过vars属性定义的变量很多时,这个play就会感觉特别臃肿,此时我们可以将变量单从play中抽离出来,形成单独的YAML文件。
---
- name: test play vars
hosts: all
vars_files:
- vars/users.yml
# cat vars/users.yml
---
user: xiaoge
home: /home/xiaoge
如何在PlayBook中使用这些变量
在PlayBook中使用变量时,使用 {{ 变量名 }} 来使用变量
---
- name: test my vars
hosts: all
vars:
user: xiaoge
home: /home/xiaoge
- tasks:
- name: create the user {{ user }}
user:
name: "{{ user }}"
home: "{{ home }}"
# 注意:这里的双引号不能去掉
3.资产变量
在之前的学习中学习了资产,资产共分为静态资产和动态资产。
资产变量分为主机变量和组变量,分别针对资产中的单个主机和主机组
3.1 主机变量
以下资产中,定义了一个主机变量xiaoma,此变量只针对
[root@ansible-01 ~]# cat hostsandhostvars
[webservers]
172.18.0.3 user=xiaoma port=3309
172.18.0.4
验证
# 获取定义的变量
[root@ansible-01 ~]# ansible 172.18.0.3 -i hostsandhostvars -m debug -a "mag='{{user}} {{port}}'"
172.18.0.3 | SUCCESS => {
"user": "xiaoma"
}
# 未获取到定义的变量值,因为xiaoma 这个变量针对172.18.0.4,主机无效
[root@ansible-01 ~]# ansible 172.18.0.4 -i hostsandhostvars -m debug -a "var=user"
172.18.0.4 | SUCCESS => {
"user": "VARIABLE IS NOT DEFINED!"
}
3.2 主机组变量
以下资产中,定义了一组变量home,此变量将针对webservers这个主机组中的所有服务器有效
[root@ansible-01 ~]# cat hostsandhostvars
[webservers]
172.18.0.3 user=xiaoma
172.18.0.4
[webservers:vars]
home="/home/xiaoma"
验证
# home是webservers的组变量,会针对这个组内的所有服务器生效
[root@ansible-01 ~]# ansible webservers -i hostsandhostvars -m debug -a "var=home"
172.18.0.3 | SUCCESS => {
"home": "/home/xiaoma"
}
172.18.0.4 | SUCCESS => {
"home": "/home/xiaoma"
}
3.3 主机变量 VS 主机组变量
当主机变量和组变量在同一个资产发生重名的情况,会有什么效果?
[root@ansible-01 ~]# cat hosts_v2
[webservers]
172.18.0.3 user=xiaoma
172.18.0.4
[webservers:vars]
user=tom
验证
# 在资产中定义了主机变量和组变量 user,此时发现 172.18.0.3 这台主机的主机变量 user 的优先级更高
[root@ansible-01 ~]# ansible webservers -i hosts_v2 -m debug -a "var=user"
172.18.0.3 | SUCCESS => {
"user": "xiaoma"
}
172.18.0.4 | SUCCESS => {
"user": "tom"
}
3.4 变量的继承
[root@ansible-01 ~]# cat hosts_v
hosts_v2 hosts_v3
[root@ansible-01 ~]# cat hosts_v3
[webservers]
172.18.0.3
[dbservers]
172.18.0.4
[allservers]
[allservers:children] # 固定写法
dbservers
webservers
[allservers:vars] # 固定写法
user=xiaoma
验证
# 在资产继承的同时,对应得变量也发生了继承
[root@ansible-01 ~]# ansible allservers -i hosts_v3 -m debug -a "var=user"
172.18.0.4 | SUCCESS => {
"user": "xiaoma"
}
172.18.0.3 | SUCCESS => {
"user": "xiaoma"
}
[root@ansible-01 ~]# ansible dbservers -i hosts_v3 -m debug -a "var=user"
172.18.0.4 | SUCCESS => {
"user": "xiaoma"
}
[root@ansible-01 ~]# ansible webservers -i hosts_v3 -m debug -a "var=user"
172.18.0.3 | SUCCESS => {
"user": "xiaoma"
}
3.5 Inventory 内置变量的说明
内置变量几乎都是以ansible_ 为前缀。
ansible_ssh_host
将要连接的远程主机名,与你想要设定的主机的别名不同的话,可通过此变量设置
ansible_ssh_port
ssh端口号,如果不是默认的端口号,通过此变量设置
ansible_ssh_user
默认的 ssh 用户
ansible_ssh_pass
ssh 密码(这种方式不安全,官方建议使用 --ask-pass 或 SSH 密钥)
ansible_sudo_pass
sudo 密码(这种方式不安全,官方建议使用 --ask-sudo-pass)
ansible_sudo_exe(new in version 1.8)
sudo(命令路径,适用于1.8以上)
ansible_ssh_private_key_file
ssh 使用的私钥文件,适用于多个密钥,而你不想使用 SSH 代理的情况
ansible_python_interpreter
目标主机的 python 路径,适用于的情况:系统中的多个python,或者命令路径不是"/usr/bin/python",比如 /usr/local/bin/python3
4. Facts 变量
Facts变量不包含在前文文中介绍的全局变量、剧本变量、及资产变量之内。
Facts变量不需要我们人为去声明变量名及赋值
它的声明和赋值完全有Ansible中的setup模块帮我们完成
它收集了有关被管理服务器的操作系统版本,服务器IP地址、主机名、磁盘的使用情况、CPU个数、内存大小等等有关被管理服务器的私有信息
在每次playbook运行的时候都会发现playbook执行前都会有一个Gathering Facts的过程。这个过程就是收集被管理服务器的Facts信息过程。
4.1 手动收集Facts变量
[root@ansible-01 ~]# ansible all -i localhost, -c local -m setup
localhost | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"192.168.10.150"
],
"ansible_all_ipv6_addresses": [
"fe80::d74b:84a8:cb65:7dc5"
],
"ansible_apparmor": {
"status": "disabled"
},
"ansible_architecture": "x86_64",
"ansible_bios_date": "07/29/2019",
"ansible_bios_version": "6.00",
"ansible_cmdline": {
"BOOT_IMAGE": "/vmlinuz-3.10.0-1160.el7.x86_64",
"LANG": "en_US.UTF-8",
"crashkernel": "auto",
"quiet": true,
"rd.lvm.lv": "centos/swap",
"rhgb": true,
"ro": true,
"root": "/dev/mapper/centos-root"
},
........
4.2 手动收集Facts变量
通过刚才的手动收集Facts,我们发现facts信息量太大,需要针对性的过滤一下。
可以通过使用Facts模块中的filter参数过滤我们想要的信息。
- 仅获取服务器的内存情况信息
[root@ansible-01 ~]# ansible all -i localhost, -m setup -a "filter=*memory*" -c local
localhost | SUCCESS => {
"ansible_facts": {
"ansible_memory_mb": {
"nocache": {
"free": 668,
"used": 304
},
"real": {
"free": 560,
"total": 972,
"used": 412
},
"swap": {
"cached": 0,
"free": 2047,
"total": 2047,
"used": 0
}
},
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false
}
- 获取服务器磁盘挂载情况
# -c local 意思是不走ssh协议
[root@ansible-01 ~]# ansible all -i localhost, -m setup -a "filter=*mount*" -c local
localhost | SUCCESS => {
"ansible_facts": {
"ansible_mounts": [
{
"block_available": 224503,
"block_size": 4096,
"block_total": 259584,
"block_used": 35081,
"device": "/dev/sda1",
"fstype": "xfs",
"inode_available": 523962,
"inode_total": 524288,
"inode_used": 326,
"mount": "/boot",
"options": "rw,seclabel,relatime,attr2,inode64,noquota",
"size_available": 919564288,
"size_total": 1063256064,
"uuid": "411914c3-fc4e-4eec-9daf-f2f34e5d0f66"
},
{
"block_available": 12694160,
"block_size": 4096,
"block_total": 13100800,
"block_used": 406640,
"device": "/dev/mapper/centos-root",
"fstype": "xfs",
"inode_available": 26172537,
"inode_total": 26214400,
"inode_used": 41863,
"mount": "/",
"options": "rw,seclabel,relatime,attr2,inode64,noquota",
"size_available": 51995279360,
"size_total": 53660876800,
"uuid": "4bba3d5a-fefd-4b9a-99a0-688ba3351d4a"
},
{
"block_available": 38506054,
"block_size": 4096,
"block_total": 38514305,
"block_used": 8251,
"device": "/dev/mapper/centos-home",
"fstype": "xfs",
"inode_available": 77066233,
"inode_total": 77066240,
"inode_used": 7,
"mount": "/home",
"options": "rw,seclabel,relatime,attr2,inode64,noquota",
"size_available": 157720797184,
"size_total": 157754593280,
"uuid": "d1fc9088-3a42-4b19-8ee7-9cf17c420a1d"
}
],
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false
}