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

day052-ansible handler、roles与优化

文章目录

  • 0. 老男孩思想-秀外与惠中的女生差异
  • 1. ansible字典变量
  • 2. ansible配置NFS服务
    • 2.1 mount模块
    • 2.2 编写nfs主机组的分组变量
    • 2.3 编写nfs配置文件j2模板
    • 2.4 编写客户端配置nfs剧本
    • 2.5 编写客户端挂载nfs目录剧本
  • 3. ansible 触发器(handler)
    • 3.1 分发nfs配置文件后才能重启服务
  • 4. ansible目录规范-roles
    • 4.1 核心作用
    • 4.2 roles目录-配置rsync服务
      • 4.2.1 变量文件
      • 4.2.2 模板文件
      • 4.2.3 主任务文件
      • 4.2.4 触发器任务文件
      • 4.2.5 角色启动文件
      • 4.2.6 启动rsync服务角色
  • 5. 剧本调试
  • 6. ansible优化
    • 6.1 性能优化
    • 6.2 安全优化
      • 6.2.1 敏感数据保护
      • 6.2.2 权限控制
  • 7. 思维导图

0. 老男孩思想-秀外与惠中的女生差异

越是外在漂亮的女生,越是看中男生的外在与背后的金钱、权利;
越是内在好的女生,越是在意男生的说话谈吐、气质、上进心、责任心,以及是否有学历、学识。—老男孩

在这里插入图片描述

1. ansible字典变量

  • 测试案例
[root@m02 /server/ans/playbooks]# cat 16.dict_vars.yaml 
- hosts: allgather_facts: falsevars:nfs_server:ip: "10.0.0.10"dir: "/nfs/backup"user:- oldboy01- oldboy02- oldboy03uid:- { name: "skx", id: 1010 }- { name: "skx01", id: 1011 }- { name: "skx02", id: 1012 }tasks:- name: 1.显示nfs信息debug:msg: |nfs服务器ip:{{ nfs_server.ip }}nfs服务器目录:{{ nfs_server.dir }}用户信息:{{ nfs_server.user }}- name: 2.循环显示用户信息debug:msg: "{{ item }}"loop: "{{ nfs_server.user }}"- name: 3.循环显示用户id信息debug:msg: "用户名:{{ item.name }}, 用户id: {{ item.id }}"loop: "{{ nfs_server.uid }}"
  • 执行:
[root@m02 /server/ans/playbooks]# ansible-playbook -i hosts 16.dict_vars.yaml 
……TASK [1.显示nfs信息] ********************************************************************************************
ok: [172.16.1.5] => {"msg": "nfs服务器ip:10.0.0.10\nnfs服务器目录:/nfs/backup\n用户信息:['oldboy01', 'oldboy02', 'oldboy03']\n"
}
ok: [172.16.1.6] => {"msg": "nfs服务器ip:10.0.0.10\nnfs服务器目录:/nfs/backup\n用户信息:['oldboy01', 'oldboy02', 'oldboy03']\n"
}
ok: [172.16.1.7] => {"msg": "nfs服务器ip:10.0.0.10\nnfs服务器目录:/nfs/backup\n用户信息:['oldboy01', 'oldboy02', 'oldboy03']\n"
}
……TASK [2.循环显示用户信息] ***************************************************************************************
ok: [172.16.1.6] => (item=oldboy01) => {"msg": "oldboy01"
}
ok: [172.16.1.5] => (item=oldboy01) => {"msg": "oldboy01"
}
ok: [172.16.1.6] => (item=oldboy02) => {"msg": "oldboy02"
}
ok: [172.16.1.6] => (item=oldboy03) => {"msg": "oldboy03"
}
……
TASK [3.循环显示用户id信息] *************************************************************************************
ok: [172.16.1.5] => (item={'name': 'skx', 'id': 1010}) => {"msg": "用户名:skx, 用户id: 1010"
}
ok: [172.16.1.5] => (item={'name': 'skx01', 'id': 1011}) => {"msg": "用户名:skx01, 用户id: 1011"
}
ok: [172.16.1.5] => (item={'name': 'skx02', 'id': 1012}) => {"msg": "用户名:skx02, 用户id: 1012"
}
……

2. ansible配置NFS服务

2.1 mount模块

