自动化运维工具-Ansible roles
Ansible Roles基本概述
我们肯定需要把不同的工作模块,拆分开来,解耦,那么说到解耦,我们就需要用到roles
官方推荐,因为roles
的目录结构层次更加清晰。
例如:我们之前推荐大家写一个base.yml
里面写所有基础优化的项目,其实把所有东西摞进去也是很鸡肋的,不如我们把这些功能全部拆分开,谁需要使用,就调用即可。
建议:每个roles最好只使用一个tasks这样方便我们去调用,能够很好的做到解耦。
Ansible roles的目录结构
production # 用于生产服务器的 Ansible 清单文件。
# 清单文件用于定义哪些主机属于哪个组,以及如何连接这些主机(如 IP 地址、SSH 端口等)。
staging # 用于暂存环境的清单文件。
# 暂存环境通常是开发或测试环境,配置方式类似于生产环境。
group_vars/ # 这个目录包含为特定组定义的变量。
group1.yml # 为组1定义的变量。组是 Ansible 中主机的逻辑分类。
# 在这个文件中,你可以定义与组相关的全局变量,所有属于这个组的主机会自动继承这些变量。
group2.yml # 为组2定义的变量。
# 比如,如果你有一组 Web 服务器,可以在此定义 Web 服务的相关参数,如端口号或域名。
host_vars/ # 这个目录包含为特定主机定义的变量。
hostname1.yml # 定义与主机1(hostname1)相关的变量。
# 如果某台主机有特定的配置需求,这里可以定义专用变量,比如某台服务器的特定 IP 或其他设置。
hostname2.yml # 定义与主机2(hostname2)相关的变量。
library/ # 自定义模块存放目录(可选)。
# 如果你编写了 Ansible 无法直接实现的任务模块,可以将这些自定义模块放在这个目录下供使用。
module_utils/ # 支持自定义模块的工具函数库(可选)。
# 一些自定义模块可能依赖特定的工具函数,可以将这些工具函数放在此目录下。
filter_plugins/ # 自定义过滤插件存放目录(可选)。
# 如果你需要编写特定的数据处理插件,可以将这些过滤器放在此目录下,用于模板或其他资源的过滤和处理。
site.yml # 主播放簿文件,通常是整个项目的入口点。
# 该文件描述了整个基础设施的部署流程,通常会包含对其他播放簿的引用。
webservers.yml # Web 服务器层的播放簿。
# 定义 Web 服务器的配置任务,比如安装 Apache/Nginx,设置虚拟主机,启动服务等。
dbservers.yml # 数据库服务器层的播放簿。
# 定义数据库服务器的配置任务,比如安装 MySQL/PostgreSQL,配置用户权限,设置备份等。
roles/ # 角色目录,包含所有的角色定义。每个角色封装了一组任务,用于配置某类系统组件。
common/ # "common" 角色的目录,适用于所有主机的通用配置。
# 该角色可以包含如系统更新、常用工具安装、通用安全设置等。
tasks/ # 任务目录,包含该角色执行的任务。
main.yml # 主要任务文件,列出了该角色的任务列表。
# 可以引用其他任务文件以组织复杂任务。
handlers/ # 处理程序目录,存放可以被触发的事件处理程序(如服务重启)。
main.yml # 主要处理程序文件,定义了在特定条件下要执行的处理动作(如当配置文件发生变化时重新启动服务)。
templates/ # 模板文件目录,通常是带有变量占位符的配置文件。
ntp.conf.j2 # NTP 配置文件模板(.j2 表示 Jinja2 模板文件)。
# 使用模板文件可以动态生成配置文件,比如根据不同主机或环境生成不同的 NTP 配置。
files/ # 静态文件目录,存放需要复制到远程主机的文件。
bar.txt # 需要被复制的文本文件。
foo.sh # 脚本文件,用于执行一些特殊操作。
vars/ # 变量目录,定义该角色中使用的变量。
main.yml # 主要变量文件,包含所有与此角色相关的变量。
defaults/ # 默认变量目录,优先级较低的变量定义。
main.yml # 默认变量文件,定义了一些可以被覆盖的默认设置。
meta/ # 元数据目录,描述该角色的依赖关系。
main.yml # 元数据文件,定义该角色依赖的其他角色或外部资源。
library/ # 自定义模块目录,用于该角色特定的模块(可选)。
module_utils/ # 自定义模块工具目录,为该角色提供支持工具(可选)。
lookup_plugins/ # 查找插件目录,用于实现复杂的动态变量查找(可选)。
webtier/ # Web 层的角色,配置与 web 服务器相关的任务和变量。
# 与 "common" 角色的结构相同,但专注于 Web 服务的配置。
monitoring/ # 监控系统角色,用于设置服务器监控工具(如 Prometheus、Nagios)。
fooapp/ # 某个特定应用的角色,配置该应用的所有依赖和环境。
nginx #项目目录名称
├── defaults #默认的变量(优先级很低)
│ └── main.yml
├── files #存放文件,使用copy模块时自动获取
├── handlers #存放触发器的配置
│ └── main.yml
├── meta #依赖的服务,执行该项目时先执行其他的项目
│ └── main.yml
├── README.md
├── tasks #默认执行的playbook
│ └── main.yml
├── templates #存放jinja2模板,使用template模块时自动获取
├── tests
│ ├── inventory
│ └── test.yml
└── vars #存放变量
└── main.yml
Ansible Roles依赖关系
roles
允许你再使用roles时自动引入其他的roles。role依赖关系存储在roles目录中meta/main.yml文件中。
例如:推送wordpress并解压,前提条件,必须要安装nginx和php,把服务跑起来,才能运行wordpress的页面,此时我们就可以在wordpress的roles中定义依赖nginx和php的roles
vim /etc/ansible/roles/wordpress/meta/main.yml
dependencies:
- { role: nginx }
- { role: php }
如果编写了meta目录下的main.yml文件,那么Ansible会自动先执行meta目录中main.yml文件中的dependencies文件,
、如上所示,就会先执行nginx和php的安装。
Roles的最佳实践
roles小技巧
1.创建roles目录结构,手动使用ansible-galaxy init no1
2.编写roles功能
3.在playbook中引
## 部署 rsync 及其配置文件 创建用户 创建目录
[root@li group_vars]#cat /root/roles/group_vars/all.yml
user: backup
rsync_user: abcrsync
rsync_passwd: 123
rsync_passwd_file: /etc/abcrsync.passwd
backup: /backup
cat /root/roles/rsync/templates/rsyncd.j2
uid = {{ user }}
gid = {{ user }}
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = {{ rsync_user }}
secrets file = {{ rsync_passwd_file }}
log file = /var/log/rsyncd.log
#####################################
[backup]
comment = welcome to oldboyedu backup!
path = {{ backup }}
[root@li tasks]#ls /root/roles/rsync/tasks/
config.yml install.yml main.yml start.yml
[root@li tasks]#cat install.yml
- name: Install Rsync
apt:
name: rsync
[root@li tasks]#cat config.yml
- name: Push Rsync Conf
template:
src: rsyncd.conf.j2
dest: /etc/rsyncd.conf
notify: restart rsync
- name: Create Passwd File
copy:
content: "{{ rsync_user }}:{{ rsync_passwd }}"
dest: "{{ rsync_passwd_file }}"
mode: 0600
- name: Create {{ backup_dir }}
file:
path: /{{ backup }}
state: directory
owner: "{{ user }}"
group: "{{ user }}"
[root@li tasks]#cat start.yml
- name: Start Rsync
service:
name: rsync
state: started
enabled: yes
[root@li tasks]#cat main.yml
---
# tasks file for rsync
- include_tasks: install.yml
- include_tasks: config.yml
- include_tasks: start.yml
### 触发器
[root@li rsync]#cat handlers/main.yml
---
# handlers file for rsync
- name: Restart Rsync
systemd:
name: rsync
state: restarted
#### 创建用户 与目录
[root@li user]#pwd
/root/roles/user
[root@li user]#cat tasks/main.yml
---
# tasks file for user
- name: 创建用户
user:
name: "{{ user }}"
state: present
- name: 创建目录
file:
path: "{{ backup }}"
state: directory
[root@li roles]#pwd
/root/roles
[root@li roles]#cat site.yaml
- hosts: all
roles:
- {role: user}
- {role: rsync,when: ansible_hostname == '101'}