Linux变量的使用

Linux变量的使用

为了能够写出更实用的playbook,需要在playbook中使用变量。下面来讲解playbook中常见的变量。本章实验都在/home/lduan/demo2下操作,先把 demo2目录创建出来并把ansible.cfg和 hosts拷贝进去,命令如下。

[blab@server ~]$ mkdir demo2
[blab@server ~]$ cp ansible.cfg hosts demo2/
[blab@server ~]$ cd demo2/
[blab@server demo2]$

1.手动定义变量

通过vars来定义变量,vars和 tasks对齐。定义变量的格式如下。

vars:
 变量1: 值1
 变量2: 值2
 ...

定义变量时,不可有重复的变量,否则后面定义的变量的值会覆盖前面定义的变量的值,如下所示。

vars:
 aa: value1
 bb: value2
 aa: value3
 ...

这里aa重复定义了,所以aa的值最终是value3。

引用变量时用 {{变量名}} ,大括号内侧两边是否有空格是无所谓的,如下所示。

 {{变量名}}
 {{ 变量名 }}
 {{ 变量名 }}
 {{ 变量名 }}

写一个名称为1.yaml的playbook,里面定义以下3个变量。

myname1=tom
myname2=tom2
myname3=tom3

然后打印mynamel的值,命令如下。

---
- hosts: rh2
  vars:
    myname1: zhangsan1
    myname2: zhangsan2
    myname3: zhangsan3
  tasks:
  - name: 打印变量
    debug: msg="变量myname1的值是{{myname1}}"

运行此playbook,命令如下。

[blab@rh1 demo2]$ ansible-playbook 1.yaml 

PLAY [rh2] ********************************************************************************************

TASK [Gathering Facts] ********************************************************************************
ok: [rh2]

TASK [打印变量] *******************************************************************************************
ok: [rh2] => {
    "msg": "变量myname1的值是zhangsan1"
}

PLAY RECAP ********************************************************************************************
rh2                        : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

可以看到,打印了myname1的值为 zhangsan1。

定义变量时,同一个变量定义多次,后面定义的生效,修改1.yaml的内容如下。

[blab@rh1 demo2]$ cat 1.yaml
---
- hosts: rh2
  vars:
    myname1: zhangsan1
    myname2: zhangsan2
    myname3: zhangsan3
    myname1: zhangsan3
  tasks:
  - name: 打印变量
    debug: msg="变量myname1的值是{{myname1}}"

这里定义了两次 mynamel 这个变量,第一次定义的值为zhangsan1,第二次定义的值为zhangsan3。下面运行此playbook查看结果,如下所示。

[blab@rh1 demo2]$ ansible-playbook 1.yaml 
[WARNING]: While constructing a mapping from /home/blab/demo2/1.yaml, line 4, column 5, found a
duplicate dict key (myname1). Using last defined value only.

PLAY [rh2] ********************************************************************************************

TASK [Gathering Facts] ********************************************************************************
ok: [rh2]

TASK [打印变量] *******************************************************************************************
ok: [rh2] => {
    "msg": "变量myname1的值是zhangsan3"
}

PLAY RECAP ********************************************************************************************
rh2                        : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0

因为mynamel重复定义了两次,所以运行此playbook时会有提示,意思是变量重复定义了,且后面定义的myname1生效,打印的结果为 zhangsan3。

2.变量文件

如果定义的变量太多,可以把变量拿出来单独放在一个文件中,然后在playbook中通过vars_files引用此变量文件,那么就可以直接使用此变量文件中的变量了,就像变量文件中的变量直接在YAML文件中定义似的,这样更方便管理。

例如,创建文件vars.yaml,内容如下。

[blab@rh1 demo2]$ cat vars.yaml 
---
myv1: aaa
myv2: bbb
myv3: ccc

修改1.yaml 的内容如下。

[blab@rh1 demo2]$ cat 1.yaml
---
- hosts: rh2
  vars_files:
  - vars.yaml
  vars:
    myname1: zhangsan1
    myname2: zhangsan2
    myname3: zhangsan3
    myname1: zhangsan3
  tasks:
  - name: 打印变量
    debug: msg="变量myname1的值是{{myname1}}"

这里通过vars_files来引用变量文件 vars.yaml,然后打印变量myvl的值,运行结果如下。

[blab@rh1 demo2]$ ansible-playbook 1.yaml 
[WARNING]: While constructing a mapping from /home/blab/demo2/1.yaml, line 6, column 5, found a
duplicate dict key (myname1). Using last defined value only.

PLAY [rh2] ********************************************************************************************

TASK [Gathering Facts] ********************************************************************************
ok: [rh2]

TASK [打印变量] *******************************************************************************************
ok: [rh2] => {
    "msg": "变量myname1的值是zhangsan3"
}

PLAY RECAP ********************************************************************************************
rh2                        : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

3.字典变量

所谓字典(dictionaries简写为dict),就是存储多个变量的容器,可以把字典理解为一个木桶,里面存放了很多个变量。如图31-1所示,两个木桶xx和yy,里面分别存储了3个变量: aa=1,bb=2,cc=3。

同一个字典中定义的多个变量不可有重复值,否则后面定义的变量会覆盖前面定义的变量。要是引用木桶中的变量,必须指定是哪个木桶中的变量。例如,要引用木桶xx中的变量aa,则使用xx.aa。字典是在vars下定义的,语法如下。