mount 模块是 Ansible 中用于管理文件系统挂载点的模块,它可以用来挂载、卸载文件系统,或者修改 /etc/fstab 文件中的挂载配置。

  • 模块参数:
    • path:挂载点路径
    • src:要挂载的设备或目录路径
    • fstype:文件系统类型
    • state:挂载状态
      • mounted:立即挂载并添加到fstab条目
      • absent:卸载并移除fstab条目
    • boot:是否在启动时挂载(默认为yes)

2.2 编写nfs主机组的分组变量

[root@m02 /server/ans/playbooks/group_vars]# cat nfs.yaml 
nfs_server:ip: "10.0.0.31"users:- { "name": "www","id": 1999 }- { "name": "www-ans","id": 12999 }dirs:- { "dir": "/nfsdata/","user": "www" }- { "dir": "/nfs/wordpress","user": "www" }- { "dir": "/nfs/blog/","user": "www" }- { "dir": "/nfs/zrlog/", "user":"www" }
nfs_client:nfs_server_dir: "172.16.1.31:/nfsdata/"mount_dir: /mnt/multi_dirs:- { "server_dir": "172.16.1.31:/nfsdata/" ,"client_dir": "/data01/" }- { "server_dir": "172.16.1.31:/nfs/wordpress/" ,"client_dir": "/data02/" }- { "server_dir": "172.16.1.31:/nfs/blog/", "client_dir": "/data03/" }- { "server_dir": "172.16.1.31:/nfs/zrlog/", "client_dir": "/data04/" }
  • web主机组的分组变量也需要这些变量
[root@m02 /server/ans/playbooks/group_vars]# cat web.yaml 
# 引用nfs.yaml中所有变量
vars_files:- ./nfs.yaml

2.3 编写nfs配置文件j2模板

[root@m02 /server/ans/playbooks/files]# cat exports.j2 
{% for dir in nfs_server.dirs %}
#nfs服务端目录 {{ dir }}
{{dir.dir}}     172.16.1.0/24(rw,all_squash,anonuid={{nfs_server.user.id}},anongid={{nfs_server.user.id}})
{% endfor %}

2.4 编写客户端配置nfs剧本

[root@m02 /server/ans/playbooks]# cat 17.nfs_server.yaml 
- hosts: nfstasks:- name: 1.rpcbind,nfsyum:name: rpcbind,nfs-utilsstate: latest- name: 2.用户组环境准备 用户,uid,gid,www,1999, www-ans  12999group:name: "{{ item.name }}"gid: "{{ item.id }}"state: presentloop: "{{ nfs_server.users }}"- name: 3.添加用户user:name: "{{ item.name }}"uid: "{{ item.id }}"group: "{{ item.name }}"state: presentloop: "{{ nfs_server.users }}"- name: 3.目录file:path: "{{ item.dir }}"owner: "{{ item.user }}"group: "{{ item.user }}"state: directoryloop: "{{ nfs_server.dirs }}"- name: 4.配置文件copy:src: ./exports.j2dest: /etc/exportsbackup: yes- name: 5.启动服务systemd:name: "{{ item }}"enabled: truestate: startedloop:- rpcbind- nfs-server

2.5 编写客户端挂载nfs目录剧本

[root@m02 /server/ans/playbooks]# cat 17.nfs_client.yaml
- hosts: web
tasks:- name: 安装nfsshell: echo 安装nfs- name: 挂载mount:path: "{{ nfs_client.mount_dir }}"src: "{{ nfs_client.nfs_server_dir }}"fstype: nfsstate: mounted

3. ansible 触发器(handler)

Handlers 是 Ansible 中一种特殊的任务,用于在 playbook 执行过程中响应变化并执行后续操作(通常是在多个任务触发后执行一次性操作)。

  • handler通过 notify 指令触发

3.1 分发nfs配置文件后才能重启服务

[root@m02 /server/ans/playbooks]# cat 19.handlers_test.yaml 
- hosts: nfstasks:- name: 分发配置文件template:src: ./files/exports.j2dest: /tmp/exportsnotify: #该任务执行完毕后才会启动触发器中的任务- 重启服务 #执行指定的触发器任务handlers: #触发器,与tasks选项同级- name: 重启服务 #任务名称,与上面的名称保持一致systemd:name: nfsstate: reload

4. ansible目录规范-roles

Roles(角色)是 Ansible 中用于组织和封装自动化任务的核心概念

