• 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 如下:

    ---
    - 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 }}"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    运行结果如下:

    ➜  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   
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

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

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

          debug:
            #msg: "{{ ansible_facts['hostname'] }}" # 只打印某一项
            msg: "{{ ansible_facts }}"
    
    • 1
    • 2
    • 3

    区别

    作用域

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

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

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

        - name: task4
          debug:
            msg: "var2 = {{ var2.stdout }}, var1 = {{ var3 }}"
    
    • 1
    • 2
    • 3

    运行结果如下:

    ......
    TASK [task4] ***************************************************************************************
    ok: [192.168.1.55] => {
        "msg": "var2 = bbb, var1 = ccc"
    }
    ......
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

    - hosts: all
      tasks:
        - name: task5
          debug:
            msg: "var2 = {{ var2.stdout }}, var1 = {{ var3 }}"
    
    • 1
    • 2
    • 3
    • 4
    • 5

    运行结果如下:

    ......
    PLAY [all] *****************************************************************************************
    
    TASK [Gathering Facts] *****************************************************************************
    ok: [192.168.1.55]
    
    TASK [task5] ***************************************************************************************
    ok: [192.168.1.55] => {
        "msg": "var2 = bbb, var1 = ccc"
    }
    ......
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    可见, 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
  • 相关阅读:
    Python 疫情数据可视化(爬虫+数据可视化)(Jupyter环境)
    SpringBoot知识点复习
    编写一个油猴脚本
    c#中在datagridview的表格动态增加一个按钮方法
    【数据挖掘】关联规则挖掘
    CocosCreator 面试题(二)JavaScript中的prototype的理解
    下一代Vuex(Pinia)不学你就out了
    Apifox入门实用教程
    Web3和区块链入门——Web3历史和Web3是什么?
    VSCode搭建ESP32 ESP-IDF开发环境-Windows
  • 原文地址:https://blog.csdn.net/duke_ding2/article/details/134369166