使用变量可以简化操作,除此之外,ansible还提供了变量可以用来获取被控主机上的信息
普通变量
变量名称要求
变量名称中不能有空格,也不能有下划线(_
)以外的其他字符
如何引用变量
在tasks
中引用变量,需要使用{{}}
将变量括起来,注意在变量名称前后都有空格
当变量名称在行首出现时,还需要使用双引号""
将整行括起来
在某些特殊情况下,也可不使用{{}}
,例如在when
条件中,或者在debug
模块的var
选项中
vars:
user: joe
tasks:
- name: use variables
user:
name: "{{ user }}"
- name: use variables in debug
debug:
var: user
变量的作用范围
当同一个变量名在不同级别都出现时,使用优先级最高的变量值
- 全局变量
一般在命令行中进行定义,对命令中的所有play
生效,优先级最高
ansible -e "user=root" -e "passwd=123"
- play级别的变量
在play
中进行定义,只对指定的play
生效,优先级低于全局变量,高于主机级别的变量
---
- name: a play
vars:
- user: root
- 主机级别的变量
在inventory
文件或者指定的变量文件中定义,对相关的主机/主机组生效。优先级最低。- 在
inventory
文件中进行定义
- 在
# 主机级别的变量 直接将变量写在主机的后面
servera user=root
# 主机组级别的变量,使用[group:vars]进行定义
[servers]
servera
serverb
[servers:vars]
user=root
- 在变量文件中进行定义
ansible会自动在当前目录下寻找变量文件,主机变量文件在hostvars
目录中,主机组变量文件在groups_vars
中。
在指定目录中创建与inventory
中定义的主机/主机组同名的文件,文件中的变量会应用于对应的主机/主机组
变量矩阵
如果一个变量的值是一个列表,列表中的值还是一个列表,那么就称之为变量矩阵,类似python
中的字典嵌套字典
定义方式
users:
bjones:
first_name: Bob
last_name: Jones
acook:
first_name: Anne
last_name: Cook
调用方式
可以使用类似于python
中字典的方式调用
users['bjones']['first_name']
也可以用以下方式调用
users.bjones.first_name
建议使用第一种方式,当变量名称中包含关键字时,第二种方式可能会出现错误
几种特殊的变量
register变量
可以在playbook
运行的过程中,将task
的运行结果赋予给某个变量,在后续的task
中进行输出,或者根据结果执行不同的操作
# 示例,输出MySQL从库的同步状态
- name: get slave status
mysql_replication:
login_user: root
login_password: "{{ mysql_root_password }}"
login_unix_socket: "{{ mysql_datadir }}/mysql.sock"
login_port: "{{ mysql_port }}"
mode: getslave
register: slave_status
- name: print slave status
debug:
msg: "Slave_IO: {{ slave_status.Slave_IO_Running }},Slave_SQL: {{ slave_status.Slave_SQL_Running }}"
facts变量
ansible
在执行playbook
时,默认会收集被控主机的信息,这些信息保存在facts
变量中,以便根据被控主机信息的不同来执行不同的操作。
关闭playbook中的变量收集
---
- hosts: all
gather_facts: no
使用adhoc收集facts变量
ansible all -m setup
facts变量内容
facts
变量是以json
格式保存的被控主机的信息,默认包括IP、主机名、磁盘、挂载、CPU、内存等信息
要查询所有facts
变量内容,可以使用ansible node1 -m setup > setup.json
将变量保存到文件中进行查看
常用facts变量
- IPV4地址
ansible_default_ipv4['address']
- 主机名
ansible_hostname
- 内存
ansible_memtotal_mb
- 磁盘信息
ansible_devices
- 挂载信息
ansible_mounts
自定义facts变量
默认情况下,setup
模块会从被控节点主机上的/etc/ansible/facts.d
文件夹中获取用户定义变量。文件或者脚本以.fact
结尾
# 自定义fact文件
# cat custom.fact
[general]
package = httpd
service = httpd
state = started
enabled = true
# 调用自定义fact变量
# cat playbook.yml
---
- name: Install Apache and starts the service
hosts: webserver
tasks:
- name: Install the required package
yum:
name: "{{ ansible_facts['ansible_local']['custom']['general']['package'] }}"
state: latest
- name: Start the service
service:
name: "{{ ansible_facts['ansible_local']['custom']['general']['service'] }}"
state: "{{ ansible_facts['ansible_local']['custom']['general']['state'] }}"
enabled: "{{ ansible_facts['ansible_local']['custom']['general']['enabled'] }}"
magic变量
magic变量是本机的内容,包括inventory
文件中的内容
---
- hosts: localhost
tasks:
- name: print magic variables
debug:
var: hostvars['localhost']
网友评论