55 ansible 变量

本文详细介绍了Ansible中的变量定义与使用方法,包括命令行、playbook、inventory等多种方式,并通过NFS搭建、变量注册、facts变量等实战案例,展示了如何根据不同主机状态生成定制化配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

变量概述

1.变量

变量:以一个固定的字符串去表示一个不固定的值。 x = 12
shell中变量:
定义: Host=oldxu.com
使用:${Host}

Ansible中变量:
定义: Host=oldxu.com
使用:{{ Host }}

2.Ansible中定义变量分为如下三种方式

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

变量的优先级( 变量读取的顺序 )


1. 通过命令行进行变量定义

[root@manager ansible_variables]# cat var6.yml

- hosts: webservers
  tasks:
    - name: Install Rpm Packages "{{ test_packages }}"
      yum:
        name:
          - "{{ test_packages }}"
        state: present

[root@manager ansible_variables]# ansible-playbook var6.yml -e "test_packages=sl"


2.通过在play文件中进行定义变量


  • [root@manager ansible_variables]# cat var1.yml
- hosts: webservers
  vars: #定义变量关键字
    - web_packages: httpd
    - ftp_packages: vsftpd

  tasks:
    - name: Installed Rpm Packages "{{ web_packages }}" "{{ ftp_packages }}"
      yum:
        name:
          - "{{ web_packages }}"
          - "{{ ftp_packages }}"
        state: present

注意:vars关键字定义的变量,无法与其他的playbook进行共享。

  • 二 (vars_files来进行定义变量)
[root@manager ansible_variables]# cat test.yml
web_packages: httpd-tools
ftp_packages: vsftpd

[root@manager ansible_variables]# cat var1.yml

- hosts: webservers
  vars_files: test.yml

  tasks:
    - name: Installed Rpm Packages "{{ web_packages }}" "{{ ftp_packages }}"
      yum:
        name:
          - "{{ web_packages }}"
          - "{{ ftp_packages }}"
        state: present

[root@manager ansible_variables]# cat var2.yml

- hosts: webservers
  vars_files: test.yml

  tasks:
    - name: Installed Rpm Packages "{{ web_packages }}" "{{ ftp_packages }}"
      yum:
        name:
          - "{{ web_packages }}"
          - "{{ ftp_packages }}"
        state: present

3. 通过inventory在主机组或单个主机中设置变量

[root@manager ansible_variables]# mkdir host_vars
[root@manager ansible_variables]# mkdir group_vars
[root@manager ansible_variables]# cat group_vars/webservers
web_packages: wget
ftp_packages: tree

[root@manager ansible_variables]#cat var4.yml

- hosts: webservers
  tasks:
    - name: Install Rpm Packages "{{ web_packages }}" "{{ ftp_packages }}"
      yum:
        name:
          - "{{ web_packages }}"
          - "{{ ftp_packages }}"
        state: present

[root@manager ansible_variables]# cat group_vars/all

web_packages: nfs-utils
ftp_packages: rsync

[root@manager ansible_variables]# cat var5.yml

- hosts: db
  tasks:
    - name: Install Rpm Packages "{{ web_packages }}" "{{ ftp_packages }}"
      yum:
        name:
          - "{{ web_packages }}"
          - "{{ ftp_packages }}"
        state: present

变量的查找顺序:

设定同一个变量,不同的值,去测试,看谁优先被使用。

filename=
  1)在plabook中定义vars变量
  2)在playbook中定义vars_files变量
  3)在host_vars中定义变量
  4)在group_vars中定义变量
  5)通过执行命令传递变量

变量的查找优先级:--------------->>>

1.外置传参 -e
2.playbook
vars_files
vars
3.host_vars
4.group_vars/组名
4.group_vars/all


4.NFS ansible搭建

[root@manager ansible_variables]#cat group_vars/all

share_dir: /data3

[root@manager ansible_variables]# cat var8.yml

- hosts: webservers
  tasks:

    - name: Installed NFS Server
      yum:
        name: nfs-utils

    - name: Configure NFS Server  #配置文件中使用 了share_dir #共享的目录/data3
      template:      
       #copy:模块 变量描述也拷贝 //  template:模块 支持拷贝变量的配置文件
        src: ./exports.j2
        dest: /etc/exports
      notify: Restart NFS Server

    - name: Create Share Directory	     #创建共享的目录使用share_dir  /data3
      file:
        path: "{{ share_dir }}"
        state: directory
        owner: www
        group: www
        mode: 755

    - name: Started NFS Server
      systemd:
        name: nfs
        state: started
        enabled: yes

  handlers:
    - name: Restart NFS Server
      systemd:
        name: nfs
        state: restarted

- hosts: db
  tasks:
    - name: Client Mount NFS Server
      mount:
        src: 172.16.1.7:{{ share_dir }}
        path: /ansible_mount
        fstype: nfs
        state: mounted

5.register变量注册

将执行的结果存储至变量中,后期可以通过结果进行判断的操作。

[root@manager ansible_variables]# cat var9.yml

