playbook 变量
文章目录
1. 变量介绍
Ansible支持利用变量来存储值,并在Ansible项目的所有文件中重复使用这些值。这可以简化项目的创建和维护,并减少错误的数量。
通过变量,可以轻松地在Ansible项目中管理给定环境的动态值。例如,变量可能包含下面这些值:
- 要创建的用户
- 要安装的软件包
- 要重新启动的服务
- 要删除的文件
- 要从互联网检索的存档
2. 定义变量
- 变量的名称必须以字母开头,并且只能包含字母、数字和下划线
2.1 可以在Ansible项目中的多个位置定义变量。为三个范围级别:
- 全局范围:从命令行或Ansible配置设置的变量
- Play范围:在play和相关结构中设置的变量
- 主机范围:由清单、事实收集或注册的任务,在主机组和个别主机上设置的变量
2.2 定义
[root@129a httpd]# ls
ansible.cfg group_vars install.yml vars
files host_vars inventory web
[root@129a httpd]# cd vars/
[root@129a vars]# ls
httpd
[root@129a vars]# cat httpd
web: httpd
[root@129a vars]# vim httpd
[root@129a vars]# cat httpd
web: httpd
user: apache
[root@129a vars]#
vars:
user: joe
tasks:
# This line will read: Creates the user joe
- name: Creates the user {{ user }}
user:
# This line will create the user named joe
name: "{{ user }}"
3. 主机变量和组变量
-
直接应用于主机的清单变量分为两在类:
- 主机变量,应用于特定主机
- 组管理,应用于一个主机组或一组主机组中的所有主机
-
主机变量优先于组变量,但playbook中定义的变量的优先级比这两者更高。
[root@129a httpd]# ls
ansible.cfg group_vars install.yml vars
files host_vars inventory web
[root@129a httpd]# vim inventory
[root@129a httpd]# cat inventory
[webservers]
130h
132a
133b
[webservers:vars]
ansible_user=root
ansible_password=run123456
[root@129a httpd]#
[root@129a httpd]# vim group_vars/webservers
[root@129a httpd]# cat group_vars/webservers
ansible_user: root
ansible_password: run123456
[root@129a httpd]# vim host_vars/130h
[root@129a httpd]# cat host_vars/130h
ansible_user: root
ansible_password: run123456
[root@129a httpd]#
4. 从命令行覆盖变量
- 清单变量可被playbook中设置的变量覆盖,这两种变量又可通过在命令行中传递参数到ansible或ansible-playbook命令来覆盖。在命令行上设置的变量称为额外变量。
- 当需要覆盖一次性运行的playbook的变量的已定义值时,额外变量非常有用
ansible-playbook main.yml -e "package=apache2"
ansible-playbook all -e "ansible_password=run123456" -m ping
5. 数组
- 除了将同一元素相关的配置数据(软件包列表、服务列表和用户列表等)分配到多个变量外,也可以使用数组。这种做法的一个好处在于,数组是可以浏览的
users:
bjones:
first_name: Bob
last_name: jones
home_dir: /users/bjones
acook:
first_name: Anne
last_name: Cook
home_dir: /users/acook
[root@129a httpd]# vim vars/httpd
[root@129a httpd]# cat vars/httpd
lamp:
pkg:
web: httpd
database: mariadb
application: php
[root@129a httpd]#
用这样引用
{{ lamp.pkg.web }}
或
{{ lamp["pkg"]["web"] }} 最好使用这个
-
如果键名与python方法或属性的名称(如discard、copy和add)相同,点表示法可能会造成问题。使用中括号表示法有助于避免冲突和错误。
-
但要声明的是,上面介绍的两种语法都有效,但为了方便故障排除,建议在任何给定Ansible项目的所有文件中一致地采用一种语法,不要混用。
6. 使用已注册变量捕获命令输出
- 可以使用register语句捕获命令输出。输出保存在一个临时变量中,然后在playbook中可用于调试用途或者达成其他目的,例如基于命令输出的特定配置。
[root@129a httpd]# vim test.yml
[root@129a httpd]# cat test.yml
---
- hosts: all
tasks:
- name: test
command: "ls /root/"
register: result
- debug: var=result
[root@129a httpd]#