如何在Ansible Playbook中使用变量

  • 如何在Ansible Playbook中使用变量已关闭评论
  • 151 views
  • A+
所属分类:运维实战

如果您已经使用Python,Java,C,C ++或任何其他编程语言进行了一些编程,则变量不是无关紧要的。就像在编程语言中一样,Ansible中的变量用于存储值。

在Ansible中,变量提供了Playbook,模板和清单中急需的灵活性,我们将在本教程的后面看到。内置变量可用于提供系统信息,例如主机名,系统体系结构,接口等。变量还可用于替换字符串,也可以在循环中循环使用给定的一组值。

有效的变量名称由以下字符组成字母

  • 字母
  • 号码
  • 下划线
  • 以上任何两个或全部的组合

变量应始终以字母开头,  并且不应包含任何空间。

可接受的变量名示例包括:

  •  turntable
  •  turn_table
  •  turntable01
  •  turntable_01

以下名称不符合有效的变量名称

  •   turn table
  •  turn-table
  •  01turntable
  •  01

现在让我们看一下Ansible中变量的不同用例

Playbooks中的变量

如您所知,剧本是要在远程系统上执行的剧本或任务的集合。在剧本中,变量很容易确定如何执行任务。在剧本中为变量分配值非常简单明了。

首先调用vars关键字,然后调用变量名称,后跟值,如图所示。

---
 - hosts: all
   vars:
     salutations: Hello guys!
   tasks:
   - name: Ansible Variable Basic Usage
       debug:
       msg: "{{ salutations }}"

在上面的手册中,变量名称是  salutations  ,值是Hello world!运行playbook时,通过将变量放在花括号之间来访问剧本的值,如上所示。执行后,剧本会在终端上显示消息“ Hello guys ”。

如何在Ansible Playbook中使用变量

数组变量

您可以使用数组并将其分配给变量,如以下语法所示:

vars:

arrayname:

– value1

– value2

例如,下面的剧本包含5个学生名字的数组,这些名字存储在一个名为学生的变量中。您可以通过索引访问学生的姓名(就像在其他任何编程语言的数组中一样)。例如,要使用数组语法[2]从数组列表中检索名称“ Arthur”,如下所示。

- hosts: all
  vars:
    students:
      - Mark
      - Melisa
      - Arthur
      - Kevin
      - Lisa

  tasks:
  - name: Ansible List variable Example
    debug:
      msg: "{{ students[2] }}"

带有字典的变量

在“数组”列表中,您可以使用构成我们称为字典列表的键值对来进一步定义每个条目。语法如下所示

vars:

arrayname:

dictionary_name1:

value1: itemvalue1

value2: itemvalue2

dictionary_name2:

value1: itemvalue1

value2: itemvalue2

使用前面的示例,我们可以在下面找到字典列表

- hosts: all
  vars:
    students:
      Mark:
      city: Melbourne
      address: 0045-0987-8642
      
      Angela:
      city: Sydney
      address: 3456-7685-9087

库存文件中的变量

如果您拥有共享相似属性或值的不同主机系统,则可以定义我们所谓的组变量。这些用于分配所有主机共有的属性。

例如:

假设我们有2个Web服务器:webserver_1webserver_2都在侦听端口443,其ntp服务器是us.pool.ntp.org。库存文件将如下所示:

[web_servers]
webserver_1
webserver_2

[web_servers:vars]
http_port=443
ntp_server=us.pool.ntp.org

在YAML 格式Playbooks文件中,其表示如下所示

   web_servers:
     hosts:
       web_server_1:
       web_server_2:
         
         vars:
           http_port=80
           ntp_server=us.pool.ntp.org

第一部分定义了远程主机,分别是webserver_1webserver_1,而第二部分将两个服务器之间的公共属性分组在一起。这是应用多个主机系统通用变量的一种非常方便的方法。

主机和组变量

尽管您可以在清单文件中指定变量,但是标准做法不建议在清单文件中存储变量。这是主机和组变量文件进入的位置。

在主机变量文件中,该变量仅适用于清单文件中的一个主机系统。主机变量文件通常存储在host_vars目录中,该目录通常在/etc/ansible/路径中指定。

考虑下面的清单文件,其中我们有2个服务器,每个服务器使用不同的ntp服务器

[web_servers]
webserver_1  ntp_server=uk.pool.ntp.org
webserver_2  ntp_server=de.pool.ntp.org

不用在清单文件中指定变量ntp_server,而是在host_vars目录中创建2个主机变量文件,其文件名与主机系统的每个主机名匹配:

# vim /etc/ansible/host_vars/webserver_1
---
ntp_server=uk.pool.ntp.org

# vim /etc/ansible/host_vars/webserver_2
---
ntp_server=de.pool.ntp.org

如果主机系统共享相同的值,请在group_vars目录中创建一个组变量文件  。组变量文件名应与主机组匹配

考虑下面的库存文件

[web_servers]
webserver_1
webserver_2
[web_servers:vars]
ansible_user=root
ansible_port=22

如图所示,第二部分可以定义为group_vars目录中的文件。该目录应该在/ etc / ansible目录中。请记住,文件名应与组名相同。

# vim /etc/ansible/group_vars/web_servers
---
ansible_user=root
ansible_port=22

在这里,该变量将可供名为web_servers的组的所有主机访问。

Ansible Playbook中的特殊变量

另一类变量是特殊变量。这些是内置变量,用户无法设置,并且Ansible将始终覆盖它们。要获取唯一系统变量名称的列表,请运行以下命令

# ansible -m setup hostname

此类特殊变量的示例包括:

  • ansible_all_ipv4_addresses
  • ansible_architecture ,
  • ansible_bios_version ,
  • ansible_os_family ,
  • ansible_distribution,

这将以JSON格式显示输出

# ansible -m setup localhost

如何在Ansible Playbook中使用变量

凭借其灵活性和易用性,变量在游戏手册和清单文件中都起到了至关重要的作用。它们避免了不必要的重复,并使系统管理员的工作更加轻松。

  • 安卓客户端下载
  • 微信扫一扫
  • weinxin
  • 微信公众号
  • 微信公众号扫一扫
  • weinxin
avatar