跳转至

ansible - route

学习内容: https://docs.ansible.com/ansible/latest/user_guide/playbooks_reuse_roles.html

1. ansible-role 简介

1. 什么是 role?

1. 什么是 role

  1. Roles 称为角色,playbook 被称为剧本。Roles 角色是自 1.2 版本之后引入的新特性,用于层次性、结构化的组织剧本。在 ansible 中,roles 是playbooks 的一部分。playbooks 模块化之后,成为 roles 的组织结构,易读,代码可重用,层次清晰。

  2. 简单的说,roles 就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中、并可以便捷地 include 他们的一种机制。

  3. 角色一般用于基于主机构建服务的场景中、但也可以是用于构建守护进程等场景中,主要是使用在代码复用度较高的场景下

  4. 以特定的层级目录结构进行组织的 tasks、variables、handlers、templates、files等;

2. 为什么使用 ansible-role

  1. 在实际的工作当中,一个完整的项目实际上是很多功能体的组合,如果将所有的功能写在一个 playbook 中会存在如代码耦合程度高、playbook 长而维护成本大、灵活性低等一系列的问题。

  2. 把单个庞大的剧本,拆分为小剧本,便于维护,完成解耦、结构更清晰、调试更方便。

  3. 使用 roles 能巧妙的解决这一系列的问题。roles 是 ansible1.2 版本后加入的新功能,适合于大项目 playbook 的编排架构。

  4. playbook 是一个脚本,而 roles 是一堆脚本。roles 是将 playbook 中的信息拆散,按照一定的逻辑关系,存放在不同的路径下。例如 roles 将playbook 中的变量放在一个文件夹中,将模板也放在一个文件夹中,甚至任务也可以拆分放到独立的文件夹中,可以重复调用。

2. 角色目录规划

roles 组成

Ansible 角色具有定义的目录结构,一个完整的 roles 其中包含八个主要的标准目录。是由 task、handlers、files、vars、templates、meta 等一系列目录组成,各目录存放不同的文件实现不同的功能,在调用时直接下文件名即可调用。必须在每个角色中至少包含其中一个目录。可以省略角色不使用的任何目录。例如如下的官网示例

参考官网即可,且必须按照如下的目录格式来,不是随便定义的 https://docs.ansible.com/ansible/latest/user_guide/playbooks_reuse_roles.html#role-directory-structure

image-20240611230646327

1. role 目录组成

1. 各 role 的规范目录

各目录的作用:

  • site.yml: 入口
  • roles: 所有的角色必须放到roles目录下,这个目录可以自定义,默认的位置就在 /etc/ansible/roles ,并且和剧本是同级目录

    • project: 具体的角色项目命令,比如nginx、tomcat、php
    • files #角色名称,用来存放配置文件或者源代码包的
    • handlers #存放静态文件,此目录应当包含一个main.yml文件,用于定义此角色中触发条件时执行的动作,可以不用写
    • tasks #具体任务,此目录应当包含一个main.yml文件,用于定义此角色的任务列表,此文件可以使用
    • templates #模板文件,用来存放配置文件,跟files目录不同的是,这里的配置文件可以调用变量
    • vars #存放变量, 此目录应当包含一个main.yml文件,用于定义此角色用到的变量

role执行顺序:pre_tasks > role > tasks > post_tasks

2. 创建 role 的规范目录

创建 role 的规范目录

1. 定义 role 存放路径
grep '^role' /etc/ansible/ansible.cfg 
2. 创建 role 的固定目录
site.yml                    # role入口
nfs_servers.yml             # role
rsync_servers.yml           # role
roles/                      # role规范目录结构
    nginx_servers/          # role具体名字
        tasks/              # 剧本任务
        handlers/           # 剧本里存放的handlers
        files/              # 如压缩文件,如需要拷贝的文件
        templates/          # 存放配置文件
        vars/               # 存放变量文件
    rsync_servers/
        tasks/
        handlers/
        files/
        templates/
        vars/