4.1 核心作用

  1. 模块化组织
    将相关的任务、变量、文件、模板等资源打包为一个独立单元,实现功能模块化。
  2. 代码复用
    同一角色可以在不同playbook或项目中重复使用,避免重复编写相同代码。
  3. 职责分离
    每个角色专注于实现单一功能(如安装Web服务器、配置数据库等),符合单一职责原则。
  4. 标准化结构
    强制使用标准目录结构,使项目更易于理解和维护。

4.2 roles目录-配置rsync服务

[root@m02 /server/ans/roles]# tree
.
├── group_vars	# 分组变量目录
│   ├── all.yaml	# 所有主机的全局变量文件
│   ├── bak.yaml
│   ├── data.yaml
│   ├── db.yaml	# db主机组的变量文件
│   ├── lb.yaml
│   ├── nfs.yaml
│   └── web.yaml
├── hosts	# 主机清单文件
├── rsync_server	# rsync服务角色目录
│   ├── files	# 静态文件目录
│   ├── handlers	# handlers处理器目录
│   │   └── main.yaml	# handlers主文件:存放处理器任务
│   ├── tasks	# 任务定义目录
│   │   └── main.yaml	# 任务主文件:存放所有任务tasks
│   └── templates	# 模板文件目录:存放jinja2模板
│       └── rsyncd.conf.j2
└── top.yaml	# 角色启动文件;启动任务入口文件

4.2.1 变量文件

[root@m02 /server/ans/roles]# cat group_vars/db.yaml 
rsync_module:- { name: "data", dir: "/data" }- { name: "backup", dir: "/backup" }- { name: "blog", dir: "/nfs/backup/blog" }

4.2.2 模板文件

  • 若task任务中的原文件是jinja2文件或任务使用template模块,ansible会自动去templates目录下查找该文件
  • 若任务中指定的是普通文件,ansible会去files目录下查找
[root@m02 /server/ans/roles]# cat rsync_server/templates/rsyncd.conf.j2 
fake super = yes 
uid = rsync
gid = rsync
use chroot = no
max connections = 2000
timeout = 600
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore errors
read only = false
list = false
#hosts allow = 10.0.0.0/24
#hosts deny = 0.0.0.0/32
auth users = rsync_backup
secrets file = /etc/rsync.password
#####################################
{% for dir in rsync_module %}
[{{dir.name}}]
comment = by skx
path = {{ dir.dir }}
{% endfor %}

4.2.3 主任务文件

[root@m02 /server/ans/roles]# cat rsync_server/tasks/main.yaml 
- name: 1.安装rsyncyum:name: rsyncstate: latest- name: 2.分发配置文件template:	# 使用template模块,程序会去templates目录下查找文件src: rsyncd.conf.j2	# 无需指定确切路径,程序会自动查找dest: /etc/rsyncd.confbackup: truenotify:- restart_rsync  - name: 3.添加用户user:name: rsyncshell: /sbin/nologincreate_home: falsestate: present- name: 4.创建备份目录,修改所有者file:path: /ans/backupmode: 0755owner: rsyncgroup: rsyncstate: directory- name: 5.创建密码文件,修改权限lineinfile:path: /etc/rsync.passwordline: "rsync_backup:1"mode: 0600owner: rootgroup: rootcreate: true- name: 6.启动服务systemd:name: rsyncdenabled: truestate: restarted

4.2.4 触发器任务文件

[root@m02 /server/ans/roles]# cat rsync_server/handlers/main.yaml 
- name: restart_rsyncsystemd:name: rsyncdstate: restarted

4.2.5 角色启动文件

[root@m02 /server/ans/roles]# cat top.yaml 
- hosts: dbroles:- role: rsync_server	# 指定角色目录

4.2.6 启动rsync服务角色

