在 Ansible 中使用变量

Ansible 只是一个开源 IT 引擎,用于自动执行远程系统管理任务,例如供应任务、服务编排和应用程序部署,以及许多其他 IT 任务。

Ansible 没有代理,因为不需要在目标节点上安装任何软件。 它有一个名为inventory 的文件,从中可以获取有关它必须管理的节点的信息。

Ansible 使用 playbook 来描述自动化作业,而 playbook 使用 YAML,这是一种非常简单的语言,人类易于理解、阅读和编写。 YAML 是一种人类可读的数据序列化语言,经常用于配置文件。 但它可以用于许多存储数据的应用程序。 因为 YAML 是人类可读的形式,所以即使是 IT 基础设施支持人员也可以阅读剧本并在必要时对其进行故障排除。

我们将涵盖什么?

在本教程中,我们将探索 Ansible 中使用的变量,并回顾这些变量在 Ansible 剧本中的一些用例。

先决条件

要执行本教程中的各种示例,应满足以下要求:

1. 一个 Ansible 控制器节点(在我们的例子中是 Ubuntu 20.04)和一个或两个目标节点。

2. 基本了解Ansible,编写剧本。

如果您刚开始学习 Ansible,我们建议您先开始学习 Vagrant,然后使用 Vagrant 设置基本的本地测试环境。 本实验应包含一个控制器节点和两个目标节点。

Ansible 的操作

Ansible 通过连接到目标节点并向它们发送称为“Ansible 模块”的小程序来运行。 之后,Ansible 运行这些模块(通过 SSH)然后删除它们。 不需要服务器、守护程序或数据库,您的模块库可以存储在任何计算机上。

管理节点是监督整个剧本如何执行的控制节点。 它是您从中操作设置的节点。 清单文件中提供了需要运行 Ansible 模块的主机列表。 管理节点通过 SSH 连接,在主机系统上运行微型模块,并安装产品或软件。

Ansible 的美妙之处在于它在安装模块后成功删除它们。 它连接到主机系统,运行指令,如果安装成功,则删除复制到主机上然后执行的代码。

Ansible 的变量

Ansible 中使用的变量和任何其他编程语言中的变量都非常相似。 变量可以从剧本文件到达,可以传递给 CLI,或者我们可以使用“注册”关键字来存储任务的返回值。 您可以在模块参数中的任何位置使用变量,在 p 中,使用“when”语句,当然还有循环内部,方法是给它一个值并使用它们。 可以围绕变量的值放置条件,并且剧本可以相应地利用它们。

有一些规则可以使变量名有效,例如它必须以字母开头并且仅由字母、数字和下划线组成。

剧本中的变量

我们可以通过多种方式定义变量以在 Ansible 任务中使用:

1. 从命令行:在执行 ansible-playbook 命令时使用“–extra-vars”选项:

$ ansible-playbook sample.yml --extra-vars "my_vars=bar"

2. 同样,包含变量列表的文件 (JSON/YAML) 可以传递为:

$ ansible-playbook sample.yml --extra-vars "@my_vars_file.json"

“my_vars_file.json”文件与剧本位于同一位置。

3. 通过引入“vars”部分,可以在主剧本本身中列出变量:

---

- hosts: web

vars:

my_var2: my_val2

tasks:

# Display "Variable ‘my_var2’ is set to ‘my_val2’".

- debug: msg="Variable ‘my_var2’ is set to {{ my_var2 }}"

4. 与上面类似,我们可以使用 ‘vars_file’ 部分来指定包含变量的文件:

---

- hosts: web

vars_files:

- my_vars.yml

tasks:

# Display "Variable ‘my_var1’ is set to ‘my_val1’".

- debug: msg="Variable ‘my_var1’ is set to {{ my_var1 }}"

清单文件中的变量

在这种方法中,变量要么在主机内指定,要么在组级别指定。 但是,Ansible 不建议使用清单文件来存储变量。 请参阅 example 以下:

#Host-specific variables (inline definition).

[London]

web1.example.com proxy_state=present

web2.example.com proxy_state=absent

# Variables defined for the entire group.

[London:vars]

cdn_host=london.times.example.com

compute_val=96

注册变量

注册变量可用于存储在运行时从任务/命令返回的值,然后在其他任务中使用。 例子:

---

- hosts: all

gather_facts: no

become: false

tasks:

- name: Check the user name

ansible.builtin.shell: /usr/bin/whoami

register: login

- name: Display the user name using the output from previous task

debug: msg="Logged in as user {{ login.stdout }}"

变量的范围由设置变量的位置决定。

它们在三个范围内定义:

1. 全局:这些变量可以从命令行设置,也可以使用 Ansible 配置文件设置。

2. 播放:这个变量是在播放级别定义的。

3. 主机:这些变量由清单、事实收集或任务在主机组和/或单个主机上定义

结论

在本教程中,我们了解了 Ansible 中使用的各种类型的变量。 事实上,当以适当的方式使用时,它们对于提高代码的灵活性和可理解性非常有用。