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 获取客户端主机名称等...🍟🍟🍟🍟🍟