- hosts: webservers
  tasks:
    - name: Get Network Status
      shell: netstat -lntp
      register: System_Net
      #将shell命令的执行输出结果,存储至System_Net变量中

    - name: Print Variables
      debug:
        msg: "{{ System_Net.stdout_lines }}"

{{ System_Net }} 能看到变量的所有信息

{{ System_Net.stderr }} #能捕获到错误,如果没有就是空,如果有错误就会限制在终端窗口


6.facts变量(机器实现定义的)

(非常强大,可以根据不同的主机生成不同配置文件。是灵魂)

ansible location -m setup 采集主机信息
ansible locathost -m setup > dco.txt 方便查看

实战一、根据IP地址生成不同的Redis配置

web01  bind 172.16.1.7
web02  bind 172.16.1.8 

[root@manager ansible_variables]# cat redis.yml

- hosts: webservers
  tasks:

    - name: Installed Redis Server
      yum:
        name: redis
        state: present

    - name: Configure Redis Server
      template:
        src: ./redis.conf.j2
        dest: /etc/redis.conf
      notify: Restart Redis Server

    - name: Started Redis Server
      systemd:
        name: redis
        state: started
        enabled: yes

  handlers:
    - name: Restart Redis Server
      systemd:
        name: redis
        state: restarted

[root@manager ansible_variables]# cat redis.conf.j2

bind 127.0.0.1 {{ ansible_eth1.ipv4.address }}

实战二、根据CPU核心生成不同的Nginx配置

web01 1核心 1GB	  2
web02 2核心 2GB    4

cpu核心那个变量

[root@manager ansible_variables]# cat nginx.yml

- hosts: webservers
  tasks:
    - name: Configure  Nginx.conf
      template:
        src: ./nginx.conf.j2
        dest: /tmp/nginx.conf

[root@manager ansible_variables]# cat nginx.conf.j2
worker {{ ansible_processor_vcpus * 2 }};

实战三、根据主机内存生成不同的Memcached配置 ( 使用物理内存的一半 )

web01 1G	512
web02 2G	1024
web03 4G	2048

1.找到物理内存的变量
2.将变量除以2

[root@manager ansible_variables]# yum install memcached -y
[root@manager ansible_variables]# cp /etc/sysconfig/memcached ./memcached.j2
[root@manager ansible_variables]# cat memcached.j2

PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="{{ ansible_memtotal_mb //2 }}"
OPTIONS=""

[root@manager ansible_variables]# cat memcached.yml

- hosts: webservers
  tasks:
    - name: Installed Memcached Server
      yum:
        name: memcached
        state: present

    - name: Configure Memcached Server
      template:
        src: memcached.j2
        dest: /etc/sysconfig/memcached
      notify: Restart Memcached Server

    - name: Started Memcached Server
      systemd:
        name: memcached
        state: started
        enabled: yes

  handlers:
    - name: Restart Memcached Server
      systemd:
        name: memcached
        state: restarted

实战四、根据主机名称生成不同的zabbix配置

zabbix: https://mirror.tuna.tsinghua.edu.cn/zabbix/zabbix/4.0/rhel/7/x86_64/zabbix-agent-4.0.0-2.el7.x86_64.rpm

[root@manager ansible_variables]#cat zabbix_agent.yml

- hosts: all
  tasks:
    - name: Installed ZabbixAgent
      yum:
        name: https://mirror.tuna.tsinghua.edu.cn/zabbix/zabbix/4.0/rhel/7/x86_64/zabbix-agent-4.0.0-2.el7.x86_64.rpm
        state: present

    - name: Configure ZabbixAgent
      template:
        src: ./zabbix_agentd.conf.j2
        dest: /etc/zabbix/zabbix_agentd.conf
      notify: Restart ZabbixAgent

    - name: Started ZabbixAgent
      systemd:
        name: zabbix-agent
        state: started
        enabled: yes

  handlers:
    - name: Restart ZabbixAgent
      systemd:
        name: zabbix-agent
        state: restarted

[root@manager ansible_variables]# grep "^Hostname" zabbix_agentd.conf.j2
Hostname={{ ansible_hostname }}

7.facts优化:

facts变量开启会影响playbook运行的效率? 但是关闭又会造成无法提取被控端的状态。 最佳的方案使用缓存来解决。 ( redis )

没有使用缓存时的时间: 4台机器同时操作: 20台

real 0m28.738s
user 0m12.064s
sys 0m3.725s

增加redis缓存:

real 0m6.345s
user 0m3.021s
sys 0m1.039s

1.安装一个redis   172.16.1.51 安装过了,就不要需要安装,直接使用就行了。
2.配置ansible配置文件,让其支持redis缓存:	

[root@manager ansible_variables]# cat ansible.cfg
[defaults]
inventory = ./hosts

gathering = smart
fact_caching_timeout = 86400
fact_caching = redis
fact_caching_connection = 172.16.1.7:6379

