当前位置: 首页 > news >正文

day44-Ansible变量

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: websvars:- file1: /opt/a.txttasks:- name: touch webs a.txtfile:path: "{{ file1 }}"owner: rootgroup: rootmode: 0644state: touch 
#检查
ansible-playbook  --syntax-check a.yml
#运行
ansible-playbook  a.yml

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

[root@m01 ansible]# cat a.yml 
- hosts: websvars:- file1: /opt/a.txt- file2: /opt/b.txttasks:- name: touch webs a.txtfile:path: "{{ file1 }}"owner: rootgroup: rootmode: 0644state: touch   - name: touch b.txtfile:path: "{{ file2 }}"state: touch

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

[root@m01 ansible]# cat a.yml
- hosts: websvars:- file1: aa.txt- file2: /opt/b.txttasks:- name: touch webs a.txtfile:path: /opt/{{ file1 }}		# 不需要加双引号owner: rootgroup: rootmode: 0644state: touch   
[root@m01 ansible]# ansible-playbook  a.yml 

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

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

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

[root@m01 ansible]# cat a.yml
- hosts: websvars:pk:- lrzsz - wget tasks:- name: Install packageyum: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: websvars_files:- vars1.ymltasks:- name: Install packageyum:name: "{{ pk1 }}"state: absent
[root@m01 ansible]# ansible-playbook  --syntax-check a.ymlplaybook: 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: websvars_files:- vars1.yml- vars2.ymltasks:- name: Install packageyum: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: webstasks:- name: Install packageyum: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: webstasks:- name: Install packageyum: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: nfstasks:- name: Install packageyum: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.7tasks:- name: list /root/ file command: ls -l

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

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

#第二步:将执行的结果赋值给一个变量(变量的名称自定义)vim a.yml
- hosts: 10.0.0.7tasks:- name: list /root/ filecommand: ls -lregister: list_file- name: print list_file envdebug: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.7vars_files: vars1.ymltasks:- name:  Install packageyum:name: "{{ lnmp.nginx.pk1 }}"state: absent官方推荐调用层级变量的写法
[root@m01 ansible]# cat a.yml
- hosts: 10.0.0.7vars_files: vars1.ymltasks:- name:  Install packageyum:name: "{{ lnmp['nginx']['pk1'] }}"state: present[root@m01 ansible]# ansible-playbook  a.yml #案例2定义多个层级列表的方式
[root@m01 ansible]# cat vars1.yml 
lnmp:nginx:pk1: wgetpk2: tree调用:
[root@m01 ansible]# cat a.yml 
- hosts: 10.0.0.7vars_files: vars1.ymltasks:- name: Install packageyum: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: webstasks:- name: print os envdebug:msg: "{{ ansible_distribution }}"
  • 案例2.输出两台web的IP地址
[root@m01 ansible]# cat os.yml 
- hosts: webstasks:- name: print os envdebug:msg: "{{ ansible_default_ipv4.address }}"	
  • 案例3.需求创建出以主机名命名+IP地址的目录
[root@m01 ansible]# cat a.yml 
- hosts: webstasks:- name:  create hostname ip dirfile:path: /root/{{ ansible_hostname }}_{{ ansible_default_ipv4.address }}state: directory

4.今日总结

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

http://www.dtcms.com/a/358754.html

相关文章:

  • 联合体和枚举——嵌入式学习笔记
  • 每日算法题【二叉树】:二叉树的最大深度、翻转二叉树、平衡二叉树
  • 【系统分析师】高分论文:论软件的系统测试及应用
  • 栈溢出问题
  • Redis-数据类型的常用操作命令
  • uart学习
  • Jdk动态代理 Cglib动态代理
  • MYSQL表结构优化场景
  • 解构机器学习:如何从零开始设计一个学习系统?
  • folium地图不显示加载不出来空白问题解决
  • SAP PP模块的MPS
  • 福彩双色球第2025100期篮球号码分析
  • git在push和clone等操作时显示‘: Invalid argument
  • 优选算法:二分查找
  • #5:Nginx核心使用技术
  • Java 学习笔记(基础篇12)
  • 小狼毫输入法中让数字键盘上的数字键不再选择候选词而是与原始输入一起直接上屏
  • 计算机视觉与深度学习 | 基于深度学习的图像特征提取与匹配算法综述及MATLAB实现
  • 互联网大厂大模型应用开发岗位面试:技术点详解与业务场景演练
  • nacos3端口漂移问题
  • shell编程-核心变量知识
  • LeetCode - 234. 回文链表
  • 2025年高性能计算年会
  • Golang 面试题「高级」
  • 零碳智慧园区双碳方案
  • 代理IP网站哪家好?全球优质IP代理服务商有什么推荐?
  • 【Linux】网络安全管理:Netfilter、nftables 与 Firewalld | Redhat
  • Linux查看Java进程PID、端口号和内存占用脚本
  • 2023年山东省信息学小学组(CSP-X)第一轮题解
  • 【嵌入式原理系列-第六篇】从Flash到RAM:MCU ld脚本全解析