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
相关推荐
明航咨询_贾老师16 小时前
RHCA Ansible高级自动化(DO374)认证信息整理
运维·自动化·ansible·rhca·红帽认证
有毒的教程5 天前
Ansible批量操作自动化完整教程:批量部署服务、配置同步、软件更新实战
运维·自动化·ansible
Hy行者勇哥10 天前
用Cursor智能编写Ansible/Terraform脚本,打通CI/CD链路
ci/cd·ansible·terraform
芷栀夏12 天前
飞牛NAS怎么部署Immich?家庭照片自动备份与远程访问教程
服务器·nginx·ansible
悠然南风22 天前
Ansible常见模块总结及LDAP Role 编写与调试
ansible
祺风挽楠1 个月前
ansible编辑
网络·ansible
芳心粽伙饭1 个月前
Ansible课后作业
ansible
烁3471 个月前
Ansible初识
ansible
烁3471 个月前
Ansible安装部署调试
ansible
烁3471 个月前
Ansible命令
ansible