目录
一、Ansible 变量:
1、什么是变量:
Ansible ⽀持利用变量来存储值,并在 Ansible 项⽬的所有⽂件中重复使用这些值,以简化项⽬的创建与维护,同时减少错误的数量。使用变量可以轻松地在 Ansible 项⽬中管理给定环境的动态值。
2、变量可能包含的值:
(1)要创建的用户;
(2)要安装的软件包;
(3)要重新启动的服务;
(4)要删除的⽂件;
(5)要从互联⽹检索的存档。
3、变量命名:
变量名由字符串组成,必须以字母开头,并且只能由字母、数字和下划线组成。
以下是一些正确变量名与无效变量名的示例:
无效变量名 | 有效变量名 |
---|---|
web server | web_server |
remote.file | remote_file |
1 file | file_1 |
file1 | |
remoteserver$1 | remote_server_1 |
remote_server1 |
4、定义变量:
在Ansible 项目中,可以在多个位置定义变量,但不同位置具有不同的优先级。
注:(1)建议选择全局唯一的变量名称;
(2)如果在两个位置设置了同名变量,且变量值不同,此时通过优先级决定要使用哪个值。
常用来定义变量的方法如下(按优先级从低到高排列):
(1)在清单中定义的组变量;
(2)在清单或 playbook 所在目录的 group_vars 子目录中定义的组变量;
(3)在清单中定义的主机变量;
(4)在清单或 playbook 所在目录的 host_vars 子目录中定义的主机变量;
(5)在运行时中发现的主机事实;
(6)playbook 中的 play 变量( vars 和 vars_files );
(7)任务变量;
(8)在命令行中定义的额外变量,使用 --extra-vars 或 -e 选项定义。
注:上述定义方法在下文中还有详细介绍。
二、Playbook 中的变量:
1、在 Playbook 中定义变量:
在编写 play 时,用户可以定义自己的变量,然后在任务中调用这些值。
(1)最简单的定义方式:
playbook 变量可通过多种方式定义,最简单的方式是将它放在 playbook 开头的 vars 块中。
(2)外部文件中定义:
也可以在外部文件中定义 playbook 变量。此时不使用 vars 块,而是在使用 vars_files 指令后,以 YAML 格式在文件中定义 playbook 变量。
(3)文件中定义:
用户还可以使用 YAML 格式在这些⽂件中定义 playbook 变量。
2、在 Playbook 中使用变量:
在声明了变量后,管理员可以在任务中使用这些变量。若要引用变量,可将变量名称放在双花括号( {{ }} )内使用,在执行任务时,Ansible 会将变量替换为对应的值。
注:(1)建议为变量使用引号,以防止 Ansible 将变量视为 YMAL 字典的开头;
(2)字典的相关内容在 Ansible(5)——编写 Playbook 这篇文章的第四部分(四、YAML 语法)中有详细介绍,转跳链接如下:https://blog.csdn.net/m0_68756914/article/details/147005394
三、主机变量与组变量:
1、什么是主机变量与组变量:
直接应用到主机的变量清单可以归为两大类:
(1)主机变量( host variables ): 应用到特定主机;
(2)组变量( group variables ):应用到某一主机或某组主机组中的所有主机。
注:主机变量优先于组变量,但 playbook 中定义的变量比这两者优先级更高。
2、定义主机变量与组变量:
(1)清单文件:
定义主机变量和组变量的一种方法是直接在清单文件( inventory )中定义。这种方式比较老,结构性不好,但因为其把主机和主机组的所有清单信息与变量设置均放到一个文件中,所以目前仍在使用。
(2)⽬录:
建议在与清单文件或目录相同的工作目录中,创建两个子目录 group_vars 和 host_vars ,分别包含用于组变量和主机变量的定义文件。
注:不要直接在一个或多个清单文件中定义主机变量和组变量。
为了定义用于主机的主机变量,需要在 host_vars 中创建名称与主机匹配的文件,来存放主机变量;为了定义 servers 组的组变量,需要创建名为 group_vars/servers 的 YAML 文件,使用与 playbook 相同的语法为变量赋值。
还以上图中的内容为例:
1)如果需要为两个数据中⼼的所有服务器定义⼀个通用值,可以为 datacenters 主机组设置⼀个组变量。
2)如果需要为每个数据中心定义不同值,可以为每个数据中心主机组( datacenter1 、datacenter2 )设置组变量。
3)如果需要为每⼀数据中⼼的各个受管主机( demo1.example.com 、demo2.example.com 、demo3.example.com 、demo4.example.com )定义不同的值,则在单独的主机变量⽂件中定义变量。
四、管理变量:
1、从命令行覆盖变量:
inventory 变量可被 playbook 中设置的变量覆盖,这两种变量又可通过在命令行中传递参数到 ansible 或 ansible-navigator run 命令来覆盖。
在命令行上设置的变量称为额外变量。如果在运行 playbook 时需要针对单个主机变量进行覆盖,则可以使用额外变量。
2、将字典用作变量:
除了将与同一元素相关的一组配置数据(软件包列表、服务列表和用户列表等)分配到多个变量外,管理员也可以使用字典做变量。
注: 字典的相关内容在 Ansible(5)——编写 Playbook 这篇文章的第四部分(四、YAML 语法)中有详细介绍,转跳链接如下:https://blog.csdn.net/m0_68756914/article/details/147005394
3、使用变量捕获命令输出行:
管理员可以使用 register 语句捕获命令的输出,输出将保存在一个变量中,可用于调试或其他目的,例如输出命令的结果等。
以上述 playbook 为例,运行该 play 时,register 语句会将对应输出保存在 install_result 变量中,debug 模块则将 install_result 注册变量的值转储到终端。