ansible的变量详解

变量分类

定义变量分为如下三种方式:

  1. 通过命令行进行变量定义
  2. 在playbook文件中进行定义变量
  3. 通过inventory在主机组或单个主机中设置变量

变量生效的优先级

命令行定义的变量---->play文件定义的变量---->inventory文件定义的变量。

定义变量

注意: 如果变量是开头的时候 加上双引号 ""

key: value 形式

cat 05.yml 
- hosts: lb
  vars:
    - soft01: nc
    - soft02: nmap
  tasks:
    - name: Install Software nc nmap
      yum:
        name:
          - "{{ soft01 }}"
          - "{{ soft02 }}"
        state: present

vars_files指定文件

cat vars.yml
soft01: nc
soft02: nmap

cat 06.yml 
- hosts: lb
  vars_files: ./vars.yml
  tasks:
    - name: Install Software nc nmap
      yum:
        name:
          - "{{ soft01 }}"
          - "{{ soft02 }}"
        state: present

在命令行指定变量

ansible-playbook 08.yml -e "file_name=zqf_extra-vars"

变量的层级定义

cat vars_file.yml 
lamp:
  web:
    web_package: httpd
    db_package: mariadb-server
    php_package: php

cat test.yml 
---
- hosts: all
  vars_files:
    - vars_file.yml
  tasks:
    - name: Installed httpd
      yum: name={{ lamp['web']['web_package'] }}
    - name: Install Mariadb
      yum: name={{ lamp.web.db_package }}

变量注册

register关键字可以将某个task任务结果存储至变量中,最后使用debug输出变量内容,可以用于后续排障

register 类似于命令行的 $?, 取出本模块的执行情况

cat 10.yml 
- hosts: lb
  tasks:
    - name: print ip addr
      shell: hostname -I
      register: ip_addr
    - name: echo
      debug:
        msg: "you ip address is {{ ip_addr.stdout }}"

# 比如变量叫做ip_addr
# ip_addr.stdout_lines: 取出ip
# ip_addr.rc: 返回值 return code $?
# ip_addr.stdout: 标准输出, 屏幕上面的输出
# ip_addr.stderr: 标准错误输出,错误信息.


# 另一个案例:
- hosts: system_kylin
  become: yes
  remote_user: root
  tasks:
    - name: 检查 Docker 版本
      shell: docker --version
      register: docker_version  # 变量名应使用下划线而非连字符

    - name: 输出 Docker 版本信息
      debug:
        var: docker_version.stdout  # 直接输出命令的标准输出

facts变量

Ansible facts是在被管理主机上通过ansible自动采集发现的变量。facts包含每台特定的主机信息。比如:被控端主机的主机名、IP地址、系统版本、CPU数量、内存状态、磁盘状态等等。

显示所有 ansible facts:

ansible mysql  -m setup

facts基本用法,比如获取被控端的主机名与IP地址

cat 12.yml 
- hosts: lb
  tasks:
    - name: echo
      debug:
        msg:
        - "所有的ip地址 {{ ansible_all_ipv4_addresses }}"
        - "默认的ip地址 {{ ansible_default_ipv4.address }}"
        - "you interface is {{ansible_default_ipv4.interface }}"
        - "time is {{ ansible_date_time.date }}"
        - "mem total is {{ ansible_memtotal_mb }}"
        - "you system is {{ ansible_distribution }} version is {{ ansible_distribution_version }}"

ansible-playbook -C 12.yml 

PLAY [lb] ********************************************************************************************************************************************************************************

TASK [Gathering Facts] *******************************************************************************************************************************************************************
ok: [10.0.0.43]
ok: [10.0.0.42]

TASK [echo] ******************************************************************************************************************************************************************************
ok: [10.0.0.42] => {
    "msg": [
        "所有的ip地址 [u'10.0.0.197', u'10.0.0.42']", 
        "默认的ip地址 10.0.0.42", 
        "you interface is ens33", 
        "time is 2024-01-29", 
        "mem total is 972", 
        "you system is CentOS version is 7.9"
    ]
}
ok: [10.0.0.43] => {
    "msg": [
        "所有的ip地址 [u'10.0.0.197', u'10.0.0.43']", 
        "默认的ip地址 10.0.0.43", 
        "you interface is ens33", 
        "time is 2024-01-29", 
        "mem total is 972", 
        "you system is CentOS version is 7.9"
    ]
}

PLAY RECAP *******************************************************************************************************************************************************************************
10.0.0.42                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
10.0.0.43                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

关闭facts

facts开启后会影响Ansible主机的性能,如果没有采集被控端主机需求可选择关闭

cat 13.yml
- hosts: web
  gather_facts: no # 关闭信息采集
  tasks:
    - name: install nginx
      yum: name=nginx state=present

查找facts变量

# 通过filter进行过滤 显示我们索要的facts
ansible   lb   -m setup -a 'filter="*ens33*"'

几个常用的facts变量

ansible_default_ipv4.address    # 默认的网卡ip eth0
ansible_distribution            # 系统发行版本名字 CentOS  Ubuntu Debian ...
ansible_memtotal_mb             # 内存大小
ansible_processor_vcpus         # 表示主机的虚拟CPU(vCPU)数量
ansible_processor_cores         # 表示主机的实际物理核心数。
ansible_date_time.date          # 表示主机当前的日期
ansible_hostname                # 主机名
ansible_host                    # ip

案例

使用facts根据不同的内存生成不同Memcached配置文件

# memcached配置文件如下
cat memcached.j2
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="{{ ansible_memtotal_mb //2 }}" #根据内存状态生成不同的配置(支持+-*/运算)
OPTIONS=""

#playbook如下
cat 11.yml
- hosts: webservers
  tasks:
    - name: Installed Memcached
      yum: name=memcached state=present
    - name: Configure Memcached
      template: src=./memcached.j2  dest=/etc/sysconfig/memcached
    - name: Start Memcached
      service: name=memcached state=started enabled=yes
posted @ 2025-08-23 18:27  阿峰博客站  阅读(19)  评论(0)    收藏  举报