03 Ansible-Roles 快速入门


Roles 快速入门

Roles 简介

  1. Roles是基于已知文件结构自动加载某些变量文件,任务和处理程序的方法。
  2. 按角色对内容进行分组,适合构建复杂的部署环境。

Roles 目录结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 根据自己需要定义目录 
site.yml # 入口文件
webservers.yml
fooservers.yml
roles/ # 目录
common/ # 应用结果
tasks/ # task任务
handlers/ # 触发任务
files/ # 文件目录
templates/ # jinjia渲染文件目录
vars/ # 变量
defaults/ # 默认目录
meta/ # 元数据
webservers/
tasks/
defaults/
meta/

简单示例

1
2
3
4
5
6
7
- `tasks`       - 包含角色要执行的任务的主要列表。
- `handlers` - 包含处理程序,此角色甚至在此角色之外的任何地方都可以使用这些处理程序。
- `defaults` - 角色的默认变量
- `vars` - 角色的其他变量
- `files` - 包含可以通过此角色部署的文件。
- `templates` - 包含可以通过此角色部署的模板。
- `meta` - 为此角色定义一些元数据。请参阅下面的更多细节。
1
2
3
4
5
6
7
8
9
10
11
12
[root@master playbook]# tree /etc/ansible/playbook/
/etc/ansible/playbook/
├── roles
│   ├── mysql
│   ├── nginx
│   │   ├── files
│   │   ├── tasks
│   │   │   └── main.yaml
│   │   └── templates
│   │   └── nginx.conf
│   └── php
└── site.yaml
1
2
3
4
5
6
7
8
# 入口文件
[root@master playbook]# vim /etc/ansible/playbook/site.yaml

- hosts: web
gather_facts: false
# roles名字
roles:
- nginx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 工作流程
[root@master playbook]# vim /etc/ansible/playbook/roles/nginx/tasks/main.yaml

# 默认读取该yaml文件,只写tasks任务
#- name: 安装 nginx
# yum:
# name=http://nginx.org/packages/rhel/7/x86_64/RPMS/nginx-1.16.1-1.el7.ngx.x86_64.rpm
# state=latest

#- name: 启动 Nginx
# systemd:
# name=nginx
# state=started
# enabled=yes

- name: 生成虚拟主机 默认找templates目录
template: src=nginx.conf dest=/tmp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 模板文件
[root@master playbook]# vim /etc/ansible/playbook/roles/nginx/templates/nginx.conf
upstream web{
# 拿到web组,循环得到web组里每行的数据
{% for host in groups['web'] %}
# 取得每行配置的 hostname,如果是IP最好,如果是组几名需要取IP
server {{ hostvars[host].inventory_hostname }};
{% endfor %}
}

server {
listen: {{ http_port }};
server_name: {{ domain_name }};
location / {
root /usr/share/html;
1
2
3
4
5
6
7
# 变量定义
[root@master playbook]# vim /etc/ansible/group_vars/web.yaml

work: Kubernetes
http_port: 19090
domain_name: www.teamshub100.com
domain: www.teamshub200.com
1
2
# 执行
[root@master playbook]# ansible-playbook site.yaml

使用角色

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 定义多个:

[root@master playbook]# vim site.yaml

- name: web 安装
hosts: web
gather_facts: false
# roles名字
roles:
- nginx
- tomcat
tags: web

- name: mysql 安装
hosts: db
gather_facts: false
roles:
- mysql
tags: db
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@master playbook]# tree 
├── roles
│   ├── mysql
│   │   └── tasks
│   │   └── main.yaml
│   ├── nginx
│   │   ├── files
│   │   ├── tasks
│   │   │   └── main.yaml
│   │   └── templates
│   │   └── nginx.conf
│   └── tomcat
│   └── tasks
│   └── main.yaml
└── site.yaml
1
2
3
[root@master playbook]# ansible-playbook site.yaml 
# 指定部署
[root@master playbook]# ansible-playbook site.yaml --tags=db

角色控制

1
2
3
4
5
6
- name: 0.系统初始化
gather_facts: false
hosts: all
roles:
- common
tags: common

生成 roles 目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@master roles]# ansible-galaxy init test

[root@master roles]# tree test/
test/
├── defaults
│   └── main.yml
├── files
├── handlers
│   └── main.yml
├── meta
│   └── main.yml
├── README.md
├── tasks
│   └── main.yml
├── templates
├── tests
│   ├── inventory
│   └── test.yml
└── vars
└── main.yml