day44-Ansible变量

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

1.每日复盘与今日内容

1.1复盘

  • 使用playbook重构backup🍟🍟🍟🍟🍟
  • 使用playbook重构nfs服务🍟🍟🍟🍟🍟
  • 使用playbook重构nginx服务🍟🍟🍟🍟🍟
  • 使用playbook重构PHP服务🍟🍟🍟🍟🍟
  • 使用playbook重构wordpress业务🍟🍟🍟🍟🍟

1.2今日内容

  • 在play中定义变量
  • 在当前目录group_vars host_vars 定义变量🍟🍟🍟🍟🍟
  • 变量注册register🍟🍟🍟🍟🍟
  • 使用Facts内置变量 ansible_hostname 获取客户端主机名称等...🍟🍟🍟🍟🍟

2.变量

  • 概述

变量提供了便捷的方式来管理Ansible playbook的每一个项目中的动态值,比如nginx-1.6.3这个软件包的版本,在其它地方或许会反复使用,那么如果讲此值设置为变量,然后再在其他的playbook中调用,会方便许多。如此一来还方便维护,减少维护的成本。

  • 定义变量

1️⃣直接在play定义变量

案例1:直接在play定义变量

[root@m01 ansible]# cat a.yml
- hosts: webs
  vars:
    - file1: /opt/a.txt
  tasks:
    - name: touch webs a.txt
      file:
        path: "{{ file1 }}"
        owner: root
        group: root
        mode: 0644
        state: touch 
#检查
ansible-playbook  --syntax-check a.yml
#运行
ansible-playbook  a.yml

案例2.定义多个变量、使用列表的方式

[root@m01 ansible]# cat a.yml 
- hosts: webs
  vars:
    - file1: /opt/a.txt
    - file2: /opt/b.txt
  tasks:
    - name: touch webs a.txt
      file:
        path: "{{ file1 }}"
        owner: root
        group: root
        mode: 0644
        state: touch   

    - name: touch b.txt
      file:
        path: "{{ file2 }}"
        state: touch

案例3.注意如果path参数中携带路径,则变量不需要加双引号

[root@m01 ansible]# cat a.yml
- hosts: webs
  vars:
    - file1: aa.txt
    - file2: /opt/b.txt
  tasks:
    - name: touch webs a.txt
      file:
        path: /opt/{{ file1 }}		# 不需要加双引号
        owner: root
        group: root
        mode: 0644
        state: touch   
[root@m01 ansible]# ansible-playbook  a.yml 

案例4.一次安装多个软件

[root@m01 ansible]# cat a.yml 
- hosts: webs
  vars:
    - pk1: wget
    - pk2: lrzsz 
  tasks:
    - name: Install package
      yum:
        name: 
          - "{{ pk1 }}"
          - "{{ pk2 }}"
        state: absent

案例5.一次安装多个软件、一个变量赋多个值

[root@m01 ansible]# cat a.yml
- hosts: webs
  vars:
    pk:
      - lrzsz 
      - wget 
  tasks:
    - name: Install package
      yum:
        name: "{{ pk }}"
        state: present

2️⃣在文件中定义变量

案例1.

#1.先在文件中定义变量
[root@m01 ansible]# cat vars1.yml
pk1: wget
pk2: tree


#2.在play中调用变量文件
[root@m01 ansible]# cat a.yml
- hosts: webs
  vars_files:
    - vars1.yml
  tasks:
    - name: Install package
      yum:
        name: "{{ pk1 }}"
        state: absent
[root@m01 ansible]# ansible-playbook  --syntax-check a.yml

playbook: a.yml
[root@m01 ansible]# ansible-playbook  a.yml

案例2.调用多个变量文件

[root@m01 ansible]# cat vars2.yml
pk3: lrzsz

