自动化运维-ansible中的变量运用

发布于:2025-09-02 ⋅ 阅读:(19) ⋅ 点赞:(0)

自动化运维-ansible中的变量运用

一、变量命名规则

  • 组成:字母、数字、下划线。
  • 必须字母开头。
    • 合法: app_port, web_1, varA
    • 非法: 2_var (以数字开头), my-var (包含其他字符), _private (以下划线开头)
  • 避免使用内置关键字:例如 hosts, tasks, name, vars, when, register 等。

二、变量的优先级

  1. Global范围(高):从命令行和ansible配置设置的变量
  2. play范围(中):set_fact、register和在play和相关结构中设置的变量
  3. Host范围(低):inventory、facts的变量,在主机组和个别主机上设置的变量

命令行 > Playbook 中的设置 > Inventory 中的设置 > 角色默认值

越“具体”的设置,优先级越高

三、注册和定义变量的各种方式

  1. vars 定义变量
  2. Vars_files 定义变量
  3. register 注册变量
  4. set_fact 定义变量
  5. 通过命令传入变量
  6. 主机清单中的变量
  7. 内置变量
  8. With_itens 叠加变量

四、对各种方式的示例

  1. vars 定义变量

    [student@master ansible] vim a.yml
    # 编辑内容如下
    ---
    - name: test1
      hosts: node1
      vars:
        - a: 1
        - b: 2
        - c:
            c1: 3
            c2: 4
      tasks:
        - name: test11
          debug:
            msg: this is {{ a }}
    
        - name: test12
          debug:
            msg: "{{ b }}"
    
        - name: test13
          debug:
            msg: "{{ c.c1 }}"
    
        - name: test14
          debug:
            var: c.c2
    

    在这里插入图片描述

  2. Vars_files 定义变量

    [student@master ansible] vim yyy
    # 编辑内容如下
    a: 1
    b: 2
    c: 
      c1: 3
      c2: 4
    
    [student@master ansible] vim b.yml
    # 编辑内容如下
    ---
    - name: test2
      hosts: node1
      vars_files: /home/student/ansible/yyy
      tasks:
        - name: test21
          debug:
            msg: this is {{ a }}
    
        - name: test22
          debug:
            msg: "{{ b }}"
    
        - name: test23
          debug:
            msg: "{{ c.c1 }}"
    
        - name: test24
          debug:
            var: c.c2
    

    在这里插入图片描述

  3. register 注册变量

    使⽤register选项,可以将当前task的输出结果赋值给⼀个变量

    以下示例:/tmp/file1 的内容为 123321 ,/tmp/file11 不存在

    [student@master ansible] vim c.yml
    # 编辑内容如下
    ---
    - name: test3
      hosts: node1
      tasks:
        - name: test31
          shell:
            cmd: cat /tmp/file1
          register: yy
    
        - name: test32
          debug:
            var: yy.stdout
    
        - name: test33
          shell:
            cmd: cat /tmp/file11
          register: yyyy
          ignore_errors: yes
    
        - name: test34
          debug:
            var: yyyy.stdout
    

    在这里插入图片描述

    如图所示:无论输出结果是否正确,都会赋值给自定义的变量

  4. set_fact 定义变量

    可以将某个变量的值赋值给另⼀个变量,也可以将字符串赋值给变量

    事实变量是 Ansible 自动发现并设置的关于受控主机的系统信息属性的变量

    每个主机都有自己独有的一套事实变量,是Ansible预定义的,有固定的命名格式(通常以 ansible_ 为前缀),你不能随意改变这些变量的名字

    [student@master ansible] ansible node1 -m setup > z
    

    使用 ansible 主机名 -m setup 可以查看主机的所有事实变量

    为了方便查找,一般会重定向到自定义的文件中

    常用变量名 对应的含义
    ansible_default_ipv4.address ipv4地址
    ansible_enp1s0.ipv4.address ansible_网卡名称.ipv4.address
    ansible_fqdn 完全合格域名(FQDN)
    ansible_hostname 主机名称
    ansible_memtotal_mb 内存大小
    ansible_bios_version bios版本
    ansible_devices.vda.size vda硬盘大小
    ansible_devices.vdb.size vdb硬盘大小
    ansible_lvm.vgs 逻辑卷中卷组
    [student@master ansible] vim d.yml
    # 编辑内容如下
    ---
    - name: test4
      hosts: node1
      tasks:
        - name: test41
          debug:
            msg: the ipv4 address of {{ ansible_hostname }} is {{ ansible_default_ipv4.address }}
    

    在这里插入图片描述

  5. 通过命令传入变量

    [student@master ansible] vim e.yml
    # 编辑内容如下
    ---
    - name: test5
      hosts: node1
      tasks:
        - name: test51
          debug:
            msg: this is {{ aa }}
    
        - name: test52
          debug:
            var: bb
    

    在这里插入图片描述

  6. 主机清单中的变量

    在主机清单中定义变量

    [student@master ansible] vim inventory
    # 编辑内容如下
    node5
    
    [testa]
    node1
    node2
    
    [testa:vars]
    var1='ni'
    var2='hao'
    
    [testb]
    node3
    node4
    
    [student@master ansible] vim f.yml
    # 编辑内容如下
    ---
    - name: test6
      hosts: node1
      tasks:
        - name: test61
          debug:
            msg: "{{ var1 }}"
    
        - name: test62
          debug:
            msg: var2
    

    在这里插入图片描述

    除了可以在主机清单里定义变量外,还可以在 /etc/ansible(root用户)或 /home/用户名/ansible(普通用户) 目录下创建group_vars和host_vars目录下定义变量

    node1文件名以主机命名,还可以命名为node1.yml

    [student@master ansible] mkdir host_vars
    [student@master host_vars] vim node1
    [student@master host_vars] vim node1.yml
    
    # 在 node1 中编辑内容如下
    var1: t1
    var2: t2
    
    # 在 node1.yml 中编辑内容如下
    var1: t3
    var2: t4
    

    编辑 playbook ,看输出变量的值

    [student@master ansible] vim g.yml
    # 编辑内容如下
    ---
    - name: test7
      hosts: node1
      tasks:
        - name: test71
          debug:
            msg: "{{ var1 }}"
    
        - name: test72
          debug:
            var: var2
    
    

    在这里插入图片描述

    发现输出结果为 node1 中定义的值

    如果node1与node1.yml同时存在,则 node1的优先级更高

    除了在 host_vars 目录下,在 group_vars 目录下也同理

    如果 host_vars 目录和 group_vars 目录同时存在,则 host_vars 的优先级更高

  7. 内置变量

    是 Ansible 自动预定义和设置的变量。你无需使用 set_factvars 来声明它们

    为你提供关于当前运行环境、Inventory(清单)、Playbook 本身以及连接信息等重要上下文

    常用变量名 对应作用
    ansible_version 显示ansible的版本
    inventory_hostname 显示主机清单主机名称
    play_hosts 显示当前playbook实际要操作的所有主机的列表
    groups 显示主机清单中的组与主机的对应关系
    groups.all 显示所有清单主机
    group_names 显示主机的主机组的名称
    inventory_dir 显示主机清单所在的目录
  8. With_itens 叠加变量

    可以给一个变量赋予多个值

    让一个任务对列表中的每个项目执行一次

    [student@master ansible] vim h.yml
    # 编辑内容如下
    ---
    - name: test8
      hosts: node1
      tasks:
        - name: test81
          shell:
            cmd: echo "{{ item }}"
          with_items:
            - user1
            - user2
            - user3
          register: xx
    
        - name: test82
          debug:
            var: xx.results[0].stdout
    
        - name: test83
          debug:
            var: xx.results[1].stdout
    
        - name: test84
          debug:
            var: xx.results[2].stdout
    

    在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到