variables
用于内置变量或自定义变量在playbook中调用,也可使用ansible命令获取到系统变量值 在执行ansible命令后的返回值中,ansible_facts中会显示出修改的变量值信息 系统的变量可以作为判断条件
# 变量命名
仅能由字母、数字和下划线组成,且只能以字母开头
# 变量定义
key=value
http_port=80
# 变量调用
方式1
- 通过 调用变量,且变量名前后必须有空格,有时用
""
才生效
方式2
- ansible-playbook –e 选项指定
ansible-playbook test.yml -e "hosts=www user=magedu"
# 变量来源
优先级:命令指定>playbook定义>主机清单主机变量>主机清单分组变量
# 通过setup模块获取
setup模块实现系统中很多系统信息的显示,可返回每个主机的系统信息包括:版本、主机名、cpu、内存
ansible setup facts # 远程主机的所有变量都可直接调用 (系统自带变量)
查看所有系统变量值
ansible all -m setup | less
查询示例1:查询不够精确
[root@linux101 opt]# ansible all -m setup | grep ansible_memtotal_mb
"ansible_memtotal_mb": 3934,
"ansible_memtotal_mb": 3934,
"ansible_memtotal_mb": 3934,
2
3
4
查询示例2
ansible all -m setup -a 'filter="ansible_nodename"' # 查询主机名
ansible all -m setup -a 'filter="ansible_memtotal_mb"' # 查询主机内存大小
ansible all -m setup -a 'filter="ansible_distribution_major_version"' # 查询系统版本
ansible all -m setup -a 'filter="ansible_processor_vcpus"' # 查询主机cpu个数
ansible all -m setup -a 'filter=*address*' # 支持通配符
2
3
4
5
示例:创建文件夹,通过setup中读取的ansible_fqdn变量值创建
先查询
ansible app -m setup -a 'filter="ansible_fqdn"'
192.168.10.102 | SUCCESS => {
"ansible_facts": {
"ansible_fqdn": "linux102",
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false
}
...
2
3
4
5
6
7
8
9
10
编写app.yml
- hosts: app
remote_user: root
tasks:
- name: create log file
file: name=/opt/{{ ansible_fqdn }}.log state=touch mode=500 owner=stt
2
3
4
5
6
检查playbook执行文件,再执行
ansible-playbook -C app.yml
ansible-playbook app.yml
2
检查执行的结果
ansible app -a 'ls /opt/ -l'
# 在主机清单中定义
在/etc/ansible/hosts(主机清单)中定义变量
# 普通变量
主机组中主机单独定义,优先级高于公共变量(单个主机 )
示例:修改/etc/ansible/hosts,添加app组,每个主机有自己的http_port端口
[app]
192.168.10.102 http_port=81 # 单个主机变量
192.168.10.103 http_port=82
192.168.10.104 http_port=83
2
3
4
创建app.yml,对主机清单中的变量进行调用
- hosts: app
remote_user: root
tasks:
- name: set hostname
hostname: name=www{{ http_port }}.stt.com
2
3
4
5
6
执行:先检测,在执行
ansible-playbook -C app.yml
ansible-playbook app.yml
2
检查是否修改成功
ansible-playbook app -a 'hostname'
# 公共(组)变量
针对主机组中所有主机定义统一变量(一组主机的同一类别)
示例:修改hosts,添加组公共变量
[app]
192.168.10.102 http_port=81 # 单个主机变量
192.168.10.103 http_port=82
192.168.10.104 http_port=83
[app:vars] # 组变量
nodename=www
domainname=stt.com
2
3
4
5
6
7
8
修改app.yml文件
- hosts: app
remote_user: root
tasks:
- name: set hostname
hostname: name={{ nodename }}{{ http_port }}.{{ domainname }}
2
3
4
5
6
# 组嵌套变量
组还可以包含其它的组,也可向组中的主机指定变量
示例
[apache]
httpd1.stt.com
httpd2.stt.com
[nginx]
ngx1.stt.com
ngx2.stt.com
[websrvs:children] # 将上面2个组进行组合
apache
nginx
[webservers:vars] # 定义嵌套组队的变量
ntp_server=ntp.stt.com
2
3
4
5
6
7
8
9
10
11
12
13
14
组嵌套
inventory中,组还可以包含其它的组,并且也可以向组中的主机指定变量。
这些变量只能在ansible-playbook中使用,而ansible命令不支持
示例:
[apache]
httpd1.magedu.com
httpd2.magedu.com
[nginx]
ngx1.magedu.com
ngx2.magedu.com
[websrvs:children]
apache
nginx
[webservers:vars]
ntp_server=ntp.magedu.com
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 通过执行命令指定
通过命令行指定变量,优先级最高
ansible-playbook –e 'varname=value' xx.yml
# 多个变量
ansible-playbook –e 'varname=value varname2=value2' xx.yml
2
3
示例:编写app.yml
- hosts: websrvs
remote_user: root
tasks:
- name: install package
yum: name={{ pkName }}
- name: start service
service : name={{ pkName }} state=started enabled=yes
2
3
4
5
6
7
8
执行:使用 -e 表示传递的变量
ansible-playbook -e 'pkName=vsftpd' app.yml
检查ftp服务是否安装成功:通过检查21端口是否开始监听
ansible websrvs -m shell -a 'ss -ntl | grep 21'
卸载刚才安装的服务
ansible websrvs -m shell -a 'yum -y remove vsftpd'
# 在playbook中定义
在playbook中使用vars关键字,定义变量
vars:
- var1: value1
- var2: value2
2
3
示例:创建app.yml,声明2个变量并执行
- hosts: websrvs
remote_user: root
vars:
- pkname1: httpd
- pkname2: vsftpd
tasks:
- name: install package1
yum: name={{ pkname1 }}
- name: install package2
yum: name={{ pkname2 }}
2
3
4
5
6
7
8
9
10
11
执行命令
ansible-playbook app.yml
检查是否安装成功:查询安装的版本信息
ansible websrvs -m shell -a 'rpm -q httpd vsftpd'
卸载刚才的安装
ansible websrvs -m shell -a 'yum -y remove httpd vsftpd'
# 在独立的变量文件中定义
在自定义的yml文件中定义变量,在playbook中使用vars_files关键字引用
示例:安装httpd,创建log文件夹 创建变量文件,my_vars.yml
var1: httpd
var2: vsftpd
2
创建playbood的执行文件app.yml
- hosts: app
remote_user: root
vars_files:
- my_vars.yml
tasks:
- name: install package httpd
yum: name={{ var1 }}
- name: create log file vsftpd
file: name=/opt/{{ var2 }}.log state=touch
2
3
4
5
6
7
8
9
10
执行
ansible-playbook -C app.yml
ansible-playbook app.yml
2
检查安装情况
ansible app -m shell -a 'rpm -q httpd' # 查询httpd的安装版本情况
ansible app -m shell -a 'ls -l /opt' # 查看目录创建情况
2
卸载&删除文件夹
ansible websrvs -m shell -a 'yum -y remove httpd'
ansible websrvs -m shell -a 'rm -rf /opt/vsftpd.log'
2
# 在role中定义
参看role章节