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

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


目录

  • 🍔变量定义的方式:
  • 🍔Register Variables
  • 示例:批量修改主机名
  • 🍔Facts Variables
  • 示例:基于IP生成redis配置文件
  • facts优化:


🍔变量定义的方式:

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

在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