第四章·自动化运维工具-Ansible变量
变量概述
变量提供了便捷的方式来管理Ansible playbook的每一个项目中的动态值,比如nginx-1.6.3这个软件包的版本,在其它地方或许会反复使用,那么如果讲此值设置为变量,然后再在其他的playbook中调用,会方便许多。如此一来还方便维护,减少维护的成本。
定义变量的方式
- 通过命令行进行变量定义
- 在play文件中进行变量定义
- vars
- vars_files通过inventory
- inventory中定于
- hosts文件
- host_vars目录
- group_vars目录
变量的优先级
命令行 > paly > inventory
命令行 > vars_files(paly) > vars(play) > host_vars(inventory) > group_vars(inventory) > hosts文件 (inventory)
变量定义
vars变量
#在play中用vars定义变量
- host: web_group
vars:
user_group: lw
id: '456'
tasks:
- name: create {{ user_group }} group
group:
name: {{ user_group }}
gid: {{ id }}
- name: create{{ user_group }} user
user:
name: {{ user_group }}
uid: {{ id }}
group: {{ id }}
shell: /sbin/nologin
create_home: False
vars_files变量
[root@m01 ~]# cat vars.yml
user_group: lw
id: '456'
- host: web_group
vars_files: ./vars.yml
tasks:
- name: create {{ user_group }} group
group:
name: {{ user_group }}
gid: {{ id }}
- name: create{{ user_group }} user
user:
name: {{ user_group }}
uid: {{ id }}
group: {{ id }}
shell: /sbin/nologin
create_home: False
在inventory中定义变量
在inventory文件中定义变量
[root@m01 ~]# vim /etc/ansible/hosts
[web_group]
web01 ansible_ssh_host=10.0.0.7
web02 ansible_ssh_host=10.0.0.8
[web_group:vars]
user_group=lw
id='666'
host_vars
## 和yaml文件同级下创建目录
mkdir host_vars
#切记定义变量的文件必须以主机名为文件名
vim host_vars/web01
user_group: user_host_vars_web01
id: '444'
group_vars
## 和yaml文件同级下创建目录
mkdir group_vars
#切记定义变量的文件必须以组名为文件名
vim group_vars/web_group
user_group: user_group_vars_web_group
id: '444'
变量注册
为什么要学变量注册
当absible的模块在运行之后,其实都会返回一些result结果,就像是执行脚本,我们有的时候需要脚本给我们一些return返回值,我们才知道,上一步是否可以执行成功,但是...默认情况下,ansible的result并不会显示出来,所以,我们可以把这些返回值'存储'到变量中,这样我们就能通过'调用'对应的变量名,从而获取到这些result,这种将模块的返回值,写入到变量中的方法被称为变量注册.
那么咋样将返回值注册到变量,如下一个playbook
示例:
#编辑剧本
[root@m01 ~]# vim register.yml
- hosts: web_group
tasks:
- name: Test Register Vars
shell: "ls -l /"
#查看执行结果
[root@m01 ~]# ansible-playbook register.yml
PLAY [web_group] *****************************************************************************************************************************************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************************************************************************************************************************************
ok: [web02]
ok: [web01]
TASK [Test Register Vars] ********************************************************************************************************************************************************************************************************************
changed: [web01]
changed: [web02]
PLAY RECAP ***********************************************************************************************************************************************************************************************************************************
web01 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
web02 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
如上执行结果可见,当我们使用shell模块执行ls -l /时,ansible给我们返回的只有changed我们无法看到执行之后的结果,所以此时我们需要使用到变量注册
playbook如下:
#编辑playbook
[root@m01 ~]# vim register.yml
- hosts: web_group
tasks:
- name: Test Register Vars
shell: "ls -l /"
register: list_dir
- name: Return Result
debug:
msg: "{{ list_dir }}"
#查看执行结果
[root@m01 ~]# ansible-playbook register.yml
PLAY [web_group] *****************************************************************************************************************************************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************************************************************************************************************************************
ok: [web01]
ok: [web02]
TASK [Test Register Vars] ********************************************************************************************************************************************************************************************************************
changed: [web01]
changed: [web02]
TASK [Return Result] *************************************************************************************************************************************************************************************************************************
ok: [web01] => {
"msg": {
"changed": true,
"cmd": "ls -l /",
"delta": "0:00:00.005536",
"end": "2019-09-16 11:52:16.492946",
"failed": false,
"rc": 0,
"start": "2019-09-16 11:52:16.487410",
"stderr": "",
"stderr_lines": [],
"stdout": "总用量 28\nlrwxrwxrwx. 1 root root 7 3月 9 2019 bin -> usr/bin\ndr-xr-xr-x. 5 root root 4096 3月 9 2019 boot\ndrwxr-xr-x. 20 root root 3280 9月 8 12:25 dev\ndrwxr-xr-x. 80 root root 8192 9月 10 20:52 etc\ndrwxr-xr-x. 5 root root 41 9月 8 16:22 home\nlrwxrwxrwx. 1 root root 7 3月 9 2019 lib -> usr/lib\nlrwxrwxrwx. 1 root root 9 3月 9 2019 lib64 -> usr/lib64\ndrwxr-xr-x. 2 root root 6 4月 11 2018 media\ndrwxr-xr-x. 2 root root 6 4月 11 2018 mnt\ndrwxr-xr-x. 2 www www 6 9月 10 15:31 opt\ndr-xr-xr-x. 128 root root 0 9月 8 12:25 proc\ndr-xr-x---. 9 root root 4096 9月 10 21:16 root\ndrwxr-xr-x. 25 root root 740 9月 10 20:52 run\nlrwxrwxrwx. 1 root root 8 3月 9 2019 sbin -> usr/sbin\ndrwxr-xr-x. 2 root root 6 4月 11 2018 srv\ndr-xr-xr-x. 13 root root 0 9月 8 12:25 sys\ndrwxrwxrwt. 15 root root 4096 9月 16 11:52 tmp\ndrwxr-xr-x. 13 root root 155 3月 9 2019 usr\ndrwxr-xr-x. 21 root root 4096 9月 10 20:52 var",
"stdout_lines": [
"总用量 28",
"lrwxrwxrwx. 1 root root 7 3月 9 2019 bin -> usr/bin",
"dr-xr-xr-x. 5 root root 4096 3月 9 2019 boot",
"drwxr-xr-x. 20 root root 3280 9月 8 12:25 dev",
"drwxr-xr-x. 80 root root 8192 9月 10 20:52 etc",
"drwxr-xr-x. 5 root root 41 9月 8 16:22 home",
"lrwxrwxrwx. 1 root root 7 3月 9 2019 lib -> usr/lib",
"lrwxrwxrwx. 1 root root 9 3月 9 2019 lib64 -> usr/lib64",
"drwxr-xr-x. 2 root root 6 4月 11 2018 media",
"drwxr-xr-x. 2 root root 6 4月 11 2018 mnt",
"drwxr-xr-x. 2 www www 6 9月 10 15:31 opt",
"dr-xr-xr-x. 128 root root 0 9月 8 12:25 proc",
"dr-xr-x---. 9 root root 4096 9月 10 21:16 root",
"drwxr-xr-x. 25 root root 740 9月 10 20:52 run",
"lrwxrwxrwx. 1 root root 8 3月 9 2019 sbin -> usr/sbin",
"drwxr-xr-x. 2 root root 6 4月 11 2018 srv",
"dr-xr-xr-x. 13 root root 0 9月 8 12:25 sys",
"drwxrwxrwt. 15 root root 4096 9月 16 11:52 tmp",
"drwxr-xr-x. 13 root root 155 3月 9 2019 usr",
"drwxr-xr-x. 21 root root 4096 9月 10 20:52 var"
]
}
}
ok: [web02] => {
"msg": {
"changed": true,
"cmd": "ls -l /",
"delta": "0:00:00.005813",
"end": "2019-09-16 11:52:16.495422",
"failed": false,
"rc": 0,
"start": "2019-09-16 11:52:16.489609",
"stderr": "",
"stderr_lines": [],
"stdout": "总用量 24\nlrwxrwxrwx. 1 root root 7 3月 9 2019 bin -> usr/bin\ndr-xr-xr-x. 5 root root 4096 3月 9 2019 boot\ndrwxr-xr-x. 20 root root 3260 9月 10 09:47 dev\ndrwxr-xr-x. 80 root root 8192 9月 10 20:52 etc\ndrwxr-xr-x. 5 root root 41 9月 8 16:22 home\nlrwxrwxrwx. 1 root root 7 3月 9 2019 lib -> usr/lib\nlrwxrwxrwx. 1 root root 9 3月 9 2019 lib64 -> usr/lib64\ndrwxr-xr-x. 2 root root 6 4月 11 2018 media\ndrwxr-xr-x. 2 root root 6 4月 11 2018 mnt\ndrwxr-xr-x. 2 www www 6 9月 10 15:31 opt\ndr-xr-xr-x. 128 root root 0 8月 15 15:10 proc\ndr-xr-x---. 6 root root 180 9月 10 21:16 root\ndrwxr-xr-x. 25 root root 740 9月 10 20:52 run\nlrwxrwxrwx. 1 root root 8 3月 9 2019 sbin -> usr/sbin\ndrwxr-xr-x. 2 root root 6 4月 11 2018 srv\ndr-xr-xr-x. 13 root root 0 8月 15 15:10 sys\ndrwxrwxrwt. 14 root root 4096 9月 16 11:52 tmp\ndrwxr-xr-x. 13 root root 155 3月 9 2019 usr\ndrwxr-xr-x. 21 root root 4096 9月 10 20:52 var",
"stdout_lines": [
"总用量 24",
"lrwxrwxrwx. 1 root root 7 3月 9 2019 bin -> usr/bin",
"dr-xr-xr-x. 5 root root 4096 3月 9 2019 boot",
"drwxr-xr-x. 20 root root 3260 9月 10 09:47 dev",
"drwxr-xr-x. 80 root root 8192 9月 10 20:52 etc",
"drwxr-xr-x. 5 root root 41 9月 8 16:22 home",
"lrwxrwxrwx. 1 root root 7 3月 9 2019 lib -> usr/lib",
"lrwxrwxrwx. 1 root root 9 3月 9 2019 lib64 -> usr/lib64",
"drwxr-xr-x. 2 root root 6 4月 11 2018 media",
"drwxr-xr-x. 2 root root 6 4月 11 2018 mnt",
"drwxr-xr-x. 2 www www 6 9月 10 15:31 opt",
"dr-xr-xr-x. 128 root root 0 8月 15 15:10 proc",
"dr-xr-x---. 6 root root 180 9月 10 21:16 root",
"drwxr-xr-x. 25 root root 740 9月 10 20:52 run",
"lrwxrwxrwx. 1 root root 8 3月 9 2019 sbin -> usr/sbin",
"drwxr-xr-x. 2 root root 6 4月 11 2018 srv",
"dr-xr-xr-x. 13 root root 0 8月 15 15:10 sys",
"drwxrwxrwt. 14 root root 4096 9月 16 11:52 tmp",
"drwxr-xr-x. 13 root root 155 3月 9 2019 usr",
"drwxr-xr-x. 21 root root 4096 9月 10 20:52 var"
]
}
}
PLAY RECAP ***********************************************************************************************************************************************************************************************************************************
web01 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
web02 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
#只输出自己想要的内容
[root@m01 ~]# vim register.yml
- hosts: web_group
tasks:
- name: Test Register Vars
shell: "ls -l /"
register: list_dir
- name: Return Result
debug:
msg: "{{ list_dir.stdout_lines }}"
#查看结果
[root@m01 ~]# ansible-playbook register.yml
PLAY [web_group] *****************************************************************************************************************************************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************************************************************************************************************************************
ok: [web02]
ok: [web01]
TASK [Test Register Vars] ********************************************************************************************************************************************************************************************************************
changed: [web01]
changed: [web02]
TASK [Return Result] *************************************************************************************************************************************************************************************************************************
ok: [web01] => {
"msg": [
"总用量 28",
"lrwxrwxrwx. 1 root root 7 3月 9 2019 bin -> usr/bin",
"dr-xr-xr-x. 5 root root 4096 3月 9 2019 boot",
"drwxr-xr-x. 20 root root 3280 9月 8 12:25 dev",
"drwxr-xr-x. 80 root root 8192 9月 10 20:52 etc",
"drwxr-xr-x. 5 root root 41 9月 8 16:22 home",
"lrwxrwxrwx. 1 root root 7 3月 9 2019 lib -> usr/lib",
"lrwxrwxrwx. 1 root root 9 3月 9 2019 lib64 -> usr/lib64",
"drwxr-xr-x. 2 root root 6 4月 11 2018 media",
"drwxr-xr-x. 2 root root 6 4月 11 2018 mnt",
"drwxr-xr-x. 2 www www 6 9月 10 15:31 opt",
"dr-xr-xr-x. 128 root root 0 9月 8 12:25 proc",
"dr-xr-x---. 9 root root 4096 9月 10 21:16 root",
"drwxr-xr-x. 25 root root 740 9月 10 20:52 run",
"lrwxrwxrwx. 1 root root 8 3月 9 2019 sbin -> usr/sbin",
"drwxr-xr-x. 2 root root 6 4月 11 2018 srv",
"dr-xr-xr-x. 13 root root 0 9月 8 12:25 sys",
"drwxrwxrwt. 15 root root 4096 9月 16 11:54 tmp",
"drwxr-xr-x. 13 root root 155 3月 9 2019 usr",
"drwxr-xr-x. 21 root root 4096 9月 10 20:52 var"
]
}
ok: [web02] => {
"msg": [
"总用量 24",
"lrwxrwxrwx. 1 root root 7 3月 9 2019 bin -> usr/bin",
"dr-xr-xr-x. 5 root root 4096 3月 9 2019 boot",
"drwxr-xr-x. 20 root root 3260 9月 10 09:47 dev",
"drwxr-xr-x. 80 root root 8192 9月 10 20:52 etc",
"drwxr-xr-x. 5 root root 41 9月 8 16:22 home",
"lrwxrwxrwx. 1 root root 7 3月 9 2019 lib -> usr/lib",
"lrwxrwxrwx. 1 root root 9 3月 9 2019 lib64 -> usr/lib64",
"drwxr-xr-x. 2 root root 6 4月 11 2018 media",
"drwxr-xr-x. 2 root root 6 4月 11 2018 mnt",
"drwxr-xr-x. 2 www www 6 9月 10 15:31 opt",
"dr-xr-xr-x. 128 root root 0 8月 15 15:10 proc",
"dr-xr-x---. 6 root root 180 9月 10 21:16 root",
"drwxr-xr-x. 25 root root 740 9月 10 20:52 run",
"lrwxrwxrwx. 1 root root 8 3月 9 2019 sbin -> usr/sbin",
"drwxr-xr-x. 2 root root 6 4月 11 2018 srv",
"dr-xr-xr-x. 13 root root 0 8月 15 15:10 sys",
"drwxrwxrwt. 14 root root 4096 9月 16 11:54 tmp",
"drwxr-xr-x. 13 root root 155 3月 9 2019 usr",
"drwxr-xr-x. 21 root root 4096 9月 10 20:52 var"
]
}
PLAY RECAP ***********************************************************************************************************************************************************************************************************************************
web01 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
web02 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
#debug模块常用参数
msg: #调试输出的消息
var: #将某个任务执行的输出作为变量传递给debug模块,debug会直接将其打印输出
verbosity: #debug的级别(默认是0级,全部显示)
层级定义变量
#编辑变量文件
[root@m01 ~]# vim vars_file.yml
lamp:
framework:
web_package: httpd
db_package: mariadb-server
php_package: php
lnmp:
framework:
web_package: nginx
db_package: mysql
php_package: php
lnmt:
framework:
web_package: nginx
db_package: mysql
java_package: tomcat
#编辑playbook文件
[root@m01 ~]# vim test.yml
- hosts: web_group
vars_files: ./vars_file.yml
tasks:
- name: Install LAMP httpd
yum:
name: "{{ lamp.framework.web_package }}"
- name: Install LAMP mariadb-server
yum:
name: "{{ lamp.framework.db_package }}"
- name: Install LAMP php
yum:
name: "{{ lamp.framework.php_package }}"
#官方推荐写法
[root@m01 ~]# vim test.yml
- hosts: web_group
vars_files: ./vars_file.yml
tasks:
- name: Install LAMP httpd
yum:
name: "{{ lamp['framework']['web_package'] }}"
- name: Install LAMP mariadb-server
yum:
name: "{{ lamp['framework']['db_package'] }}"
- name: Install LAMP php
yum:
name: "{{ lamp['framework']['php_package'] }}"
#执行playbook
[root@m01 ~]# ansible-playbook test.yml
PLAY [web_group] *****************************************************************************************************************************************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************************************************************************************************************************************
ok: [web01]
ok: [web02]
TASK [Install LAMP httpd] ********************************************************************************************************************************************************************************************************************
ok: [web02]
ok: [web01]
TASK [Install LAMP mariadb-server] ***********************************************************************************************************************************************************************************************************
ok: [web02]
ok: [web01]
TASK [Install LAMP php] **********************************************************************************************************************************************************************************************************************
ok: [web02]
ok: [web01]
PLAY RECAP ***********************************************************************************************************************************************************************************************************************************
web01 : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
web02 : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
facts缓存
Ansible facts是在被管理追击上通过Ansible自动采集发现的变量。facts包含每台特定的主机信息。比如:被控端的主机名、IP地址、系统版本、CPU数量、内存状态、磁盘状态等等。
facts使用场景
- 通过facts缓存检查CPU,来生成对应的nginx配置文件
- 通过
facts
缓存检查主机名,生成不同的zabbix配置文件 - 通过facts缓存检索物理机的内存大小来生成不通的mysql配置文件
Ansible facts类似于saltstack中的grains对于做自动化的小伙伴是非常有用的
facts基本用法
#编辑
[root@m01 ~]# vim facts.yml
- hosts: web_group
tasks:
- name: Get Host Info
debug:
msg: >
Hostname "{{ ansible_fqdn }}" and IP "{{ ansible_default_ipv4.address }}"
#执行
[root@m01 ~]# ansible-playbook facts.yml
[root@m01 ~]# ansible-playbook facts.yml
PLAY [web_group] *****************************************************************************************************************************************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************************************************************************************************************************************
ok: [web02]
ok: [web01]
TASK [Get Host Info] *************************************************************************************************************************************************************************************************************************
ok: [web01] => {
"msg": "Hostname \"web01\" and IP \"10.0.0.7\"\n"
}
ok: [web02] => {
"msg": "Hostname \"web02\" and IP \"10.0.0.8\"\n"
}
PLAY RECAP ***********************************************************************************************************************************************************************************************************************************
web01 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
web02 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
关闭facts
[root@m01 ~]# vim facts.yml
- hosts: web_group
gather_facts: no #关闭信息采集
tasks:
facts生成mysqld配置文件
- hosts: db_group
tasks:
- name: Install mysql server
yum:
name: mariadb-server
state: present
- name: copy mysql conf
template:
src: ./my.cnf
dest: /etc/my.cnf
[root@m01 ~]# vim /etc/my.cnf
[mysqld]
basedir=/usr
datadir=/var/lib/mysql/
socket=/var/lib/mysql/mysql.sock
log_error=/var/log/mariadb/mariadb.log
innodb_buffer_pool_size={{ ansible_memtotal_mb * 0.8 }}
Comments | NOTHING