一 什么情况下会用到roles?
比如我们三个主机组,这三个组里面的主机分别需要安装MySQL,Nginx,Redis,前面好办,我们分别写多三个playbook就解决了,但是随后又新增加一个主机组,这个主机组我需要安装MySQL和Redis,那么我还需要在写一个play,这样就比较麻烦不易扩展,这时候就用到了组件化的roles
二 roles目录结构
site.yml
webservers.yml
fooservers.yml
roles/
common/
files/
templates/
tasks/
handlers/
vars/
defaults/
meta/
webservers/
files/
templates/
tasks/
handlers/
vars/
defaults/
meta/
2.1 roles目录下可创建N个文件夹用于识别唯一”app名”,app下面固定几个目录:
files
存放一些file文件,脚本等等,tasks copy模块引用无需写绝对路径
templates
存放一些模版,比如一些配置文件引用变量可存放该目录下面,tasks template模块引用无需写绝对路径
tasks/main.yml
app入口,执行一系列操作
handlers/main.yml
列出的 handlers 将被添加到play中
vars/main.yml
存放变量,tasks 引用变量无需引入file,可直接使用
meta/main.yml
其中列出的角色依将被添加到roles列表中
defalut
设定默认变量时使用此目录中的main.yml文件。
三 案例
1:主机组web_server安装package nginx,vsftpd
2:重新启动服务,并设置开机自启
3:将本地api.conf配置文件拷贝到/tmp/ 并命名为nginx.conf,其中会引入变量,并重新启动
4:拷贝useradd.sh脚本到/tmp目录下,权限为0755
3.1目录结构如下
roles/
├── common
│ ├── defaults
│ ├── files
│ │ ├── file.txt
│ │ └── useradd.sh
│ ├── handlers
│ │ └── main.yml
│ ├── meta
│ ├── tasks
│ │ └── main.yml
│ ├── templates
│ │ └── api.conf
│ └── vars
│ └── main.yml
├── roles
└── site.yml
site.yml为程序入口
- name: entry webserver main
hosts: web_server
roles:
- common
3.2 files
- common
存放useradd.sh脚本文件
ls files/
file.txt useradd.sh
3.3 handlers
nginx、vsftpd重新启动,并开机自启
cat handlers/main.yml
- name: ‘restart services’
service:
name={{item}}
state=restarted
enabled=true
with_items:
- nginx
- vsftpd
3.4 templates
该文件文nginx配置文件,其中有三个变量,定义在vars目录下
cat templates/api.conf
server {
listen {{listen_port}}
server_name {{server_name}};
location / {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
root build;
index html index.html;
try_files $uri /index.html;
}
}
server {
listen 9000;
server_name www.aipython.net;
location ~ /api/ {
include uwsgi_params;
uwsgi_pass {{proxy_server}};
}
}
3.5 vars
定义三个变量,用于在tasks/main.yml中调用
cat vars/main.yml
server_name: “server.baidu.com”
proxy_server: “proxy.baidu.com”
listen_port: 1998
3.6 tasks
其中无需加载变量文件,notify也无需include handlers文件,变量也无需引用
name: installed package
yum:
name={{item}}
state=presentwith_items:
- nginx
- vsftpd
notify: - restart services
name: template to config
template:
src=api.conf dest=/tmp/nginx.conf
notify:- restart services #ps:多次执行无效,所有task执行完毕之后才会执行handler 而不是通知顺序
name: copy file to agent host
action: copy
src=useradd.sh
dest=/tmp/
mode=0755
四 执行结果
ansible-playbook site.yml
PLAY [entry webserver main] *********************************************************************************************************************************
TASK [Gathering Facts] **************************************************************************************************************************************
ok: [139.196.90.14]
ok: [106.14.154.11]
TASK [common : installed package] ***************************************************************************************************************************
changed: [106.14.154.11] => (item=[‘nginx’, ‘vsftpd’])
changed: [139.196.90.14] => (item=[‘nginx’, ‘vsftpd’])
TASK [common : template to config] **************************************************************************************************************************
ok: [139.196.90.14]
ok: [106.14.154.11]
TASK [common : copy file to agent host] *********************************************************************************************************************
ok: [139.196.90.14]
ok: [106.14.154.11]
RUNNING HANDLER [common : restart services] *****************************************************************************************************************
changed: [139.196.90.14] => (item=nginx)
changed: [106.14.154.11] => (item=nginx)
changed: [139.196.90.14] => (item=vsftpd)
changed: [106.14.154.11] => (item=vsftpd)
PLAY RECAP **************************************************************************************************************************************************
106.14.154.11 : ok=5 changed=2 unreachable=0 failed=0
139.196.90.14 : ok=5 changed=2 unreachable=0 failed=0