Ansible中的变量
Ansible中的变量
目录
变量概述
变量提供了便捷的方式来管理Ansible playbook的每一个项目中的动态值,比如nginx-1.6.3这个软件包的版本,在其它地方或许会反复使用,那么如果将此值设置为变量,然后再在其他的playbook中调用,会方便许多。如此一来还方便维护,减少维护的成本。
变量定义的方式
-
命令行定义变量
-
在play文件定义变量
-
在主机清单里定义变量
变量的优先级
命令行 > playbook文件 > Inventory文件
如何定义变量
playbook中定义变量
playbook变量可以通过多种方式进行定义,最简单的方式就是在playbook的开头通过vars进行定义
# 1.playbook中全局定义
- hosts: web_group
# 定义变量:pkg=nginx,pkg2=tree
vars:
- pkg: nginx
- pkg2: tree
tasks:
- name: Create File
file:
# 表示创建一个叫Nginx的文件
path: /root/{{ pkg }}-------------使用变量时,变量旁边有字符,就不用双引号,双括号就行
state: touch
- name: Install {{ pkg2 }}
yum:
# 表示安装tree命令
name: "{{ pkg2 }}"----------------使用变量时,旁边没有内容,变量外面就需要双引号
state: presen
# 2.playbook中局部定义
- hosts: web_group
tasks:
- name: Create File
file:
path: /root/{{ pkg }}
state: touch
- name: Install {{ pkg2 }}
yum:
name: "{{ pkg2 }}"
state: presen
vars: --------------------与单个模块同级,其他模块将无法识别到变量
- pkg: nginx
- pkg2: tree
vars_file中定义变量
刚才我们学到在playbook中使用vars定义变量,有一个缺陷,就是其他的playbook无法使用该变量。所以我们可以 采取第二种定义变量的方式,在vars_file中定义变量
# 编辑一个变量文件,也必须是yml结尾,在里面定义变量
[root@m01 ansible]$ vim bianliang.yml
pkg: httpd
pkg2: tree
pkg3: mariadb-server
# 在playbook中,利用vars_files调用配置好的变量文件,然后就可以使用文件中的变量
[root@m01 ansible]$ vim test_vars.yml
- hosts: web_group
vars_files: /root/ansible/bianliang.yml
tasks:
- name: Create File
file:
path: /root/{{ pkg2 }}
state: touch
# 一个变量设置多个值
pkg:
- httpd
- tree
- mariadb-server
# 调用pkg去安装时,会将httpd,tree,mariadb-server全部安装
系统内置变量
系统内置变量有哪些
## 系统内置变量
ansible_all_ipv4_addresses:仅显示ipv4的信息。
ansible_devices:仅显示磁盘设备信息。
ansible_distribution:显示是什么系统,例:centos,suse等。
ansible_distribution_major_version:显示是系统主版本。
ansible_distribution_version:仅显示系统版本。
ansible_machine:显示系统类型,例:32位,还是64位。
ansible_eth0:仅显示eth0的信息。
ansible_fqdn / ansible_hostname:仅显示主机名。
ansible_kernel:仅显示内核版本。
ansible_lvm:显示lvm相关信息。
ansible_memtotal_mb:显示系统总内存。
ansible_memfree_mb:显示可用系统内存。
ansible_memory_mb:详细显示内存情况。
ansible_swaptotal_mb:显示总的swap内存。
ansible_swapfree_mb:显示swap内存的可用内存。
ansible_mounts:显示系统磁盘挂载情况。
ansible_processor:显示cpu个数(具体显示每个cpu的型号)。
ansible_processor_vcpus:显示cpu个数(只显示总的个数)。
调用系统内置变量
- hosts: web_group
tasks:
- name: Create File
file:
# 在web端创建/root下以主机名_ip信息(ansible_default_ipv4.address表示:取ipv4下面的address,可以直接取出ip信息)_总内存大小,命名的文件
path: /root/{{ ansible_fqdn }}_{{ ansible_default_ipv4.address }}_{{ ansible_memtotal_mb }}
state: touch
不调用系统内置变量
facts:playbook执行之前会先调取系统内置变量
- hosts: web_group
# 关闭facts缓存:不加载内置变量,默认开启,只能影响内置变量,不影响手动设置的变量
gather_facts: no
tasks:
- name: Create File
file:
path: /root/{{ ansible_fqdn }}_{{ ansible_default_ipv4.address }}_{{ ansible_memtotal_mb }}
state: touch
inventory定义变量 (了解即可)
注意:在Inventory中定义变量,主机的变量要高于主机组的变量,所以该方法不推荐使用,容易将环境弄乱。
# 在主机清单中定义
[root@m01 ~]$ vim /etc/ansible/hosts
## 在指定的主机组中定义变量只有当前主机组能识别
[web_group:vars]
pkg=httpd
pkg2=tree
优先级总结
1.命令行
2.vars_file
3.vars
4.host_vars:单个主机
5.group_vars:主机组
6.主机清单中的单个主机
7.主机清单中的主机组
官方推荐的变量定义位置
之前的几种变量定义都不是很好用,比较好用的是在Ansible项目目录下创建两个变量目录:
-
host_vars
-
group_vars
切记,目录名字一定要一致,不能做任何修改,并且目录必须和yml文件同级
# 创建两个目录
mkdir host_vars
mkdir group_vars
# 主机定义变量:在host_vars主机变量目录下创建的变量文件,必须以主机名命名,代表给指定主机定义的变量
vim ansible/host_vars/web01
filename=inventory_web01
vim ansible/host_vars/web02
filename=inventory_web02
vim ansible/host_vars/web03
filename=inventory_web03
# 主机组定义变量:在group_vars主机组变量目录下创建的变量文件,必须以主机组命名,代表给指定主机组定义的变量
vim ansible/group_vars/web_group
filename=web_group
变量注册
默认情况下,ansible的result并不会显示出来,所以,我们可以把这些返回值'存储'到变量中,这样我们就能通过'调用'对应的变量名,从而获取到这些result,这种将模块的返回值,写入到变量中的方法被称为变量注册
# 利用shell模块查看web端根目录下的信息
[root@m01 ~/ansible]$ vim test.yml
- hosts: web_group
tasks:
- name: Test Register Vars
shell: "ls -l /"
# 不会返回任何结果
[root@m01 ~/ansible]$ ansible-playbook test.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
[root@m01 ~/ansible]$ vim test.yml
- hosts: web_group
tasks:
- name: Test Register Vars
shell: "ls -l /"
# 表示将shell模块执行的结果,利用register赋值给了list_dir(list_dir可以随便写)
register: list_dir
- name: Return Result
# debug模块
debug:
# 利用msg动作调用上面的赋值,并打印
msg: "{{ list_dir }}"
# 再次查看执行结果
[root@m01 ~/ansible]$ ansible-playbook test.yml
ok: [web01] => {
"stdout_lines": [
"total 20",
"lrwxrwxrwx. 1 root root 7 Jul 5 19:02 bin -> usr/bin",
"dr-xr-xr-x. 5 root root 4096 Jul 5 19:05 boot",
"drwxr-xr-x 3 www www 23 Aug 14 17:21 code",
"drwxr-xr-x 19 root root 3200 Jul 8 23:06 dev",
"drwxr-xr-x. 84 root root 8192 Aug 14 17:21 etc",
"drwxr-xr-x. 2 root root 6 Apr 11 2018 home",
"lrwxrwxrwx. 1 root root 7 Jul 5 19:02 lib -> usr/lib",
"lrwxrwxrwx. 1 root root 9 Jul 5 19:02 lib64 -> usr/lib64",
"drwxr-xr-x. 2 root root 6 Apr 11 2018 media",
"drwxr-xr-x. 2 root root 6 Apr 11 2018 mnt",
"drwxr-xr-x. 2 root root 6 Apr 11 2018 opt",
"dr-xr-xr-x 121 root root 0 Jul 8 23:06 proc",
"dr-xr-x---. 4 root root 179 Aug 14 17:19 root",
"drwxr-xr-x 25 root root 740 Aug 14 17:21 run",
"lrwxrwxrwx. 1 root root 8 Jul 5 19:02 sbin -> usr/sbin",
"drwxr-xr-x. 2 root root 6 Apr 11 2018 srv",
"dr-xr-xr-x 13 root root 0 Aug 15 15:31 sys",
"drwxrwxrwt. 20 root root 4096 Aug 15 15:35 tmp",
"drwxr-xr-x. 13 root root 155 Jul 5 19:02 usr",
"drwxr-xr-x. 20 root root 278 Aug 14 17:21 var"
]
}
ok: [web02] => {
"stdout_lines": [
"total 20",
"lrwxrwxrwx. 1 root root 7 Jul 5 19:02 bin -> usr/bin",
"dr-xr-xr-x. 5 root root 4096 Jul 5 19:05 boot",
"drwxr-xr-x 3 www www 23 Aug 14 17:21 code",
"drwxr-xr-x 19 root root 3200 Jul 8 23:11 dev",
"drwxr-xr-x. 84 root root 8192 Aug 14 17:21 etc",
"drwxr-xr-x. 2 root root 6 Apr 11 2018 home",
"lrwxrwxrwx. 1 root root 7 Jul 5 19:02 lib -> usr/lib",
"lrwxrwxrwx. 1 root root 9 Jul 5 19:02 lib64 -> usr/lib64",
"drwxr-xr-x. 2 root root 6 Apr 11 2018 media",
"drwxr-xr-x. 2 root root 6 Apr 11 2018 mnt",
"drwxr-xr-x. 2 root root 6 Apr 11 2018 opt",
"dr-xr-xr-x 120 root root 0 Jul 8 23:11 proc",
"dr-xr-x---. 4 root root 179 Aug 14 17:19 root",
"drwxr-xr-x 25 root root 740 Aug 14 17:21 run",
"lrwxrwxrwx. 1 root root 8 Jul 5 19:02 sbin -> usr/sbin",
"drwxr-xr-x. 2 root root 6 Apr 11 2018 srv",
"dr-xr-xr-x 13 root root 0 Aug 15 15:31 sys",
"drwxrwxrwt. 20 root root 4096 Aug 15 15:35 tmp",
"drwxr-xr-x. 13 root root 155 Jul 5 19:02 usr",
"drwxr-xr-x. 20 root root 278 Aug 14 17:21 var"
]
}
# 只输出想要查看的内容
[root@m01 ~/ansible]$ vim test.yml
- hosts: web_group
tasks:
- name: Test Register Vars
shell: "ls -l /"
register: list_dir
- name: Return Result
debug:
msg: "{{ list_dir.stdout_lines }}" ----------指定整个结果中的stdout_lines模块
# 查看结果
[root@m01 ~/ansible]$ ansible-playbook test.yml
ok: [web01] => {
"msg": [
"total 20",
"lrwxrwxrwx. 1 root root 7 Jul 5 19:02 bin -> usr/bin",
"dr-xr-xr-x. 5 root root 4096 Jul 5 19:05 boot",
"drwxr-xr-x 3 www www 23 Aug 14 17:21 code",
"drwxr-xr-x 19 root root 3200 Jul 8 23:06 dev",
"drwxr-xr-x. 84 root root 8192 Aug 14 17:21 etc",
"drwxr-xr-x. 2 root root 6 Apr 11 2018 home",
"lrwxrwxrwx. 1 root root 7 Jul 5 19:02 lib -> usr/lib",
"lrwxrwxrwx. 1 root root 9 Jul 5 19:02 lib64 -> usr/lib64",
"drwxr-xr-x. 2 root root 6 Apr 11 2018 media",
"drwxr-xr-x. 2 root root 6 Apr 11 2018 mnt",
"drwxr-xr-x. 2 root root 6 Apr 11 2018 opt",
"dr-xr-xr-x 122 root root 0 Jul 8 23:06 proc",
"dr-xr-x---. 4 root root 179 Aug 14 17:19 root",
"drwxr-xr-x 25 root root 740 Aug 14 17:21 run",
"lrwxrwxrwx. 1 root root 8 Jul 5 19:02 sbin -> usr/sbin",
"drwxr-xr-x. 2 root root 6 Apr 11 2018 srv",
"dr-xr-xr-x 13 root root 0 Aug 15 15:31 sys",
"drwxrwxrwt. 20 root root 4096 Aug 15 15:37 tmp",
"drwxr-xr-x. 13 root root 155 Jul 5 19:02 usr",
"drwxr-xr-x. 20 root root 278 Aug 14 17:21 var"
]
}
ok: [web02] => {
"msg": [
"total 20",
"lrwxrwxrwx. 1 root root 7 Jul 5 19:02 bin -> usr/bin",
"dr-xr-xr-x. 5 root root 4096 Jul 5 19:05 boot",
"drwxr-xr-x 3 www www 23 Aug 14 17:21 code",
"drwxr-xr-x 19 root root 3200 Jul 8 23:11 dev",
"drwxr-xr-x. 84 root root 8192 Aug 14 17:21 etc",
"drwxr-xr-x. 2 root root 6 Apr 11 2018 home",
"lrwxrwxrwx. 1 root root 7 Jul 5 19:02 lib -> usr/lib",
"lrwxrwxrwx. 1 root root 9 Jul 5 19:02 lib64 -> usr/lib64",
"drwxr-xr-x. 2 root root 6 Apr 11 2018 media",
"drwxr-xr-x. 2 root root 6 Apr 11 2018 mnt",
"drwxr-xr-x. 2 root root 6 Apr 11 2018 opt",
"dr-xr-xr-x 120 root root 0 Jul 8 23:11 proc",
"dr-xr-x---. 4 root root 179 Aug 14 17:19 root",
"drwxr-xr-x 25 root root 740 Aug 14 17:21 run",
"lrwxrwxrwx. 1 root root 8 Jul 5 19:02 sbin -> usr/sbin",
"drwxr-xr-x. 2 root root 6 Apr 11 2018 srv",
"dr-xr-xr-x 13 root root 0 Aug 15 15:31 sys",
"drwxrwxrwt. 20 root root 4096 Aug 15 15:37 tmp",
"drwxr-xr-x. 13 root root 155 Jul 5 19:02 usr",
"drwxr-xr-x. 20 root root 278 Aug 14 17:21 var"
]
}
debug模块常用参数
msg: #调试输出的消息
var: #将某个任务执行的输出作为变量传递给debug模块,debug会直接将其打印输出
verbosity: #debug的级别(默认是0级,全部显示)
利用ifconfig查看eth0的网卡信息
[root@m01 ~/ansible]$ vim test.yml
- hosts: web_group
tasks:
- name: Test Register Vars
shell: "ifconfig"
register: suibian
- name: Return Result
debug:
msg: "{{ suibian.stdout_lines }}"
# 查看结果
[root@m01 ~/ansible]$ ansible-playbook test.yml
PLAY [web_group] ***************************************************************
TASK [Gathering Facts] *********************************************************
ok: [web02]
ok: [web01]
TASK [Test Register Vars] ******************************************************
changed: [web02]
changed: [web01]
TASK [Return Result] ***********************************************************
ok: [web01] => {
"msg": [
"eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500",
" inet 10.0.0.7 netmask 255.255.255.0 broadcast 10.0.0.255",
" inet6 fe80::20c:29ff:fee9:c96a prefixlen 64 scopeid 0x20<link>",
" ether 00:0c:29:e9:c9:6a txqueuelen 1000 (Ethernet)",
" RX packets 25022 bytes 33152427 (31.6 MiB)",
" RX errors 0 dropped 0 overruns 0 frame 0",
" TX packets 7785 bytes 1701680 (1.6 MiB)",
" TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0",
"",
"eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500",
" inet 172.16.1.7 netmask 255.255.255.0 broadcast 172.16.1.255",
" inet6 fe80::20c:29ff:fee9:c974 prefixlen 64 scopeid 0x20<link>",
" ether 00:0c:29:e9:c9:74 txqueuelen 1000 (Ethernet)",
" RX packets 32809 bytes 43612898 (41.5 MiB)",
" RX errors 0 dropped 0 overruns 0 frame 0",
" TX packets 6922 bytes 709784 (693.1 KiB)",
" TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0",
"",
"lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536",
" inet 127.0.0.1 netmask 255.0.0.0",
" inet6 ::1 prefixlen 128 scopeid 0x10<host>",
" loop txqueuelen 1000 (Local Loopback)",
" RX packets 22 bytes 13552 (13.2 KiB)",
" RX errors 0 dropped 0 overruns 0 frame 0",
" TX packets 22 bytes 13552 (13.2 KiB)",
" TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0"
]
}
ok: [web02] => {
"msg": [
"eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500",
" inet 10.0.0.8 netmask 255.255.255.0 broadcast 10.0.0.255",
" inet6 fe80::20c:29ff:fe02:880a prefixlen 64 scopeid 0x20<link>",
" ether 00:0c:29:02:88:0a txqueuelen 1000 (Ethernet)",
" RX packets 24380 bytes 33105256 (31.5 MiB)",
" RX errors 0 dropped 0 overruns 0 frame 0",
" TX packets 6460 bytes 424432 (414.4 KiB)",
" TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0",
"",
"eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500",
" inet 172.16.1.8 netmask 255.255.255.0 broadcast 172.16.1.255",
" inet6 fe80::20c:29ff:fe02:8814 prefixlen 64 scopeid 0x20<link>",
" ether 00:0c:29:02:88:14 txqueuelen 1000 (Ethernet)",
" RX packets 32328 bytes 43371472 (41.3 MiB)",
" RX errors 0 dropped 0 overruns 0 frame 0",
" TX packets 6391 bytes 648620 (633.4 KiB)",
" TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0",
"",
"lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536",
" inet 127.0.0.1 netmask 255.0.0.0",
" inet6 ::1 prefixlen 128 scopeid 0x10<host>",
" loop txqueuelen 1000 (Local Loopback)",
" RX packets 0 bytes 0 (0.0 B)",
" RX errors 0 dropped 0 overruns 0 frame 0",
" TX packets 0 bytes 0 (0.0 B)",
" TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0"
]
}
# 尝试只取出网卡信息
[root@m01 ~/ansible]$ vim test.yml
- hosts: web_group
tasks:
- name: Test Register Vars
shell: "ifconfig"
register: suibian
- name: Return Result
debug:
# 表示取出列表的第一行,0就是第一个元素,1才是第二个,以此类推
msg: "{{ suibian.stdout_lines.0 }}"
# 查看结果
[root@m01 ~/ansible]$ ansible-playbook test.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": "eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500"
}
ok: [web02] => {
"msg": "eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500"
}
----------------------------------------------------------------------------------------
# 如何做到取出整个eth0信息
# 1.第一种方式
[root@m01 ~/ansible]$ vim test.yml
- hosts: web_group
tasks:
- name: Test Register Vars
shell: "ifconfig"
register: suibian
- name: Return Result
debug:
# 表示取出第一行到第八行的内容
msg: "{{ suibian.stdout_lines[0:7] }}"
# 2.第二种方式
[root@m01 ~/ansible]$ vim test.yml
- hosts: web_group
tasks:
- name: Test Register Vars
shell: "ifconfig"
register: suibian
- name: Return Result
debug:
msg:
- "{{ suibian.stdout_lines.0 }}"
- "{{ suibian.stdout_lines.1 }}"
- "{{ suibian.stdout_lines.2 }}"
- "{{ suibian.stdout_lines.3 }}"
- "{{ suibian.stdout_lines.4 }}"
- "{{ suibian.stdout_lines.5 }}"
- "{{ suibian.stdout_lines.6 }}"
- "{{ suibian.stdout_lines.7 }}"
# 第三种方式
[root@m01 ~/ansible]$ vim test.yml
- hosts: web_group
tasks:
- name: Test Register Vars
shell: "ifconfig"
register: suibian
- name: Return Result
debug:
msg: "{{ suibian.stdout_lines[:7] }}"
# 最后的结果
[root@m01 ~/ansible]$ ansible-playbook test.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": [
"eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500",
" inet 10.0.0.7 netmask 255.255.255.0 broadcast 10.0.0.255",
" inet6 fe80::20c:29ff:fee9:c96a prefixlen 64 scopeid 0x20<link>",
" ether 00:0c:29:e9:c9:6a txqueuelen 1000 (Ethernet)",
" RX packets 25071 bytes 33157588 (31.6 MiB)",
" RX errors 0 dropped 0 overruns 0 frame 0",
" TX packets 7829 bytes 1705024 (1.6 MiB)"
]
}
ok: [web02] => {
"msg": [
"eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500",
" inet 10.0.0.8 netmask 255.255.255.0 broadcast 10.0.0.255",
" inet6 fe80::20c:29ff:fe02:880a prefixlen 64 scopeid 0x20<link>",
" ether 00:0c:29:02:88:0a txqueuelen 1000 (Ethernet)",
" RX packets 24429 bytes 33110417 (31.5 MiB)",
" RX errors 0 dropped 0 overruns 0 frame 0",
" TX packets 6504 bytes 427776 (417.7 KiB)"
]
}
层级定义变量
# 在group_vars官方推荐目录下定义web_group组专用变量
[root@m01 ~/ansible]$ vim group_vars/web_group
## 表示:lnmp变量下包含pkg变量,pkg变量下又包含了web,db,php三个变量(两个空格缩进,但是不能加横杠)
lnmp:
pkg:
web: nginx
db: mariadb-server
php: php-fpm
调用方式
# 调用层级变量需要在变量之间加上.符号
[root@m01 ~/ansible]$ vim test.yml
- hosts: web_group
tasks:
# 表示安装mariadb-server
- name: Install {{ lnmp.pkg.db }}
yum:
name: "{{ lnmp.pkg.db }}"
state: present
# 执行结果
[root@m01 ~/ansible]$ ansible-playbook test.yml
PLAY [web_group] ***************************************************************
TASK [Gathering Facts] *********************************************************
ok: [web02]
ok: [web01]
## 任务名也成功调用变量
TASK [Install mariadb-server] **************************************************
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