您在这里:

目录

Ansible中的变量(Variables)

变量定义

合法变量命名

以字母开头,包含字母、数字和下划线
合法 test,test_12
不合法
12_test,test-12,test#12,test.12

全局变量

定义在配置文件或者命令行中的变量

Play变量

定义在play当中

主机变量

定义在主机或者主机组

Playbook中的变量

定义变量

• 在vars中定义

- hosts: all
    vars: 
    user: test
    home: /home/test

• 在vars_files文件中定义

- hosts: all
    vars_file: 
    - vars/users.yml

users.yml文件中定义的变量改内容
user: test
home: /home/test

变量引用

在playbook中引用变量时,使用双大括号“{{ }}”包围变量名称,而且要在前后括号建保留空格

- name: add user test 
  hosts: [node1,node2,node3]
  vars:
    username: test
  tasks:
    - name: add user {{ username }}
      user:
        name: "{{ username }}"
        uid: 1001
        state: present

...    

注意:行6和行8的区别,当变量放置在赋值的首位时,需要双引号包围

字典变量

字典变量是由key:value方式构成
一个简单的字典:
name:tesla
复杂一点的字典:

users:
    alice:
    name: alice
    sex: female
  bob:
    name: bob
    sex: male
users:
    user_a:
    first_name: user
    last_name: a
    home_dir: /home/user_a
``````yaml
users:
    user_a:
    first_name: user
    last_name: a
    home_dir: /home/user_a
``````yaml
users:
    user_a:
    first_name: user
    last_name: a
    home_dir: /home/user_a
``````yaml
users:
    user_a:
    first_name: user
    last_name: a
    home_dir: /home/user_a
```引用方式:
• 如果需要获取bob的性别,表达式:
users.bob.sex或者users['bob']['sex']
以下是一个字典变量引用列子
```yaml
vars:
  users:
    alice:
      name: Alice Appleworth
      telephone: 123-456-7890
    bob:
      name: Bob Bananarama
      telephone: 987-654-3210
tasks:
  # with predefined vars
  - name: Print phone records
    debug:
      msg: "User {{ item.key }} is {{ item.value.name }} ({{ item.value.telephone }})"
    loop: "{{ lookup('dict', users) }}"

列表变量

如下是一个列表变量的定义,列表变量显著特征是通过破折号“-”或者通过中括号"[ ]"标识,要获得name的值,引用方式:employee1[0];同理,要获得employed的值,引用方式:employee1[3]
employee1:

  • name: Martin D'vloper
  • job: Developer
  • skill: Elite
  • employed: True
    employee1[name: Martin D'vloper,job: Developer,skill: Elite,employed: True]

    字典和列表混合

    如下employee2就是一个包含字典的单项列表,而employees就是一个包含字典的多项列表

    
    ```yaml
    employee2:
  • name: Martin D'vloper
    job: Developer
    skill: Elite
    employed: True
    employees:
  • name: Martin D'vloper
    job: Developer
    skill: Elite
    employed: True
  • name: bob
    job: Developer
    skill: Elite
    employed: True

    字典和列表变量的引用

    ansible 使用缩进来分割,如果有多行前面带有 – 的话,那就是 list , 如果不是则是 dict 。如果是多个 dict 并列组成一个 list , 那每个 dict 的第一对 key:value 需要有一个 – ,请参考最后这个例子里的变量内容。下面看看列表和字典如何引用:
    `ok: [localhost] => {
    "msg": {
    "changed": false,
    "datastores": [
    {
    "accessible": true,
    "capacity": 23289061703680,
    "datastore_cluster": "N/A",
    "freeSpace": 7484953591808,
    "maintenanceMode": "normal",
    "multipleHostAccess": true,
    "name": "vsanDatastore",
    "provisioned": 30259182717392,
    "type": "vsan",
    "uncommitted": 14455074605520,
    "url": "ds:///vmfs/volumes/vsan:52afb8b6b48c7f0c-6044a2809bb85992/"
    }
    ],
    "failed": false
    }
    }`
    如果要获取"freeSpace"数值,首先我们知道datastores是一个列表变量,因为datastores后面是[],而且该变量中只有一个列表项(只有一个[]).
    那么引用第一个列表项的表达式为:datastores[0]
    "datastores": [
    {

    }
    ],
    而在这个列表项中有嵌套一个字典(显示在{}中部分内容):
    字典变量的引用方式是:key.dict或者key['dict'],注意,如果dict包含“.”时候,使用后一种引用方式,如key['192.168.10.5']。
    {
    "accessible": true,
    "capacity": 23289061703680,
    "datastore_cluster": "N/A",
    "freeSpace": 7484953591808,
    "maintenanceMode": "normal",
    "multipleHostAccess": true,
    "name": "vsanDatastore",
    "provisioned": 30259182717392,
    "type": "vsan",
    "uncommitted": 14455074605520,
    "url": "ds:///vmfs/volumes/vsan:52afb8b6b48c7f0c-6044a2809bb85992/"
    }
    那么,在以上字典和列表嵌套的情形下,需要引用到“FreeSpace”的值,写法应该是:
    datastores[0].freeSpace或者datastores[0]['freeSpace']

    主机和主机组变量

    变量定义

    在清单文件中定义
    因为不方便管理,该种方法已经不推荐使用

    [servers]
    servera remote_user=test  # 为主机定义变量
    [webserver]
    web1
    web2
    [webserver:vars]
    remote_user=test # 为主机组定义变量

    使用变量文件夹

    在inventory文件同级别目录下,创建host_vars和group_vars文件夹
    如果需要为“servera”创建变量,那么,创建yaml格式文件host_vars/servera,文件内容为:
    remote_user: test
    如果需要为主机组“webserver”创建变量,那么创建yaml格式文件group_vars/webserver,文件内容为:
    remote_user: test
    此时是的目录结构类似如下:

    project
    |
    |--ansible.cfg
    |--group_vars
    |       |--webserver
    |
    |--host_vars
    |       |--servera
    |
    |--inventory
    |
    |--playbook.yml

    数据变量

    定义

    users:
    user_a:
    first_name: user
    last_name: a
    home_dir: /home/user_a

    引用变量

    users.user_a.home_dir #返回/home/user_a
    或者
    users[‘user_a’][‘home_dir’]

    变量优先级别

    命令行变量>>playbook变量>>主机和主机组变量

发表回复

你的电子邮件地址不会被公开 * 为必填字段

提交评论

FLOWEVER

相关文章

存储界的“省钱小钢炮”

以前买国外存储,就像养了台‘进口超跑’——买得起,修不起!现在预算紧张?别慌,华为Dorado 2000来了!中低端的价格,高端的双活技能,妥妥的‘存储界五菱宏光’——皮实耐造还省油!