[root@m02 /server/ans/roles]# ansible-playbook -i hosts top.yaml 
……PLAY [db] *******************************************************************************************************TASK [Gathering Facts] ******************************************************************************************
ok: [172.16.1.51]
fatal: [172.16.1.52]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: ssh: connect to host 172.16.1.52 port 22: No route to host", "unreachable": true}TASK [rsync_server : 1.安装rsync] *******************************************************************************
changed: [172.16.1.51]TASK [rsync_server : 2.分发配置文件] ****************************************************************************
changed: [172.16.1.51]TASK [rsync_server : 3.添加用户] ********************************************************************************
changed: [172.16.1.51]TASK [rsync_server : 4.创建备份目录,修改所有者] *****************************************************************
changed: [172.16.1.51]TASK [rsync_server : 5.创建密码文件,修改权限] *******************************************************************
changed: [172.16.1.51]TASK [rsync_server : 6.启动服务] ********************************************************************************
changed: [172.16.1.51]# 触发器任务
RUNNING HANDLER [rsync_server : restart_rsync] ******************************************************************
changed: [172.16.1.51]PLAY RECAP ******************************************************************************************************
172.16.1.51                : ok=8    changed=7    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
172.16.1.52                : ok=0    changed=0    unreachable=1    failed=0    skipped=0    rescued=0    ignored=0   

5. 剧本调试

  • -C:模拟运行剧本,可以检查错误;register变量无法使用
  • -vvv:显示详细信息
  • –start-at-task 任务名称:从指定的任务开始运行
  • 给tasks任务加标签,可以按照标签运行指定的任务
    • 剧本选项:tags
    • ansible选项:
      • -t 标签名:运行指定的任务
      • –skip-tags:跳过任务
  • 剧本选项:ignore_errors,当任务错误时,依然向下运行

6. ansible优化

6.1 性能优化

  • ansible的配置文件:/etc/ansible/ansible.cfg
gathering = explicit	# 关闭facts功能
inventory = ./hosts	# 指定主机清单路径
forks = 10	# 指定ansible的并发数
  • 指定主机清单路径后,需添加系统环境变量:echo 'export ANSIBLE_INVENTORY=./hosts'

6.2 安全优化

6.2.1 敏感数据保护

# 加密文件
ansible-vault encrypt secrets.yml# 运行playbook时解密
ansible-playbook playbook.yml --ask-vault-pass

6.2.2 权限控制

  • 最小权限原则
- name: Configure servicebecome: yesbecome_user: appuser  # 使用特定用户而非rootbecome_method: sudo
  • 特权提升控制
# 在/etc/sudoers.d/ansible 中限制
ansible ALL=(appuser) NOPASSWD: /usr/bin/systemctl restart nginx

7. 思维导图

https://kdocs.cn/join/gpuxq6r?f=101\r\n邀请你加入共享群「老男孩教育Linux运维99期-孙克旭」一起进行文档协作

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

相关文章:

  • Spring AI 项目实战(十七):Spring + AI + 通义千问星辰航空智能机票预订系统(附完整源码)
  • SDN软件定义网络架构深度解析:分层模型与核心机制
  • Datawhale AI 夏令营【更新中】
  • java虚拟线程
  • 面试150 从中序与后序遍历构造二叉树
  • Maven项目没有Maven工具,IDEA没有识别到该项目是Maven项目怎么办?
  • html案例:编写一个用于发布CSDN文章时,生成有关缩略图
  • 【拓扑排序+dfs】P2661 [NOIP 2015 提高组] 信息传递
  • 线下门店快速线上化销售四步方案
  • 在i.MX8MP上如何使能BlueZ A2DP Source
  • 如何设计高并发架构?深入了解高并发架构设计的最佳实践
  • Nature子刊 |HERGAST:揭示超大规模空间转录组数据中的精细空间结构并放大基因表达信号
  • DETRs与协同混合作业训练之CO-DETR论文阅读
  • Pandas 的 Index 与 SQL Index 的对比
  • Flask中的路由尾随斜杠(/)
  • SQL140 未完成率top50%用户近三个月答卷情况
  • react中为啥使用剪头函数
  • (nice!!!)(LeetCode 面试经典 150 题 ) 30. 串联所有单词的子串 (哈希表+字符串+滑动窗口)
  • win10 离线安装wsl
  • 论文翻译:Falcon: A Remote Sensing Vision-Language Foundation Model
  • 26-计组-数据通路
  • 楼宇自动化:Modbus 在暖通空调(HVAC)中的节能控制(一)
  • Linux驱动开发1:设备驱动模块加载与卸载
  • java+vue+SpringBoo中小型制造企业质量管理系统(程序+数据库+报告+部署教程+答辩指导)
  • 查看Linux服务器显卡使用情况的详细教程
  • win11添加无线显示器(两个笔记本实现双屏)
  • 昇腾FAQ-A08-工具链相关
  • 小架构step系列13:测试用例的加载
  • 线性代数学习笔记
  • 求解线性规划模型最优解