Ansible的变量(vars,register,set_fact)

环境

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

概述

  • vars :Ansible关键字,用在play、role、block、task上
  • register :Ansible关键字,用在task上。注意它是一个返回值,可能需要用到其stdout
  • set_fact :即 ansible.builtin.set_fact ,是Ansible的module

创建文件 test1.yml 如下:

yaml 复制代码
---
- hosts: all
  tasks:
    - name: task1
      vars:
        var1: "aaa"
      debug:
        msg: "var1 = {{ var1 }}"

    - name: task2
      block:
        - name: part1
          shell: echo "bbb"
          register: var2
        - name: part2
          debug:
            msg: "var2 = {{ var2.stdout }}"

    - name: task3
      block:
        - name: part1
          set_fact:
            var3: "ccc"
        - name: part2
          debug:
            msg: "var3 = {{ var3 }}"

运行结果如下:

powershell 复制代码
➜  temp1113 ansible-playbook test1.yml

PLAY [all] *****************************************************************************************

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

TASK [task1] ***************************************************************************************
ok: [192.168.1.55] => {
    "msg": "var1 = aaa"
}

TASK [part1] ***************************************************************************************
changed: [192.168.1.55]

TASK [part2] ***************************************************************************************
ok: [192.168.1.55] => {
    "msg": "var2 = bbb"
}

TASK [part1] ***************************************************************************************
ok: [192.168.1.55]

TASK [part2] ***************************************************************************************
ok: [192.168.1.55] => {
    "msg": "var3 = ccc"
}

PLAY RECAP *****************************************************************************************
192.168.1.55               : ok=6    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

可见,三者都可以当作变量来使用。

注意: set_fact 定义的变量,并没有真正出现在 ansible_facts 中,只是效果相同。想要验证的话,可以打印出 ansible_facts

yaml 复制代码
      debug:
        #msg: "{{ ansible_facts['hostname'] }}" # 只打印某一项
        msg: "{{ ansible_facts }}"

区别

作用域

vars 定义的变量,只在当前作用域有效( vars 可应用于play、role、block、task)。

registerset_fact 定义的变量,在之后的task和play,仍然有效。

创建文件 test2.yml ,在 test1.yml 基础上追加一个task:

yaml 复制代码
    - name: task4
      debug:
        msg: "var2 = {{ var2.stdout }}, var1 = {{ var3 }}"

运行结果如下:

powershell 复制代码
......
TASK [task4] ***************************************************************************************
ok: [192.168.1.55] => {
    "msg": "var2 = bbb, var1 = ccc"
}
......

创建文件 test3.yml ,在 test2.yml 基础上追加一个play:

yaml 复制代码
- hosts: all
  tasks:
    - name: task5
      debug:
        msg: "var2 = {{ var2.stdout }}, var1 = {{ var3 }}"

运行结果如下:

powershell 复制代码
......
PLAY [all] *****************************************************************************************

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

TASK [task5] ***************************************************************************************
ok: [192.168.1.55] => {
    "msg": "var2 = bbb, var1 = ccc"
}
......

可见, registerset_fact 所定义的变量,在之后的task和play仍然有效。

参考

  • https://docs.ansible.com/ansible/latest/reference_appendices/playbooks_keywords.html#playbook-keywords
  • https://docs.ansible.com/ansible/latest/collections/ansible/builtin/set_fact_module.html
相关推荐
独隅1 天前
Cursor+GitOps 自动化运维实战:智能编写 Ansible 与 Terraform
运维·自动化·ansible
酷可达拉斯4 天前
自动化运维-ansible配置文件与主机清单
linux·运维·自动化·ansible
杜子不疼.5 天前
Ansible定时清空日志实战:Playbook、Cron与远程主机接入
ansible
布鲁飞丝5 天前
vivo Pulsar 万亿级消息处理实践()-Ansible运维部署
运维·ansible
爱网络爱Linux9 天前
RHCSA+RHCE 10.0全新升级!红帽Ansible自动化运维
运维·自动化·ansible·rhce认证·rhel1o·linux10·rhce10
码上上班13 天前
Ansible课程
ansible
至乐活着16 天前
Ansible自动化运维实战:从零部署高可用Nginx+静态网站集群
ansible·自动化运维·devops·playbook·配置管理
John Song19 天前
ansible-playbook常用的检查命令
windows·ansible
明航咨询_贾老师22 天前
RHCA Ansible高级自动化(DO374)认证信息整理
运维·自动化·ansible·rhca·红帽认证
有毒的教程1 个月前
Ansible批量操作自动化完整教程:批量部署服务、配置同步、软件更新实战
运维·自动化·ansible