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 核心作用
- 模块化组织
将相关的任务、变量、文件、模板等资源打包为一个独立单元,实现功能模块化。 - 代码复用
同一角色可以在不同playbook或项目中重复使用,避免重复编写相同代码。 - 职责分离
每个角色专注于实现单一功能(如安装Web服务器、配置数据库等),符合单一职责原则。 - 标准化结构
强制使用标准目录结构,使项目更易于理解和维护。
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期-孙克旭」一起进行文档协作