提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
ansible-变量
ansible变量
Ansible支持利用变量来存储值,并在Ansible项目的所有文件中重复使用这些值。这可以简化项目的创建和维护,并减少错误的数量。
通过变量,可以轻松地在Ansible项目中管理给定环境的动态值。例如,变量可能包含下面这些值:
- 要创建的用户
- 要安装的软件包
- 要重新启动的服务
- 要删除的文件
- 要从互联网检索的存档
命名变量
变量的名称必须以字母开头,并且只能包含字母、数字和下划线
可以在Ansible项目中的多个位置定义变量。不过,这些变量大致可简化为三个范围级别:
- 全局范围:从命令行或Ansible配置设置的变量
- Play范围:在play和相关结构中设置的变量
- 主机范围:由清单、事实收集或注册的任务,在主机组和个别主机上设置的变量
如果在多个xeklh定义了相同名称的变量,则采用优先级别最高的变量。窄范围优先于更广泛的范围:由清单定义的变量将被playbook定义的变量覆盖,后者将被命令行中定义的变量覆盖。
在Playbook中定义变量
Playbook变量可以通过多种方式定义。一种常见的方式是将变量放在playbook开头的vars块中
-hosts all
vars:
user: joe
home: /home/joe
或者也可以在外部文件中定义playbook变量。使用vars_files指令,后面跟上相对于playbook位置的外部变量文件名称列表(相对路径)
-hosts all
vars_files:
- xx.yml
[root@httpd ~]# xx.yml
user: joe
home: /home/joe
声明了变量后,可以在任务中使用这些变量。若要引用变量,可以将变量名放在双大括号内。在任务执行时,Ansible会将变量替换为其值。
注意:当变量用作开始一个值的第一元素时,必须使用引号。这可以防止Ansible将变量引用视为YAML字典的开头。
主机变量和组变量
直接应用于主机的清单变量分为两在类:
- 主机变量,应用于特定主机
- 组变量,应用于一个主机组或一组主机组中的所有主机
主机变量优先于组变量,但playbook中定义的变量的优先级比这两者更高。
若要定义主机变量和组变量,一种方法是直接在清单文件中定义。这是较旧的做法, 它使得清单文件更难以处理,在同一文件中混合提供了主机和变量信息,而且采用的也是过时的语法 ,不建议采用,
[web]
httpd ansible_user=root
[servers]
172.16.103.129
172.16.103.130
[servers:vars]
user=joe
使用目录填充主机和组变量(建议用法)
定义主机和主机组的变量的首选做法是在与清单文件或目录相同的工作目录中,创建group_vars和host_vars两个目录。这两个目录分别包含用于定义组变量和主机变量的文件。
# tree ~/project
/root/project
├── ansible.cfg
├── group_vars #组目录
│ ├── datacenters
│ ├── datacenters1
│ └── datecenters2
├── host_vars #主机目录
│ ├── node1.example.com
│ ├── node2.example.com
│ ├── node3.example.com
├── inventory
└── playbook.yml
命令行覆盖变量
清单变量可被playbook中设置的变量覆盖,这两种变量又可通过在命令行中传递参数到ansible或ansible-playbook命令来覆盖。在命令行上设置的变量称为额外变量。
当需要覆盖一次性运行的playbook的变量的已定义值时,额外变量非常有用。
使用已注册变量捕获命令输出
可以使用register语句捕获命令输出。输出保存在一个临时变量中,然后在playbook中可用于调试用途或者达成其他目的,例如基于命令输出的特定配置。
---
- name: install package
hosts: all
tasks:
- name: Install the package
yum:
name: httpd
state: installed
register: install_result
- debug: var=install_result
运行该playbook时,debug模块用于将install_result注册变量的值转储到终端。