3. 创建如上的目录结构
mkdir -p /etc/ansible/roles
# 这里定义的文件名,必须和roles目录下的每一个任务目录同名
touch  /etc/ansible/{site.yml,nfs_servers.yml,rsync_servers.yml}
4. 创建关于 rsync_servers 的目录
mkdir -p /etc/ansible/roles
# 这里定义的文件名,必须和roles目录下的每一个任务目录同名
mkdir -p /etc/ansible/roles/rsync_servers/{tasks,handlers,files,templates,vars}
5. 检查创建好的目录结构
tree /etc/ansible/
/etc/ansible/
├── ansible.cfg
├── hosts
├── nfs_servers.yml
├── roles
│   └── rsync_servers
│       ├── files  # 指的是目录中,存放剧本运行需要用到的文件
│       ├── handlers
│       ├── tasks
│       ├── templates
│       └── vars
├── rsync_servers.yml
└── site.yml

案例一:nginx 与 mysql 与 nginx

1. 创建结构目录

包含 mysql 与 nginx

ansible_project/
├── site.yml
└── roles/
    ├── nginx/
    │   ├── tasks/
    │   │   └── main.yaml
    │   ├── handlers/
    │   │   └── main.yaml
    │   ├── templates/
    │   │   └── nginx.conf.j2
    │   └── vars/
    │       └── main.yaml
    └── mysql/
        ├── tasks/
        │   └── main.yaml
        ├── handlers/
        │   └── main.yaml
        ├── templates/
        │   └── my.cnf.j2
        └── vars/
            └── main.yaml

2. nginx 项目

1. 编写 tasks handlers templates vars

1. roles/nginx/tasks/main.yaml 中的任务定义:
---
- name: Install Nginx
  apt: 
    name: nginx
    state: present

- name: Apply the nginx config template
  template:
    src: templates/nginx.conf.j2
    dest: /etc/nginx/nginx.conf
  notify: 
    - restart nginx
2. roles/nginx/handlers/main.yaml 中定义 handler
---
- name: restart nginx
  service:
    name: nginx
    state: restarted
3. roles/nginx/templates/nginx.conf.j2 定义模板:
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
        worker_connections 768;
}

http {

        sendfile on;
        tcp_nopush on;
        types_hash_max_size 2048;

        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
        ssl_prefer_server_ciphers on;

        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;

        gzip on;

        include /etc/nginx/conf.d/*.conf;
}
4. roles/nginx/vars/main.yaml 中定义变量:
---
app_port: 8000
5. site.yml
---
- name: Apply the nginx configuration on webservers
  hosts: webservers
  roles:
    - nginx

2. mysql 项目

1. 编写 tasks handlers templates vars

1. roles/mysql/tasks/main.yaml 的任务定义
---
- name: Install MySQL
  apt:
    name: mysql-server
    state: present

- name: Copy the mysql config file
  copy:
    src: files/my.cnf
    dest: /etc/mysql/my.cnf
  notify:
    - restart mysql
2. 在 roles/mysql/handlers/main.yaml 中定义的 handler:
---
- name: restart mysql
  service:
    name: mysql
    state: restarted
3. roles/mysql/files/my.cnf 配置文件
[client]
port            = 3306
socket          = /var/run/mysqld/mysqld.sock

[mysqld_safe]
socket          = /var/run/mysqld/mysqld.sock
nice            = 0

[mysqld]
user            = mysql
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
port            = 3306
basedir         = /usr
datadir         = /var/lib/mysql
tmpdir          = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking
bind-address            = 127.0.0.1
key_buffer_size         = 16M
max_allowed_packet      = 16M
thread_stack            = 192K
thread_cache_size       = 8
myisam-recover-options  = BACKUP
query_cache_limit       = 1M
query_cache_size        = 16M
log_error = /var/log/mysql/error.log
expire_logs_days        = 10
max_binlog_size   = 100M

[mysqldump]
quick
quote-names
max_allowed_packet      = 16M

[mysql]
[isamchk]
key_buffer_size         = 16M
4. roles/mysql/vars/main.yaml 中定义变量
---
mysql_root_password: yourpassword
5. site.yml
---
- name: Apply the nginx configuration
  hosts: webservers
  roles:
    - nginx

- name: Apply the mysql configuration
  hosts: databases
  roles: 
    - mysql

ansible的主机汇总(通常位于/etc/ansible/hosts)中定义多个组,如下:

[webservers]
192.168.1.10

[databases]
192.168.1.100