Ansible 角色
文章目录
- Ansible 角色
- 一、Ansible Roles 介绍
- 二、Roles 结构
- 三、role 的制作过程
- 四、如何在PlayBook中使用 Role
- 1. 经典(原始)方式
- 2. 新方式
- 五、如何使用 Galaxy
一、Ansible Roles 介绍
一个数据中心有可能存在好多类型的服务器。比如,web 类型、DB类型、开发人员使用的开发类型、QA使用的测试类型等等。
实际生产中,基本每个类型的服务器的初始化行为都不一致,那么要在一个 playbook 中将这些动作完成,这个playbook将变得臃肿、庞大、且难以后续维护和更新。
如果能针对每个类型的服务器单独编写playbook,最后通过某种方式整合者 playbook,在管理方式上就会变得简单。
ansible 中提供了类似的概念,也就是role。它允许管理员将他们复杂的 playbook 分解成一个个小的逻辑单元,以便于维护和管理。
二、Roles 结构
1.role 是什么
web_servers/
--- defaults
--- main.yml
--- files
--- handlers
--- main.yml
--- meta
--- main.yml
--- tasks
--- main.yml
--- templates
--- vars
--- main.yml
从表面上看,它就是一个目录。目录的名字也就是 role 的名字,实例中,role 的叫做 web_servers。
进到这个 role 名字的目录里,会发现好多子目录。
使用时,每个目录必须包含 一个 main.yml 文件,这个文件应该包含如下目录名称对应的内容:
- tasks 包含角色要执行的任务的主要列表。
- handlers 包含处理程序,次角色甚至该角色之外的任何地方都可以使用这些处理程序。
- defaults 角色的默认变量。
- vars 角色的其他变量。
- files 包含可以通过此角色部署的文件。
- template 包含可以通过次角色部署的模板。
- meta 为此角色定义一些元数据。
角色必须至少包含这些目录之一,但是最好排除任何未使用的目录。
三、role 的制作过程
分解这个PlayBook,命名role 的名字为 nginx
nginx/
│
├── files
├── handlers
│ └── main.yml
├── tasks
│ └── main.yml
├── templates
└── vars
└── main.yml
[root@master1 ~]# tree nginx
nginx
├── files
│ └── www.guan.com.conf
├── handles
│ └── main.yml
├── tasks
│ └── main.yml
├── templates
│ └── nginx.conf.j2
└── vars
└── main.yml
5 directories, 5 files
[root@master1 ~]#
[root@master1 ~]# mkdir nginx
[root@master1 ~]# cd nginx
[root@master1 nginx]# mkdir {files,handles,tasks,templates,vars}
[root@master1 nginx]# ls
files handles tasks templates vars
[root@master1 nginx]# for l in `ls`;do touch ${l}/main.yml;done
[root@master1 nginx]# tree
bash: tree: 未找到命令...
[root@master1 nginx]# yum install tree
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
base | 3.6 kB 00:00:00
code | 3.0 kB 00:00:00
epel | 4.7 kB 00:00:00
extras | 2.9 kB 00:00:00
percona-release-noarch | 1.5 kB 00:00:01
percona-release-x86_64 | 2.9 kB 00:00:00
prel-release-noarch | 1.5 kB 00:00:00
updates | 2.9 kB 00:00:00
zabbix | 2.9 kB 00:00:00
zabbix-frontend | 2.9 kB 00:00:00
zabbix-non-supported | 2.9 kB 00:00:00
code/primary_db | 2.8 MB 00:00:07
正在解决依赖关系
--> 正在检查事务
---> 软件包 tree.x86_64.0.1.6.0-10.el7 将被 安装
--> 解决依赖关系完成
依赖关系解决
=======================================================================================================
Package 架构 版本 源 大小
=======================================================================================================
正在安装:
tree x86_64 1.6.0-10.el7 base 46 k
事务概要
=======================================================================================================
安装 1 软件包
总下载量:46 k
安装大小:87 k
Is this ok [y/d/N]: y
Downloading packages:
tree-1.6.0-10.el7.x86_64.rpm | 46 kB 00:00:05
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
正在安装 : tree-1.6.0-10.el7.x86_64 1/1
验证中 : tree-1.6.0-10.el7.x86_64 1/1
已安装:
tree.x86_64 0:1.6.0-10.el7
完毕!
[root@master1 nginx]# tree
.
├── files
│ └── main.yml
├── handles
│ └── main.yml
├── tasks
│ └── main.yml
├── templates
│ └── main.yml
└── vars
└── main.yml
5 directories, 5 files
[root@master1 nginx]#
files 文件夹存放文件
存放 default.conf 配置文件
[root@master1 ~]# cat www.guan.com.conf
server {
listen 80;
server_name www.guan.com.conf;
root /usr/share/nginx/html;
access_log /var/log/nginx/www.guan.com-access_log main;
error_log /var/log/nginx/www.guan.com-error_log;
add_header Access-Control-Allow-Origin *;
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
expires 1d;
}
location ~ .\.(js|css)$? {
expires 1d;
}
}
[root@master1 ~]#
[root@master1 ~]# cp www.guan.com.conf ./nginx/files/
[root@master1 ~]# ls ./nginx/files/
main.yml www.guan.com.conf
[root@master1 ~]# rm -rf ./nginx/files/main.yml
[root@master1 ~]# ls ./nginx/files/
www.guan.com.conf
[root@master1 ~]#
handlers 文件夹中的main.yml 文件
- name: reload nginx server
service: name=nginx state=reloaded
when: nginxsyntax.rc == 0
tasks 文件夹中的 main.yml 文件
- name: 传输仓库文件
copy:
src: nginx.repo
dest: /etc/yum.repos.d/nginx.repo
- name: 安装 nginx
yum: name=nginx state=present
- name: 利用模板文件,设置主配置文件
template:
src: "{{ main_conf }}"
dest: /etc/nginx/nginx.conf
tags: update
# 触发任务
notify: reload nginx server
- name: 子配置文件
copy:
src: "{{ sub_conf }}"
dest: /etc/nginx/conf.d/
tags: update
notify: reload nginx server
- name: check nginx syntax
shell: /usr/sbin/nginx -t
register: nginxsyntax
tags: update
- name: 启动 nginx 服务
when: nginxsyntax.rc == 0
systemd: name=nginx state=started
templates 文件夹存放模板
user nginx;
{# start process equal cpu cores #}
worker_processes {{ ansible_processor_vcpus }};
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
sendfile on;
tcp_nopush on;
keepalive_timeout 0;
gzip on;
gzip_min_length 1k;
gzip_buffers 8 64k;
gzip_http_version 1.0;
gzip_comp_level 5;
gzip_types text/plain application/x-javascript text/css application/json application/xml application/x-shockwave-flash application/javascript image/svg+xml image/x-icon;
gzip_vary on;
{# add_header {{ ansible_hostname }}; #}
add_header x-hostname {{ ansible_hostname }};
include /etc/nginx/conf.d/*.conf;
}
vars 文件夹中的 main.yml 文件
main_conf: nginx.conf.j2
sub_conf: default.conf
四、如何在PlayBook中使用 Role
1. 经典(原始)方式
编译一个 playbool,内容如下:
在 playbook 中给定
roes:
属性
文件:deploy-nginx.yml
- name: use role
hosts: web_servers
roles:
- web_servers
保证 deploy-nginx.yml 文件的当前目录下有 webservers 角色
执行:
ansible-playbook -i hosts deploy_nginx.yml
将上面的内容保存为一个 yml 文件: test_play_vars.yml
目录结构
[root@master1 ~]# mkdir web_servers
[root@master1 ~]# mv ./nginx web_servers
[root@master1 ~]# mv ./test_play_vars.yml web_servers
[root@master1 ~]# cd web_servers
[root@master1 web_servers]# ls
nginx test_play_vars.yml
[root@master1 web_servers]# tree .
.
├── nginx
│ ├── files
│ │ └── www.guan.com.conf
│ ├── handles
│ │ └── main.yml
│ ├── tasks
│ │ └── main.yml
│ ├── templates
│ │ └── nginx.conf.j2
│ └── vars
│ └── main.yml
└── test_play_vars.yml
6 directories, 6 files
[root@master1 web_servers]#
执行:
#ansible-playbook -i hosts test_play_vars.yml
2. 新方式
在 playbook 中给定 import_role
属性
这种方式适用于 Ansible 2.4及以上
#vim nginx_new.yml
- name: use rose
hosts: web_servers
tasks:
- debug:
msg: "before we run our role"
- import_role:
name: nginx
- debug:
msg: "after we ran our role"
执行方式同第一种
ansible-playbook -i hosts nginx_new.yml
新的目录结构
[root@master1 ~]# mkdir web_servers
[root@master1 ~]# mv ./nginx web_servers
[root@master1 ~]# mv ./test_play_vars.yml web_servers
[root@master1 ~]# cp /root/hosts /root/web_servers/
[root@master1 ~]# cd web_servers
[root@master1 web_servers]# ls
nginx test_play_vars.yml hosts
[root@master1 web_servers]# tree .
.
├── hosts
├── nginx
│ ├── files
│ │ └── www.guan.com.conf
│ ├── handles
│ │ └── main.yml
│ ├── tasks
│ │ └── main.yml
│ ├── templates
│ │ └── nginx.conf.j2
│ └── vars
│ └── main.yml
└── test_play_vars.yml
五、如何使用 Galaxy
ansible 的Galaxy 工具,类似程序员使用的GitHub,运维人员可以将自己编写的Role 通过 Galaxy 这个平台进行分享。同样,我们也可以通过 Galaxy 这个平台去获取一些我们想要的role。
官网地址:https://galaxy.ansible.com/
而 ansible-Galaxy 则是一个使用 galaxy 命令工具,它使我们不用访问 galaxy 的网站就可以获取到需要的内容。
获取帮助
[root@master1 web_servers]# ansible-galaxy --help
usage: ansible-galaxy [-h] [--version] [-v] TYPE ...
Perform various Role and Collection related operations.
positional arguments:
TYPE
collection Manage an Ansible Galaxy collection.
role Manage an Ansible Galaxy role.
optional arguments:
--version show program's version number, config file location,
configured module search path, module location, executable
location and exit
-h, --help show this help message and exit
-v, --verbose verbose mode (-vvv for more, -vvvv to enable connection
debugging)
[root@master1 web_servers]#
常用指令
//在galaxy 上搜索共享的 role
#ansible-galaxy search
// 安装 galaxy 上共享的 role
#ansible-galaxy install
//列举已经通过 ansible-galaxy 工具安装的 role
#ansible-galaxy list
// 创建一个 role 的空目录架构,这样我们在开发一个role的时候就不需要手动创建目录了
#ansible-galaxy init --offline
[root@master1 web_servers]# ansible-galaxy init guan.testrole
- Role guan.testrole was created successfully
[root@master1 web_servers]# tree guan.testrole
guan.testrole
├── defaults
│ └── main.yml
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── README.md
├── tasks
│ └── main.yml
├── templates
├── tests
│ ├── inventory
│ └── test.yml
└── vars
└── main.yml
8 directories, 8 files
[root@master1 web_servers]#