字典名:
 var1: value2
 var2: value2

注意:在字典中定义这一个个变量时,变量前面是不加“-”的,且定义变量没有先后顺序。

通过“字典名.变量名”这种格式来引用变量,看下面的例子。

[blab@rh1 demo2]$ cat 2.yaml 
---
- hosts: rh2
  vars:
    dict1:
      myv1: aaa
      myv2: bbb
      myv3: ccc
    dict2: 
      myv1: 111
      myv2: 222
      myv3: 333
  tasks:
    - name: 打印第一个变量
      debug: msg="{{dict1.myv1}}" 

这里定义了两个字典dict1和 dict2,里面分别有3个变量,最后通过dict1.myvl引用了字典dick1中的变量myvl。通过ansible-playbook 2.yaml运行的结果应该为aaa,如下所示。

[blab@rh1 demo2]$ ansible-playbook 2.yaml 

PLAY [rh2] ********************************************************************************************

TASK [Gathering Facts] ********************************************************************************
ok: [rh2]

TASK [打印第一个变量] ****************************************************************************************
ok: [rh2] => {
    "msg": "aaa"
}

PLAY RECAP ********************************************************************************************
rh2                        : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

如果在同一个字典中出现了相同的变量名,则后面定义的变量的值会覆盖前面定义的变量的值。

4.列表变量

列表变量和字典变量比较容易弄混。下面来看一个例子,定义一个员工表,里面有3个员工,每个员工通过以下3个属性记录。

(1)uname:记录用户名。
(2)age:记录年龄。
(3)sex:记录性别。这个员工表的内容如下。

employee:
 uname: lisi
 age: 22
 sex: man
 
uname: wangwu
 age: 24
 sex: man
 
 uname: xiaohua
 age: 21
 sex: wuman

为了看得清楚,这里把每个用户用空白行隔开了。每个用户都是由3个变量组成的一个整体,这个整体是员工表employee的一个元素。所以,这个员工表有3个元素,即3个人。

每个元素都有uname,所以列表employee共有3个uname,但是这3个uname不应该是冲突的,因为它们分别属于不同的人。

但是为了防止误会,每个元素的第一个变量前都加上一个“-”,表示它是这个元素的第一个变量。所以,员工表改成如下内容。

employee:
 ‐ uname: lisi
 age: 22
 sex: man
 
‐ uname: wangwu
 age: 24
 sex: man

‐ uname: xiaohua
 age: 21
 sex: wuman

这样看起来就清晰了很多,这里employee就是一个列表。

那如果想获取某个元素(某个员工)的信息该怎么办呢?可以通employee[n]来获取,这里的n叫作下标,下标从0开始。

例如,要获取第一个用户的信息,则使用employee[0]即可,employee[0]得到的值如下。

uname: lisi
 age: 22
 sex: man

可以看到,这是由3个变量组成的,这3个变量组成了一个字典,即employee[0]就是一个字典。如果想获取第一个用户的用户名,则可以通过employee[0].uname来获取。

所以,员工表employee是由3个字典组成的;employee[0]、employee[1]、
employee[2]。

列表和字典的不同如下。

(1)列表的每个元素的第一个变量都是以“-”开头。
(2)字典的每个变量前面都不带“-”。

写一个名称为3-list.yaml 的playbook,定义一个用户列表,里面包含3个用户,每个用户由uname、sex、age组成,命令如下

[blab@rh1 demo2]$ cat 3-list.yaml 
---
- hosts: rh2
  vars:
   users:
    - uname: tom
      sex: man
      age: 19
    - uname: bob
      sex: men
      age: 20
    - name: mary
      sex: women
      age: 22
  tasks:
  - name: 打印一个变量
    debug: msg={{users[2]}}   

这里列表users定义了3个元素,现在要获取第3个元素用users[2]来表示,运行结果如下。

[blab@rh1 demo2]$ ansible-playbook 3-list.yaml 

PLAY [rh2] ********************************************************************************************

TASK [Gathering Facts] ********************************************************************************
ok: [rh2]

TASK [打印一个变量] *****************************************************************************************
ok: [rh2] => {
    "msg": {
        "age": 22,
        "name": "mary",
        "sex": "women"
    }
}

PLAY RECAP ********************************************************************************************
rh2                        : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

如果要获取第3个用户的用户名,修改3-list.yaml的内容如下。

 [blab@rh1 demo2]$ cat 3-list.yaml 
---
- hosts: rh2
  vars:
   users:
    - uname: tom
      sex: man
      age: 19
    - uname: bob
      sex: men
      age: 20
    - uname: mary
      sex: women
      age: 22
  tasks:
  - name: 打印一个变量
    debug: msg={{ users[2].uname }}   

运行此playbook,命令如下

[blab@rh1 demo2]$ ansible-playbook 3-list.yaml 

PLAY [rh2] ********************************************************************************************

TASK [Gathering Facts] ********************************************************************************
ok: [rh2]

TASK [打印一个变量] *****************************************************************************************
ok: [rh2] => {
    "msg": "mary"
}

PLAY RECAP ********************************************************************************************
rh2                        : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

定义列表时,也可以直接写值不写变量,通过如下方式来定义。

listname:
 ‐ var1
 ‐ var2
 ‐ var3

这种定义变量的方式可以换成如下内容。

listname: [var1,var2,var3,...]

你可能感兴趣的:(linux,java,数据结构)