【2023】ansible-variables变量详解

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 【2023】ansible-variables变量详解

变量通过便捷的方式来管理ansible项目中的动态值。

比如:version=ngix-1.16在使用中只需要调用version这个变量名即可,方便管理及后期升级修改等操作。

🍔变量定义的方式:

通过命令行传递变量参数定义

在playbook中定义变量

  • 通过vars定义变量
cat test.yaml
---
- hosts: node
  vars:
  - web_packages: nginx
  tasks:
    - name: Installed web
      yum: "{{ web_packages }}"
  • 通过var_files定义变量,创建一个yml文件专门创建变量,属于公用变量
cat test.yaml
---
- hosts: node
  vars_file:
  - ./var.yml
  tasks:
    - name: Installed web
      yum: "{{ web_packages }}"

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

  • 通过host_vars对主机进行定义
  • 通过group_vars对主机组进行定义
cat /etc/ansible/hosts
# 主机变量
[web]
192.168.10.2 myid=1 state=master
192.168.10.3 myid=2 state=backup
# 组变量
[web:vars]
port=80
  • 为主机单独创建变量
mkdir host_vars
vim host_vars/192.168.10.2
state: master
  • 为主机组创建变量,方式类似,文件名要与主机组名一致
mkdir host_vars
vim host_vars/web
  • 外置传递变量,可以在执行playbook时定义变量
ansible-playbook test.yml -e "route_id=8888"

ansible变量优先级:

外置传参——>playbook(vars_file——>vars)——>主机变量——>group_vars——>inventory_group

🍔Register Variables

Ansible的register变量是一种变量类型,用于在运行任务时存储命令、模块或脚本的输出。它们通常用于条件语句或后续任务中,以根据输出结果采取特定的操作。


注册变量可在任务执行完成后访问,以检查命令、模块或脚本执行的输出或结果。您可以使用register变量来存储远程主机上测试的结果,或者正则表达式的匹配结果,甚至是命令的输出。

Register可以将task执行的任务结果存储至某个变量中,便于后续引用

---
- hosts: all
  tasks:
    - name: Get network port
      shell: netstat -lntp
      register: System_port
    - name: Debug
      debug: 
        msg: "{{ System_port }}"

这段代码的含义是将netstat -lntp的执行结果注入到System_port变量中。

ok: [192.168.10.2] => {
    "msg": {
        "changed": true, 
        "cmd": "netstat -lntp", 
        "delta": "0:00:00.033419", 
        "end": "2023-03-12 08:44:38.655001", 
        "failed": false, 
        "rc": 0, 
        "start": "2023-03-12 08:44:38.621582", 
        "stderr": "", 
        "stderr_lines": [], 
        "stdout": "Active Internet connections (only servers)\nProto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    \ntcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1055/sshd           \ntcp        0      0 127.0.0.1:40663         0.0.0.0:*               LISTEN      11868/containerd    \ntcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1166/master         \ntcp6       0      0 :::9100                 :::*                    LISTEN      1053/node_exporter  \ntcp6       0      0 :::22                   :::*                    LISTEN      1055/sshd           \ntcp6       0      0 :::3000                 :::*                    LISTEN      1054/grafana-server \ntcp6       0      0 ::1:25                  :::*                    LISTEN      1166/master         \ntcp6       0      0 :::9090                 :::*                    LISTEN      1058/prometheus     ", 
        "stdout_lines": [
            "Active Internet connections (only servers)", 
            "Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    ", 
            "tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1055/sshd           ", 
            "tcp        0      0 127.0.0.1:40663         0.0.0.0:*               LISTEN      11868/containerd    ", 
            "tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1166/master         ", 
            "tcp6       0      0 :::9100                 :::*                    LISTEN      1053/node_exporter  ", 
            "tcp6       0      0 :::22                   :::*                    LISTEN      1055/sshd           ", 
            "tcp6       0      0 :::3000                 :::*                    LISTEN      1054/grafana-server ", 
            "tcp6       0      0 ::1:25                  :::*                    LISTEN      1166/master         ", 
            "tcp6       0      0 :::9090                 :::*                    LISTEN      1058/prometheus     "
        ]
    }
}

