Ansible变量详解

为什么ansible也需要变量定义呢?试想一下,如果我们需要对不同host上的同一个参数使用不同的值怎么办呢?没错,我们这篇文章所讲的变量就能解决这个问题。

一说到变量,我们就会想到编程语言的变量,一般会有字符串,Map, List,Array等等。那我们playbook有哪些变量呢?
带着这些问题,让我们开始ansible变量学习吧~
Ansible主要包括如下几种常用变量

简单变量(Simple Variable)

变量定义

简单变量就包括我们平常所说的字符串,布尔值,整数和浮点数。不同类型定义实例如下

#定义字符串变量
remote_install_path: /opt/my_app_config
#定义布尔值变量
create_key: yes/false
#定义整数变量
port: 8080
#定义浮点数变量
rate: 0.5
变量使用

既然已经定义了变量,就得了解如何使用了?通常我们可以用{{variable_name}}来使用变量,实例如下

- hosts: app_servers
  vars:
      app_path: "{{ base_path }}/22"

记住:如果变量后面还有其他值,需要用双引号括起来,否则会有语法错误。如下面这段变量引用代码就会提示错误

- hosts: app_servers
  vars:
      app_path: {{ base_path }}/22

但如果变量后面没有其他值,不使用双引号也是没问题的,如下代码实例就是没问题的

- hosts: app_servers
  vars:
      app_path: {{ base_path }}

列表变量(List Variable)

变量定义

什么是列表变量?列表变量又叫数组变量,是指那些定义了多个值的变量,通常有2种写法,示例如下:

方式一:使用列表形式
region:
  - northeast
  - southeast
  - midwest
  
方式二:使用[]方式
region: [northeast, southeast, midwest]
变量使用

对于列表变量,我们可以通过"{{ list_variable_name[index] }}"去获取变量中的某一个值,index从0开始,如果我们想使用上面例子的southeast值,就可以通过以下方式去获取

south_region: "{{region[1]}}"

字典变量(Dictionary Variable)

变量定义

字典变量是指那些具有多个键值对的变量,类似于我们java里面的map。字典变量基本定义如下:

map_variable:
   key1: variable1
   key2: variable2
变量使用

对于字典变量,我们可以通过字典变量名和健值对中的key来获取对应的value,具体有2种用法,如下:
map_variable[‘key’]
map_variable.key

register变量

我们知道playbook中包含多个play,而每个play又包含多个task(如果不清楚这个,可以参考Ansible playbook基本介绍)。所以当我们希望在play中的后面task中使用前面task的结果的话怎么办呢?这时候上面几种变量就不行了,这时候我们就需要使用register变量。该变量使用关键词register对前面变量返回值进行赋值,然后在后面的task中使用上面task中赋值的变量值。
register变量的返回值可以是上面讲的各种变量,如简单变量(simple variable),列表变量(List variable), 字典变量(Dictionary variable)
以下面一个example为例进行讲解

使用实例

下面实例是一个定义了一个play的playbook,play的名字是web_servers,然后这个play下面定义了2个task,第一个task使用shell模块运行脚本,同时将运行结果注册到register变量foo_result中,第二个task使用第一个task中的register变量的值来判断是否需要执行shell命令。

# play
- hosts: web_servers

  tasks:
  
     # task 1
     - name: Run a shell command and register its output as a variable
       ansible.builtin.shell: /usr/bin/foo
       register: foo_result
       ignore_errors: true

     # task 2
     - name: Run a shell command using output of the previous task
       ansible.builtin.shell: /usr/bin/bar
       when: foo_result.rc == 5

上面讲了ansible playbook主要支持哪些变量以及每种类型变量具体怎么使用,下面我们就讲讲哪些地方可以定义变量呢?
通常我们可以在inventory, play, included files和roles文件中定义变量,下面我们就如何在这些文件定义变量进行讲解

Inventory中定义变量

Inventory可以使用上面除了register变量之外的其他所有变量。
Inventory主要包括host变量和group变量,host变量是指host level变量,而group变量是group level变量,其中group变量会对group下面的所有host生效,如果我们想对某台host使用不同的值,我们可以使用host变量去覆盖group变量中的值。具体可以通过一个例子来帮助我们理解。

下面是一个Inventory文件,定义了4个host:host1,host2,host3,host4,这4个host被定义在一个group atlanta. 其中atlanta:vars定义了group变量,会为每个host赋值这些值,然后我们对host1的port定义了host变量,覆盖group变量定义的值3100。所以下面这个例子中,所有host的ntp_server的值都是ntp.atlanta.example.com, proxy的值都是proxy.atlanta.example.com,host2,host3,host4的port值是3100,host1的port值是3200

[atlanta]
host1 port=3200
host2
host3
host4

[atlanta:vars]
ntp_server=ntp.atlanta.example.com
proxy=proxy.atlanta.example.com
port=3100

Play中定义变量

我们可以通过vars定义play级别的变量,play中定义的变量只对当前play生效,具体示例如下,vars中能定义除register外的其他变量,当然我们也可以在play的task下面定义register变量,具体参考上面的register变量

- hosts: webservers
  vars:
    http_port: 80

Included files和roles中定义变量

Included files和roles中定义变量跟上面所说的play中定义变量基本一样的。
我们可以单独创建一个文件去定义除了register以外的各种变量,如下所示

zookeeper_server: 127.0.0.1
zookeeper_client: 2180

你可能感兴趣的:(DEVOPS,devops)