[root@m01 ansible]# cat a.yml
- hosts: webs
  vars_files:
    - vars1.yml
    - vars2.yml
  tasks:
    - name: Install package
      yum:
        name: 
          - "{{ pk1 }}"
          - "{{ pk3 }}"
        state: absent
[root@m01 ansible]# ansible-playbook  a.yml

3️⃣在主机清单定义变量

#第一步: 主机清单中定义
[root@m01 ansible]# cat /etc/ansible/hosts
nfs ansible_ssh_host=10.0.0.31

[webs]
10.0.0.7
10.0.0.8

[dbs]
10.0.0.51


[backup]
10.0.0.41


[webs:vars]			# 给webs组定义两个变量
pk1=wget
pk2=tree


#第二步: 调用变量
[root@m01 ansible]# cat a.yml
- hosts: webs
  tasks:
    - name: Install package
      yum:
        name: 
          - "{{ pk1 }}"
          - "{{ pk2 }}"
        state: present
[root@m01 ansible]# ansible-playbook  a.yml

4️⃣官方推荐定义变量

#第一步: 在当前运行playbook的目录下创建两个目录
group_vars   # 在目录下面组名称命名的文件、然后在文件中直接定义变量
hosts_vars   # 在目录下面主机命名的文件,然后在文件中直接定义变量
[root@m01 ansible]# mkdir group_vars host_vars

#第二步: 在group_vars下创建webs文件、all表示所有
[root@m01 ansible]# cat group_vars/webs 
pk1: wget
pk2: tree

#注意all表示所有
[root@m01 ansible]# cat group_vars/all 
pk1: wget
pk2: tree



#第三步: 在playbook中调用变量
[root@m01 ansible]# cat a.yml
- hosts: webs
  tasks:
    - name: Install package
      yum:
        name: 
          - "{{ pk1 }}"
          - "{{ pk2 }}"
        state: absent



#对单台主机定义变量
[root@m01 ansible]# ll group_vars/
total 0
[root@m01 ansible]# cat host_vars/nfs 
pk1: wget
pk2: tree

#只有nfs引用变量
[root@m01 ansible]# cat a.yml 
- hosts: nfs
  tasks:
    - name: Install package
      yum:
        name: 
          - "{{ pk1 }}"
          - "{{ pk2 }}"
        state: present



#在命令行临时定义变量
[root@m01 ansible]# ansible-playbook a.yml -e "pk1=wget"

3.变量注册

当absible的模块在运行之后,其实都会返回一些result结果,就像是执行脚本,我们有的时候需要脚本给我们一些return返回值,我们才知道,上一步是否可以执行成功,但是…默认情况下,ansible的result并不会显示出来,所以,我们可以把这些返回值’存储’到变量中,这样我们就能通过’调用’对应的变量名,从而获取到这些result,这种将模块的返回值,写入到变量中的方法被称为变量注册

简单来说,就是将执行过程可视化。

#第一步: 测试使用ls -l命令输出客户端/root下所有文件的详细信息
[root@m01 ansible]# cat a.yml
- hosts: 10.0.0.7
  tasks:
    - name: list /root/ file 
      command: ls -l

  • 很多时候playbook都是看不到我们想要的结果

如: ll列出文件、查看状态、查看信息等

#第二步:将执行的结果赋值给一个变量(变量的名称自定义)

vim a.yml
- hosts: 10.0.0.7
  tasks:
    - name: list /root/ file
      command: ls -l
      register: list_file

    - name: print list_file env
      debug:
        msg: "{{ list_file.stdout_lines }}"

  • 层级定义变量
#第一步: 层级定义变量
[root@m01 ansible]# cat vars1.yml
lnmp:
  nginx:
    pk1: wget

#第二步: 引用文件、调用变量
[root@m01 ansible]# cat a.yml 
- hosts: 10.0.0.7
  vars_files: vars1.yml

  tasks:
    - name:  Install package
      yum:
        name: "{{ lnmp.nginx.pk1 }}"
        state: absent

