ansible - route ¶
学习内容: https://docs.ansible.com/ansible/latest/user_guide/playbooks_reuse_roles.html
1. ansible-role 简介 ¶
1. 什么是 role? ¶
1. 什么是 role
-
Roles 称为角色,playbook 被称为剧本。Roles 角色是自 1.2 版本之后引入的新特性,用于层次性、结构化的组织剧本。在 ansible 中,roles 是playbooks 的一部分。playbooks 模块化之后,成为 roles 的组织结构,易读,代码可重用,层次清晰。
-
简单的说,roles 就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中、并可以便捷地 include 他们的一种机制。
-
角色一般用于基于主机构建服务的场景中、但也可以是用于构建守护进程等场景中,主要是使用在代码复用度较高的场景下
-
以特定的层级目录结构进行组织的 tasks、variables、handlers、templates、files等;
2. 为什么使用 ansible-role
-
在实际的工作当中,一个完整的项目实际上是很多功能体的组合,如果将所有的功能写在一个 playbook 中会存在如代码耦合程度高、playbook 长而维护成本大、灵活性低等一系列的问题。
-
把单个庞大的剧本,拆分为小剧本,便于维护,完成解耦、结构更清晰、调试更方便。
-
使用 roles 能巧妙的解决这一系列的问题。roles 是 ansible1.2 版本后加入的新功能,适合于大项目 playbook 的编排架构。
-
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
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 的规范目录
grep '^role' /etc/ansible/ansible.cfg
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/
mkdir -p /etc/ansible/roles
# 这里定义的文件名,必须和roles目录下的每一个任务目录同名
touch /etc/ansible/{site.yml,nfs_servers.yml,rsync_servers.yml}
mkdir -p /etc/ansible/roles
# 这里定义的文件名,必须和roles目录下的每一个任务目录同名
mkdir -p /etc/ansible/roles/rsync_servers/{tasks,handlers,files,templates,vars}
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
---
- 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
---
- name: restart nginx
service:
name: nginx
state: restarted
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;
}
---
app_port: 8000
---
- name: Apply the nginx configuration on webservers
hosts: webservers
roles:
- nginx
2. mysql 项目 ¶
1. 编写 tasks handlers templates vars
---
- 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
---
- name: restart mysql
service:
name: mysql
state: restarted
[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
---
mysql_root_password: yourpassword
---
- 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