23.Ansible变量
Ansible变量
变量定义的方式
-
命令行定义变量
-
在play文件定义变量
-
在主机清单定义变量
变量的优先级
命令行>playbook文件>lnventory文件
如何定义变量
playbook中定义变量
playbook变量可以通过多种方式进行定义,最简单的方式就是在playbook的开头通过vars进行定义
- hosts: web_group
vars:
- pkg: nginx
- pkg2: tree
tasks:
- name: create file
file:
path: /root/{{ pkg }}
state: touch
- name: install {{ pkg2 }}
yum:
name: "{{ pkg2 }}"
state: present
vars_file中定义变量
在playbook中使用vars定义变量,有一个缺陷,就是其他的playbook无法使用该变量。所以我们可以 采取第二种定义变量的方式,在vars_file中定义变量。
vim bianliiang.yml
pkg: httpd
pkg2: tree
pkg3: mariadb-server
vim test_vars.yml
- hosts: web_group
vars_filles: /root/ansible/bianliang/yml
tasks:
- name: create file
file:
path: /root/{{ pkg2 }}
state: touch
- name: install {{ pkg2 }}
yum:
name: "{{ pkg2 }}"
state: present
vim bianliang.yml
pkg:
- httpd
- tree
- mariadb-server
## 内置变量
- hosts: web_group
vars_files: /root/ansible/bianliang.yml
tasks:
- name:create file
file:
path: /root/{{ ansible_fqdn }}_{{ ansible_default_ipv4.address }}_{{ ansible_memtotal_mb }}
state: touch
inventory定义变量
注意:在Inventory中定义变量,主机的变量要高于主机组的变量,所以该方法不推荐使用,容易将环境弄乱。
1.命令行
2.playbook
- vars_file
- vars
3.主机清单
- host_vars
- group_vars
- inv.host
- inv.group
官方推荐的变量定义位置
## 1.创建两个目录
group_vars
host_vars
## 2.测试主机清单优先级
/etc/ansible/hosts
[web_group:vars]
filename=inventory_webgroup
[web01:vars]
filename=inventory_web01
[web02:vars]
filename=inventory_web02
[web03:vars]
filename=inventory_web03
hosts_vars
[root@m01 host_vars]# cat ./*
web01
filename: web01
web02
filename: web02
web03
filename: web03
vim web_group
filename: web_group
变量注册
如上执行结果可见,当我们使用shell模块执行ls -l /时,ansible给我们返回的只有changed我们无法看到执行之后的 结果,所以此时我们需要使用到变量注册
# 编辑playbook
vim register.yml
- hosts: web_group
tasks:
- name: test register vars
shell: "ls -l /"
register: list_dir
# 查看执行结果
[root@m01 ~]# ansible-playbook register.yml
# 只输出自己想要的内容
[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
#debug模块常用参数
msg: #调试输出的消息
var: #将某个任务执行的输出作为变量传递给debug模块,debug会直接将其打印输出
verbosity: #debug的级别(默认是0级,全部显示)
vim test_shell.yml
- hosts: web_group
tasks:
- name: xxx
shell: 'ls -l /etc/passwd /etc/shadow'
register: suibian
- name: get result
debug:
msg: "{{ suibian.stdout_lines.1 }}"
[root@m01 ~]# vim test_shell.yml
- hosts: web_group
tasks:
- name: ifconfig
shell: 'ifconfig'
register: suibian
- name: get 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 }}"
- hosts: web_group
tasks:
- name: ifconfig
shell: 'ifconfig'
register: suibian
- name: get result
debug:
msg: "{{ suibian.stdout_lines[0:7] }}"
- hosts: web_group
tasks:
- name: ifconfig
shell: 'ifconfig'
register: suibian
- name: get result
debug:
msg: "{{ suibian.stdout_lines[:7] }}"
层级定义变量
lnmp:
pkg:
web: nginx
db: mariadb-server
php: php-fpm
- hosts: web01_zls
tasks:
- name: Install {{ lnmp.pkg.db }}
yum:
name: "{{ lnmp.pkg.db }}"
state: present
facts缓存
## 关闭facts缓存
- hosts: web01_aaa
gather_facts: no
tasks:
- name: Install {{ lnmp.pkg.db }}
yum:
name: "{{ lnmp.pkg.db }}"
state: present

浙公网安备 33010602011771号