官方推荐调用层级变量的写法
[root@m01 ansible]# cat a.yml
- hosts: 10.0.0.7
  vars_files: vars1.yml

  tasks:
    - name:  Install package
      yum:
        name: "{{ lnmp['nginx']['pk1'] }}"
        state: present

[root@m01 ansible]# ansible-playbook  a.yml 

#案例2定义多个层级列表的方式
[root@m01 ansible]# cat vars1.yml 
lnmp:
  nginx:
    pk1: wget
    pk2: tree

调用:
[root@m01 ansible]# cat a.yml 
- hosts: 10.0.0.7
  vars_files: vars1.yml

  tasks:
    - name: Install package
      yum:
        name:
          - "{{ lnmp['nginx']['pk1'] }}"
          - "{{ lnmp['nginx']['pk2'] }}"
        state: absent




在 Ansible 中,{{ lnmp.nginx.pk1 }} 和 {{ lnmp['nginx']['pk1'] }} 这两种变量调用方式的主要区别如下:

1. 语法风格差异
点号表示法 (lnmp.nginx.pk1):更简洁,类似 Python 的对象属性访问
方括号表示法 (lnmp['nginx']['pk1']):更明确,类似字典键值访问

2. 键名限制
点号表示法:键名必须是有效的标识符(不能包含特殊字符、空格、连字符等)
方括号表示法:可以处理任何字符串键名,包括:
包含特殊字符的键名:lnmp['web-server']['php-version']
以数字开头的键名:lnmp['2nd-level']['key']
包含空格的键名:lnmp['my key']['sub key']

Facts缓存

  • 定义:

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

#Facts可以获取到客户端的信息赋值给相对的变量
ansible_processor_vcpus: cpu核
ansible_all_ipv4_addresses:仅显示ipv4的信息。
ansible_devices:仅显示磁盘设备信息。
ansible_distribution:显示是什么系统,例:centos,suse等。
ansible_distribution_major_version:显示是系统主版本。
ansible_distribution_version:仅显示系统版本。
ansible_machine:显示系统类型,例:32位,还是64位。
ansible_eth0:仅显示eth0的信息。
ansible_hostname:仅显示主机名。
ansible_kernel:仅显示内核版本。
ansible_lvm:显示lvm相关信息。
ansible_memtotal_mb:显示系统总内存。
ansible_memfree_mb:显示可用系统内存。
ansible_memory_mb:详细显示内存情况。
ansible_swaptotal_mb:显示总的swap内存。
ansible_swapfree_mb:显示swap内存的可用内存。
ansible_mounts:显示系统磁盘挂载情况。
ansible_processor:显示cpu个数(具体显示每个cpu的型号)。
ansible_processor_vcpus:显示cpu个数(只显示总的个数)。

获取主机的信息

ansible 10.0.0.7 -m setup
  • 案例1.输出两台web的操作系统版本
[root@m01 ansible]# cat os.yml
- hosts: webs
  tasks:
    - name: print os env
      debug:
        msg: "{{ ansible_distribution }}"
  • 案例2.输出两台web的IP地址
[root@m01 ansible]# cat os.yml 
- hosts: webs
  tasks:
    - name: print os env
      debug:
        msg: "{{ ansible_default_ipv4.address }}"	
  • 案例3.需求创建出以主机名命名+IP地址的目录
[root@m01 ansible]# cat a.yml 
- hosts: webs
  tasks:
    - name:  create hostname ip dir
      file:
        path: /root/{{ ansible_hostname }}_{{ ansible_default_ipv4.address }}
        state: directory

4.今日总结

  • 在play中定义变量
  • 在当前目录group_vars host_vars 定义变量🍟🍟🍟🍟🍟
  • 变量注册register🍟🍟🍟🍟🍟
  • 使用Facts内置变量 ansible_hostname 获取客户端主机名称等...🍟🍟🍟🍟🍟


网站公告

今日签到

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