天天看点

【Linux32-5】Ansible变量详解1. 变量简介2. 变量设定3. 主机清单变量4. 目录中的变量5. 注册变量6. 引用嵌套事实变量7. 魔术变量

文章目录

  • 1. 变量简介
    • 1.1 创建有效的变量名
    • 1.2 变量范围
    • 1.3 变量的优先级
  • 2. 变量设定
    • 2.1 在playbook中直接设定
    • 2.2 在文件中设定
    • 2.3 列表变量
    • 2.4 字典变量
  • 3. 主机清单变量
  • 4. 目录中的变量
  • 5. 注册变量
  • 6. 引用嵌套事实变量
  • 7. 魔术变量

变量详解官方文档

1. 变量简介

1.1 创建有效的变量名

  • 只能包含字母,数字和下划线
  • 不能出现Python关键字或剧本关键字
  • 不能以数字开头

1.2 变量范围

Global 由配置,环境变量和命令行设置
Play 每次播放并包含结构,vars条目(vars; vars_files; vars_prompt),角色默认值和vars
Host 直接与主机相关联的变量,例如 inventory清单,include_vars,facts 或已注册的任务输出
  • 优先级:Host>Play>Global

1.3 变量的优先级

通常,Ansible优先使用最近定义,更活跃且定义范围更广的变量。角色内默认文件夹中的变量很容易被覆盖。角色的vars目录中的所有内容都会覆盖名称空间中该变量的先前版本。主机和/或库存变量将覆盖角色默认值,但显式包含(如vars目录)或

include_vars

任务将覆盖inventory库存变量
优先级从 低→高
1 命令行值不是变量:

-u my_user

2 role defaults(在role / defaults / main.yml中定义)
3 inventory file or script group vars
4 inventory group_vars/all
5 playbook group_vars/all
6 inventory group_vars/*
7 playbook group_vars/*
8 inventory file or script host vars
9 inventory host_vars/*
10 playbook host_vars/*
11 host facts / cached set_facts
12 play vars
13 play vars_prompt
14 play vars_files
15 role vars(在role / vars / main.yml中定义)
16 block变量(仅适用于block中的任务)
17 任务变量(仅适用于任务)
18 include_vars
19 set_facts /已注册的变量
20 角色(和include_role)参数
21 包含参数
22

额外的变量

(例如

-e "user=my_user"

)(始终优先)
  1. 【在任何部分中,重新定义var都会覆盖前一个实例。如果多个模块组具有相同的变量,则最后一个加载者获胜。】
  2. 【在play的vars:部分中两次定义变量,则第二个变量获胜】

2. 变量设定

2.1 在playbook中直接设定

---
- hosts: test
  vars:
    http_port: 80	#通过修改变量值,控制tast组成员的Apache端口
  tasks:
           

2.2 在文件中设定

变量文件:
---
web_pkg: httpd
           
playbook文件:
---
- host: test
  vars_files:
  - 变量文件的路径
  tasks:
  - name: 安装 apache
    dnf:
      name: "{{ web_pkg }}"
      state: present
           

2.3 列表变量

定义列表变量

region:
  - northeast
  - southeast
也可以存储在方括号中[],并用逗号分隔
           

引用列表变量

2.4 字典变量

定义字典变量

foo:
  field1: one
  field2: two
           

引用字典变量

两种引用方式:
foo['field1']	#官方推荐
foo.field1
           

3. 主机清单变量

主机变量

[test]
server2	http_port=80 ansible_connection=ssh	ansible_user=myotheruser
           

主机组变量

[test]
server2
[test:vars]
http_port=80
           

组的组的组变量

[test]
server2
[prod]
server3
[webserver:children]
test
prod
[webserver:vars]
http_port=80
           

4. 目录中的变量

  • group_vars目录:清单变量(目录中的文件名称与主机清单名称一致)
  • host_vars目录:主机变量(目录中的文件名称与主机名称一致)(取决于清单里是主机名还是ip)
示例:
#主机清单hosts
[test]
server1

则在文件group_vars/test中定义变量
           

5. 注册变量

  • 使用task关键字从Ansible任务的输出中创建变量

    register

    ,可以在剧本的任何后续任务中使用注册的变量
  • 注册变量是主机级变量。在具有循环的任务中注册变量时,注册的变量包含循环中每个项目的值。在循环期间放置在变量中的数据结构将包含一个

    results

    属性,该属性是模块中所有响应的列表
---
- name: 测试Apache,返回直
  uri:
    url: "http://172.25.17.2:{{http_port}}"
    return_content: yes
    status_code: 200
  register: result
- debug:
    msg: "{{ result['stdout'] }}"
           

6. 引用嵌套事实变量

许多注册变量和事实变量是嵌套的YAML或JSON数据结构
Ansible事实是与远程系统相关的数据,包括操作系统,IP地址,附加的文件系统等

引用事实变量

{{ ansible_facts["网卡"]["ipv4"]["address"] }}
{{ ansible_facts.网卡.ipv4.address }}
           

查看事实变量:

ansible <hostname> -m setup

缓存事实变量

与注册变量一样,事实默认情况下将事实存储在内存中。但是,与注册变量不同,事实可以独立收集并缓存以供重复使用。使用缓存的事实,即使Ansible首先在第二个系统上执行当前播放,也可以在配置第二个系统时从一个系统引用事实

禁用事实变量

- hosts: whatever
  gather_facts: no	#禁用事实变量
           

7. 魔术变量

  • 魔术变量是Special Variables。魔术变量名称是保留的,请勿使用这些名称设置变量。该变量环境也被保留
  • 常用的魔术变量:
    • hostvars
    • groups
    • group_names
    • inventory_hostname
  • 使用hostvars,可以在剧本的任何位置访问为剧本中的任何主机定义的变量。也可以使用hostvars变量来访问Ansible事实
使用groups清单中所有组(和主机)的列表,枚举组中的所有主机
{% for host in groups['组名'] %}
   # something that applies to all app servers.
{% endfor %}
           
使用groups和hostvars来查找组中的所有IP地址
{% for host in groups['组名'] %}
   {{ hostvars[主机]['ansible_facts']['网卡名']['ipv4']['address'] }}
{% endfor %}
           
其他魔术变量
ansible_play_hosts 是当前播放中仍处于活动状态的所有主机的列表
ansible_play_batch 是主机名的列表,该主机名属于该剧的当前“批处理”
serial 批处理大小(如果未设置,则等于整个运行)
ansible_playbook_python 是用于调用Ansible命令行工具的python可执行文件的路径
inventory_dir 是保存Ansible的清单主机文件的目录的路径名
inventory_file 是指向Ansible的清单主机文件的路径名和文件名
playbook_dir 包含剧本的基本目录
role_path 包含当前角色的路径名,并且仅在角色内部起作用
ansible_check_mode 是一个布尔值,True如果使用来运行Ansible ,则设置为--check

示例:

继续阅读