ansible roles

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yyy72999/article/details/80916081

一 什么情况下会用到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

存放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=present

    with_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

猜你喜欢

转载自blog.csdn.net/yyy72999/article/details/80916081