【Linux32-5】Ansible变量详解


变量详解官方文档



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
也可以存储在方括号中[],并用逗号分隔

引用列表变量

region: "{
    
    { region[0] }}"

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首先在第二个系统上执行当前播放,也可以在配置第二个系统时从一个系统引用事实


{
    
    {
    
     hostvars['asdf.example.com']['ansible_facts']['os_family'] }}

禁用事实变量

- 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

示例:



猜你喜欢

转载自blog.csdn.net/weixin_46069582/article/details/112223268