yum install python-pip
pip install redis
<think>嗯,用户想了解Ansible变量使用方法以及相关示例。好的,我需要先回忆一下Ansible变量的几种定义方式。根据提供的引用,比如引用2提到了在host_vars和group_vars目录中定义变量,还有命令行中使用-e参数覆盖变量。还有引用5提到变量用于提高任务维护效率,所以需要说明变量如何简化配置。 首先,用户可能需要知道变量的不同定义位置,比如Inventory文件、YAML文件、命令行等。然后,不同优先级的变量如何覆盖,比如命令行变量优先级最高。需要分步骤说明,确保结构清晰。 然后,引用2提到不建议直接在Hosts文件中定义变量,而是推荐使用host_vars和group_vars,这部分需要详细解释,并给出示例目录结构和文件内容。可能用户会遇到多主机变量管理的问题,这样分开管理更方便。 另外,引用1中的示例用-e选项覆盖用户变量,可能需要说明如何在命令行传递变量,以及应用场景,比如临时测试某个变量值。 还有,引用3关于ansible_local过滤本地facts,可能需要提到如何在playbook中使用远程主机的本地变量,或者如何收集facts。 引用4提到了ansible-vault查看加密文件,这部分可能和变量安全相关,比如如何保护敏感变量,比如密码,但用户的问题可能更关注变量定义而不是加密,不过可以提一下使用vault加密变量的方法。 需要生成相关问题,比如变量优先级、最佳实践、加密变量等,根据引用内容来设计问题。 现在,组织回答的结构:先介绍变量作用,再分点说明各种定义方法,每种方法给出示例,然后覆盖优先级,最后相关问题。确保每个部分都有对应的引用标注,比如在host_vars部分引用2,命令行引用1,vault引用4,变量作用引用5等。 还要注意使用中文,LaTeX的正确格式,行内变量用$,比如变量名可能不需要,但如果有数学表达式的话需要注意。不过Ansible变量一般不会有数学表达式,可能不需要用LaTeX,但根据系统指令,所有行内数学表达式需要用$...$,所以如果有的话需要注意,比如在示例中如果有变量名可能不需要,但需要检查是否有数学内容。 最后,确保回答真实可靠,引用提供的资料中的信息,正确标注来源。例如,host_vars的示例来自引用2,命令行覆盖变量来自引用1,ansible-vault来自引用4。 可能还需要提到变量的作用域,比如主机变量、组变量、全局变量等,以及如何在playbook中引用变量,比如{{ foo }}的语法。 总结一下,回答的结构应该是: 1. 变量定义方法: - Inventory内定义(不推荐,引用2) - host_vars/group_vars(推荐,引用2) - playbook中vars - 命令行-e参数(引用1) - Facts变量(引用3) 2. 变量优先级顺序 3. 示例代码块,比如host_vars的文件内容,playbook中使用变量 4. 加密变量(引用4) 5. 相关问题生成,基于各个引用内容和变量使用中的常见疑问 需要确保每个部分都有对应的引用标注,并且语言口语化,但符合中文语法,不使用Markdown格式,用自然的分段和标号。</think>### Ansible变量使用方法及示例 Ansible变量的核心作用是存储重复使用的值,简化配置管理并提高维护效率[^5]。以下从定义方式、优先级和实际应用三个层面说明其用法。 --- #### 一、变量定义方法 1. **Inventory内定义(不推荐)** 直接在`hosts`文件中定义变量,适用于简单场景,但不利于多主机管理[^2]: ```ini [web_servers] app1.example.com ansible_user=admin http_port=80 ``` 2. **host_vars与group_vars(推荐)** 在`/etc/ansible/`下创建`host_vars`和`group_vars`目录,按主机名或组名定义变量。例如为`app1.example.com`定义变量: ```yaml # /etc/ansible/host_vars/app1.example.com --- db_host: "192.168.1.10" max_connections: 200 ``` 组变量文件同理,文件名需与组名一致。 3. **Playbook中定义** 在Playbook的`vars`部分直接声明变量: ```yaml - hosts: web_servers vars: package_name: nginx tasks: - name: Install {{ package_name }} apt: name: "{{ package_name }}" ``` 4. **命令行覆盖变量** 使用`-e`参数临时覆盖变量,优先级最高[^1]: ```bash ansible-playbook deploy.yml -e "http_port=8080" ``` 5. **Facts变量** 通过`ansible_local`收集远程主机信息[^3]: ```bash ansible localhost -m setup -a "filter=ansible_local" ``` --- #### 二、变量优先级顺序 Ansible变量优先级从高到低为: 1. 命令行`-e`定义的变量 2. Playbook中`vars`定义的变量 3. `host_vars`和`group_vars`中的变量 4. Inventory文件中的变量 --- #### 三、实际应用示例 1. **加密敏感变量** 使用`ansible-vault`加密包含密码的变量文件[^4]: ```bash ansible-vault create secrets.yml ``` 文件内容: ```yaml --- db_password: "s3cr3tP@ss" ``` 2. **动态配置模板** 在Jinja2模板中引用变量: ```jinja2 ServerName {{ server_name }} Listen {{ http_port }} ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值