Ansible的变量

发布时间:2023年12月26日

环境

  • 管理节点:Ubuntu 22.04
  • 控制节点:CentOS 8
  • Ansible:2.15.6

概述

我们可以在文件中定义变量,也可以在命令行传入变量,或者使用register变量(记录task的返回结果)。

变量可用作module参数,也可用于“when”语句、template、循环语句。

变量名

变量名只能由字母、数字、下划线组成,且不能以数字开头。变量名不能与Python关键字和playbook关键字重名。

比如:

  • 以下是合法的变量名:
    • foo
    • foo1
    • foo_1
    • _foo
  • 以下是非法的变量名:
    • foo-1
    • foo.bar
    • 1foo
    • else

定义和使用变量

例如:

---
- hosts: all
  vars:
    var1: "abc" # 定义变量var1
  tasks:
    - name: task1
      debug:
        msg: "hello {{ var1 }}" # 使用变量var1

引号

看下面的例子:

---
- hosts: all
  vars:
    var1: aaa
    var2: bbb{{ var1 }}
  tasks:
    - name: task1
      debug:
        msg: hello {{ var2 }} # hello bbbaaa

本例中,使用变量的地方没有加引号。

但是,如果一个值以变量开头(确切说是以 { 开头),则必须用引号引起来,比如:

---
- hosts: all
  vars:
    var1: aaa
    var2: "{{ var1 }}bbb" # 此处要用引号引起来,否则报错
  tasks:
    - name: task1
      debug:
        msg: hello {{ var2 }} # hello aaabbb

这是因为,如果不引起来,则 { 被看做是dictionary的开头。比如:

---
- hosts: all
  vars:
    var1: {name: Tom, age: 20}
  tasks:
    - name: task1
      debug:
        msg: hello {{ var1.name }} # hello Tom

总之,为了避免混淆,最好是都加上引号。比如:

---
- hosts: all
  vars:
    var1: "aaa"
    var2: "{{ var1 }}bbb"
  tasks:
    - name: task1
      debug:
        msg: "hello {{ var2 }}" # hello aaabbb

布尔变量

  • 真: True 'true' 't' 'yes' 'y' 'on' '1' 1 1.0
  • 假: False 'false' 'f' 'no' 'n' 'off' '0' 0 0.0

list

有两种定义方法:

  • 方法1:
sport:
  - football
  - basketball
  - swim
  • 方法2:
sport: [football, basketball, swim]

对于list变量,可以通过下标获取其中某个元素,比如:

---
- hosts: all
  vars:
    var1:
      - football
      - basketball
      - swim
    var2: [football, basketball, swim]
  tasks:
    - name: task1
      debug:
        msg: "{{ var1[1] }}" # basketball
    - name: task2
      debug:
        msg: "{{ var2[1] }}" # basketball

dictionary

有两种定义方法:

  • 方法1:
person:
  name: Tom
  age: 20
  • 方法2:
person: {name: Tom, age: 20}

对于dictionary变量,可以通过key获取其对应的value。下面两种方法都可以:

  • var1.key1
  • var1['key1']

比如:

---
- hosts: all
  vars:
    var1:
      name: Tom
      age: 20
    var2: {name: Tom, age: 20}
  tasks:
    - name: task1
      debug:
        msg: "{{ var1.name }}" # Tom
    - name: task2
      debug:
        msg: "{{ var2['age'] }}" # 20

register变量

---
- hosts: all
  tasks:
    - name: task1
      shell: cat /tmp/a.txt
      register: result

    - name: task2
      debug:
        msg: "OK"
      when: result.stdout == 'yes'

注:如果task fail或者被skip了,其register变量也会记录fail或者skipped状态。

在何处定义变量

在play中定义变量

比如:

- hosts: all
  vars:
    var1: xxx
    var2: xxx
  tasks:
    - name: task1
      debug:
        msg: "{{ var1 }}"

在文件中定义变量

比如:

- hosts: all
  vars_files:
    - myvars1.yml
    - myvars2.yml
  tasks:
    - name: task1
      debug:
        msg: "{{ var1 }}"

myvars1.yml 内容如下:

var1: aaa
var2: bbb
......

在命令行定义变量

使用 --extra-vars (或 -e )选项。

有以下几种方式:

  • key=value格式

比如:

ansible-playbook test1.yml --extra-vars "var1=aaa var2=bbb"
  • json格式

比如:

ansible-playbook test1.yml --extra-vars '{"var1":aaa,"var2":bbb}'

注:JSON的key必须用引号引起来,而YAML的key不用引号。

本例中使用了单引号和双引号嵌套的方式。如果都用双引号,则需要用 \ 转义:

ansible-playbook test9.yml --extra-vars "{\"var1\":aaa,\"var2\":bbb}"
  • 指定文件

比如:

ansible-playbook test1.yml --extra-vars "@myvars1.yml" --extra-vars "@myvars2.yml"

或者:

ansible-playbook test1.yml --extra-vars "@myvars1.json" --extra-vars "@myvars2.json"

myvars1.json 内容如下:

{
	"var1": aaa
}

貌似这里key不加引号也OK,但是最好还是加上吧。

变量查找的优先级

如果在多处定义同一个变量,则会根据以下规则决定变量的取值(优先级从低到高):

  • command line values (for example, -u my_user, these are not variables)
  • role defaults (defined in role/defaults/main.yml)
  • inventory file or script group vars
  • inventory group_vars/all
  • playbook group_vars/all
  • inventory group_vars/*
  • playbook group_vars/*
  • inventory file or script host vars
  • inventory host_vars/*
  • playbook host_vars/*
  • host facts / cached set_facts
  • play vars
  • play vars_prompt
  • play vars_files
  • role vars (defined in role/vars/main.yml)
  • block vars (only for tasks in block)
  • task vars (only for the task)
  • include_vars
  • set_facts / registered vars
  • role (and include_role) params
  • include params
  • extra vars (for example, -e "user=my_user" )(always win precedence)

变量的作用范围

  • Global:由配置、环境变量、命令行设定。
  • Play:每个play及所包含的结构、vars、vars_files、vars_prompt、role defaults、vars。
  • Host:直接关联于host的变量,比如inventory、include_vars、facts或者registered task结果。

参考

  • https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_variables.html
文章来源:https://blog.csdn.net/duke_ding2/article/details/135121699
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。