如果要选用其中的某个参数,只需要在变量名后加入即可:

- name: Debug
      debug: 
        msg: "{{ System_port.stdout_lines }}"

示例:批量修改主机名

将192.168.10.2-3两台主机名修改为指定格式:

---
- hosts: all
  tasks:
    - name: String
      shell: echo $RANDOM | md5sum | cut -c 2-10
      register: system_sj
    - name: Chanage hostname
      hostname:
        name: "centos_7.9_{{ system_sj.stdout }}"

执行结果分别在两台主机查看:

# 192.168.10.2
centos_7.9_1348277e0
# 192.168.10.3
centos_7.9_e08760762

🍔Facts Variables

Ansible中的facts是由Ansible在目标机器上运行的“setup”模块生成的系统和环境信息。这些信息存储在变量中,可以通过Ansible playbook和模板使用。

Facts变量包括:

  • 系统信息:操作系统、主机名、内核参数、网络接口、CPU信息等。
  • 硬件信息:服务器制造商、BIOS版本、物理内存、磁盘容量等。
  • 网络信息:IP地址、MAC地址、路由列表等。
  • 环境变量:PATH、PYTHONPATH等环境变量。

在使用场景中:

  • 检查CPU信息,生成不同的nginx配置文件
  • 检查内存信息。生成不同的memcached配置文件
  • 检查主机名信息,生成不同的zabbix配置文件
  • 检查IP信息,生成不同的redis配置文件

可以使用下面这条命令查看可用信息:

ansible all -m setup

示例:基于IP生成redis配置文件

---
- hosts: all
  tasks:
    - name: Installed redis
      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
      service:
        name: redis
        state: restarted

配置文件模板:redis.conf.j2

bind 127.0.0.1 {{ ansible_ens33.ipv4.address }}

分别在两台主机上查看是否成功:

[root@centos_7 ~]# netstat -utpln | grep 6379
tcp        0      0 192.168.10.2:6379       0.0.0.0:*               LISTEN      30584/redis-server  
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      30584/redis-server  
[root@centos_7 ~]#  netstat -utpln | grep 6379
tcp        0      0 192.168.10.3:6379       0.0.0.0:*               LISTEN      32967/redis-server  
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      32967/redis-server  

facts优化:

  • 使用gather_facts: no关闭facts
- hosts: all
  gather_facts: no
  • 使用redis进行缓存vim ansible.cfg
gathering = smart
fact_caching_timeout = 86400
fact_caching = redis
fact_caching_connection = 192.168.10.3:6379
# 如果redis有密码
fact_caching_connection = 192.168.10.3:6379:0:passwd


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
3月前
|
JSON 数据格式 索引
Ansible fact变量与魔法变量
Ansible fact变量与魔法变量
54 6
|
3月前
|
存储 网络安全 数据安全/隐私保护
Ansible的变量
Ansible的变量
34 6
|
缓存 运维 监控
【运维知识进阶篇】Ansible变量详解(变量定义+变量优先级+变量注册+层级定义变量+facts缓存变量)
【运维知识进阶篇】Ansible变量详解(变量定义+变量优先级+变量注册+层级定义变量+facts缓存变量)
304 0
|
存储 JSON 数据安全/隐私保护
ansible定义变量和管理事实
ansible定义变量和管理事实
146 0
Ansible 自定义变量与 role 默认变量的合并方法
如果你遇到 failed to combine variables, expected dicts but got a 'NoneType' and a 'dict' 这样的报错,你可以看看本文。
300 0
|
存储 JSON 缓存
ansible学习之旅(facts变量)
ansible学习之旅(facts变量)
165 0
ansible学习之旅(初识变量)
ansible学习之旅(初识变量)
80 0
|
关系型数据库 MySQL 应用服务中间件
|
Shell 网络安全 数据安全/隐私保护
ansible主机清单配置以及变量解释(二)
1.配置ansible主机清单 清单文件位于/etc/ansible/hosts
552 0
ansible主机清单配置以及变量解释(二)
Ansible-playbook 应用变量(学习笔记二十)
文件 [root@ansible-server ansible]# tree ./ ./ ├── hosts └── var.yaml hosts 文件 [web] 192.
1116 0