自动化运维工具-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'}