Ansible Variables
# 什么是变量
变量提供了便捷的方式来管理Ansible
项目中的动态值。 比如nginx-1.12
,可能后期会反复的使用到这个版本的值,那么如果将此值设置为变量,后续使用和修改都将变得非常方便,这样可以简化项目的创建和维护。
# 变量定义的方式
在Ansible
中定义变量分为如下三种方式:
- 在
play
文件中进行定义变量- 通过
vars
定义变量 - 通过
vars_files
定义变量
- 通过
- 通过
inventory
在主机组或单个主机中设置变量- 通过
host_vars
对主机进行定义 - 通过
group_vars
对主机组进行定义
- 通过
- 通过命令行传递参数定义变量
# 在Playbook中定义变量
# vars方式定义变量
在playbook
的文件中开头通过vars
关键字进行变量定义
[root@manager ansible_var]# cat f1.yml
- hosts: webservers
vars:
- web_packages: httpd
- ftp_packages: vsftpd
tasks:
- name: Output Vaiables
debug:
msg:
- "{{ web_packages }}"
- "{{ ftp_packages }}"
2
3
4
5
6
7
8
9
10
11
# vars_files方式定义变量
在playbook
中使用vars_files
指定文件作为变量文件,好处就是其他的playbook
也可以调用;
准备一个用于存储变量的文件,后缀为
.yml
文件内容:vars_name: value
[root@manager ansible_var]# cat vars.yml web_packages: httpd ftp_packages: vsftpd
1
2
3使用
Playbook
调用变量文件[root@manager ansible_var]# cat f2.yml - hosts: webservers vars_files: ./vars.yml tasks: - name: Output Vaiables debug: msg: - "{{ web_packages }}" - "{{ ftp_packages }}"
1
2
3
4
5
6
7
8
9
# 在Inventory中定义变量
# Inventory文件中定义变量
在inventory
主机清单中定义变量,但是要注意:主机变量优先级高于主机组变量。(了解即可)
设定主机变量的方式
[root@manager ansible_var]# vim /etc/ansible/hosts [webservers] 172.16.1.3 myid=1 state=master 172.16.1.4 myid=2 state=backup [webservers:vars] port=80 # groups
1
2
3
4
5
6
7playbook
调用变量[root@manager ansible_var]# cat p3.yml - hosts: webservers tasks: - name: Output Vaiables debug: msg: - "{{ myid }} {{ state }} {{ port }}"
1
2
3
4
5
6
7
# 使用host_vars定义变量
在项目目录中创建
host_vars
目录,然后在创建一个文件,文件的文件名称要与inventory
清单中的主机名称要保持完全一致,如果是ip地址,则创建相同ip地址的文件即可[root@manager ansible_var]# cat hosts [webserver] 10.0.0.12 10.0.0.13 [root@manager ansible_var]# mkdir host_vars
1
2
3
4
5在
host_vars
目录中创建文件,给10.0.0.12
主机定义变量[root@manager ansible_var]# cat host_vars/10.0.0.12 web_packages: zlib-static ftp_packages: zmap
1
2
3准备一个
playbook
文件调用host_vars
目录中定义的主机变量[root@manager ansible_var]# cat f4.yml - hosts: 10.0.0.12 tasks: - name: Output Vaiables debug: msg: - "{{ web_packages }}" - "{{ ftp_packages }}" - hosts: 10.0.0.13 tasks: - name: Output Vaiables debug: msg: - "{{ web_packages }}" - "{{ ftp_packages }}"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 使用group_vars定义变量
在项目目录中创建
group_vars
目录,然后在创建一个文件,文件的文件名称要与inventory
清单中的组名称保持完全一致;[root@manager ansible_var]# cat hosts [webservers] 10.0.0.12 10.0.0.13 [root@manager ansible_var]# mkdir group_vars
1
2
3
4
5在
group_vars
目录中创建webservers
文件,为webservers
主机组设定变量;[root@manager ansible_var]# cat group_vars/webservers web_packages: wget ftp_packages: tree
1
2
3编写
playbook
,只需在playbook
文件中使用变量即可;[root@manager ansible_var]# cat f5.yml - hosts: webservers tasks: - name: Output Vaiables debug: msg: - "{{ web_packages }}" - "{{ ftp_packages }}"
1
2
3
4
5
6
7
8测试其他组能否使用
webservers
组中定义的变量;测试后会发现无法调用;[root@manager ansible_var]# cat f6.yml - hosts: lbservers # 使用lbservers tasks: - name: Output Vaiables debug: msg: - "{{ web_packages }}" - "{{ ftp_packages }}"
1
2
3
4
5
6
7
8但是系统提供了特殊的
all
组,也就说在group_vars
目录下创建一个all
文件,定义变量对所有的主机组都生效;[root@manager ansible_var]# cat group_vars/all web_packages: wget ftp_packages: tree [root@manager ansible_var]# cat f6.yml - hosts: lbservers # 无论哪个组使用该变量,都没有任何的问题 tasks: - name: Output Vaiables debug: msg: - "{{ web_packages }}" - "{{ ftp_packages }}"
1
2
3
4
5
6
7
8
9
10
11
12
# 通过执行Playbook传递变量
在执行Playbook
时,可以通过命令行--extra-vars
或-e
外置传参设定变量;
准备
playbook
文件[root@manager ansible_var]# cat f5.yml - hosts: webserver tasks: - name: Output Vaiables debug: msg: - "{{ web_packages }}" - "{{ ftp_packages }}"
1
2
3
4
5
6
7
8执行
playbook
时进行变量的传递[root@manager ansible_var]# ansible-playbook f5.yml -i hosts -e "web_packages=GeoIP"
1传递多个外置变量的方式
[root@manager ansible_var]# ansible-playbook f5.yml -i hosts -e "web_packages=GeoIP" -e "ftp_packages=telnet"
1
# 变量优先级测试
- 定义相同的变量不同的值,来测试变量的优先级。操作步骤如下
- 在
plabook
中定义vars
变量 - 在
playbook
中定义vars_files
变量 - 在
host_vars
中定义变量 - 在
group_vars
中定义变量 - 通过执行命令传递变量
- 在
- 结果报告:
- 命令行变量-->play中的vars_files-->play中的vars-->inventory-hosts-->host_vars-->group_vars/group_name-->group_vars/all-->inventory-group
# 变量注册Register
# 什么是Register
register
关键字可以将某个task
任务结果存储至变量中,最后使用debug
输出变量内容,可以用于后续排障;
# Register示例1
[root@manager ansible_var]# cat f7.yml
- hosts: all
tasks:
- name:
shell: netstat -lntp | grep 22
register: System_Status
- name: Get System Status
debug: msg={{System_Status.stdout_lines}}
#playbook执行结果
[root@manager ansible_var]# ansible-playbook f7.yml
PLAY [all] ***************************************************************************
TASK [Gathering Facts] ***************************************************************
ok: [10.0.0.12]
ok: [10.0.0.13]
TASK [shell] *************************************************************************
changed: [10.0.0.12]
changed: [10.0.0.13]
TASK [Get System Status] *************************************************************
ok: [10.0.0.12] => {
"msg": [
"tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 858/sshd ",
"tcp6 0 0 :::22 :::* LISTEN 858/sshd "
]
}
ok: [10.0.0.13] => {
"msg": [
"tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 859/sshd ",
"tcp6 0 0 :::22 :::* LISTEN 859/sshd "
]
}
PLAY RECAP ***************************************************************************
10.0.0.12 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
10.0.0.13 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# Register示例2
使用register
关键字完成jumpserver key
的创建;
[root@mananger playbook]# cat f8.yaml
- hosts: webservers
tasks:
- name: Run Shell Command Random string
shell:
cmd: 'if ! grep "SECRET_KEY" ~/.bashrc; then
SECRET_KEY=`cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 50`;
echo "SECRET_KEY=$SECRET_KEY" >> ~/.bashrc;
echo $SECRET_KEY;
else
echo $SECRET_KEY;
fi'
register: SECRET_KEY
- name: Run Shell Command BOOTSTRAP_TOKEN
shell:
cmd: 'if ! grep "BOOTSTRAP_TOKEN" ~/.bashrc; then
BOOTSTRAP_TOKEN=`cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 16`;
echo "BOOTSTRAP_TOKEN=$BOOTSTRAP_TOKEN" >> ~/.bashrc;
echo $BOOTSTRAP_TOKEN;
else
echo $BOOTSTRAP_TOKEN;
fi'
register: BOOTSTRAP_TOKEN
- name: Copy Jms Configure
template:
src: ./j-config.yml
dest: /tmp/jms_config.yml
- name: Copy Koko Configure
template:
src: ./k-config.yml
dest: /tmp/koko_config.yml
# 配置文件中:
SECRET_KEY: {{ SECRET_KEY.stdout.split('=')[1] }}
BOOTSTRAP_TOKEN: {{ BOOTSTRAP_TOKEN.stdout.split('=')[1] }}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38