【Ansible】Ansible 角色

Ansible 角色





在这里插入图片描述


一、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]# 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

guan12319

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值