zoukankan      html  css  js  c++  java
  • Ansible roles 介绍和使用

    roles

    roles 介绍

    ansible 自1.2版本引入的新特性,用于层次性、结构化地组织playbook。roles能够根据层次结构自动装在边梁文杰、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。简单来讲,roles就是通过分别将变量、文件、任务、模块以及处理器放置于单独的目录中,并可以边界的include他们的一种机制。角色一般基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中。

    一个roles的案例如下所示:

    site.yml
    wevservers.yml
    fooservers.yml
    roles/
      common/
        files/
        templates/
        tasks/
        handlers/
        vars/
        meta/
      wevservers/
        files/
        templates/
        tasks/
        handlers/
        vars/
        meta/
    

    而在playbook中,可以这样使用roles:

    -hosts: wevservers
     roles:
     - common
     - wevservers
    

    也可以向roles传递参数,例如:

    - hosts: webservers
      roles:
      - common
      - { role: foo_app_instance, dir: '/opt/a', port: 5000 }
      - { role: foo_app_instance, dir: '/opt/b', port: 5001 }
    

    甚至也可以条件式地使用roles,例如:

    - hostss: webservers
      roles:
      - { role: some_role, when: "ansible_os_family == 'RedHat'" }
    

    创建role的步骤

    1. 创建以roles命名的目录;
    2. 在roles目录中分别创建以各校色名称命名的目录,如webservers等;
    3. 在每个角色命名的目录中分别创建files、handlers、meta、tasks、templates和vars目录;用不到的目录可以创建为空目录,也可以不创建;
    4. 在playbook文件中,调用各角色;

    role内个目录中可用的文件

    目录名 说明
    tasks目录 至少应该包含一个名为main.yml的文件,其定义了此角色的任务列表;文件可以使用include包含其它的位于此目录中的task文件;
    file目录 存放由copy或script等模块调用的文件;
    templates目录 template模块会自动在此目录中寻找Jinja2模板文件;
    handlers目录 此目录中应当包含一个main.yml文件,用于定义此角色用到的各handler;在handler中使用include包含的其它handler文件也应该位于此目录中;
    vars目录 应当包含一个main.yml文件,用于定义此角色用到的变量;
    meta目录 因当包含一个main.yml文件,用于定义此角色的特殊设定及其依赖关系;ansible 1.3 及其以后的版本才支持;
    default目录 为当前角色设定默认变量时使用此目录,因当包含一个main.yml文件;

    案例

    创建roles所需的目录

    [root@node-1 ansible]# mkdir -pv ansible_playbook/roles/{webservs,dbservs}/{tasks,files,templates,meta,handlers,vars}
    [root@node-1 ansible]# tree ansible_playbook/
    ansible_playbook/
    └── roles
        ├── dbservs
        │   ├── files
        │   ├── handlers
        │   ├── meta
        │   ├── tasks
        │   ├── templates
        │   └── vars
        └── webservs
            ├── files
            ├── handlers
            ├── meta
            ├── tasks
            ├── templates
            └── vars
    

    以webservs来举例

    首先进入到webservs角色对应的目录

    [root@node-1 ansible_playbook]# cd roles/webservs/
    [root@node-1 webservs]# ls
    files  handlers  meta  tasks  templates  vars
    [root@node-1 webservs]# pwd
    /etc/ansible/ansible_playbook/roles/webservs
    

    然后拷贝httpd配置文件

    [root@node-1 webservs]# cp /etc/httpd/conf/httpd.conf files/
    

    定义tasks

    [root@node-1 webservs]# cat tasks/main.yml
    - name: install httpd package
      yum: name=httpd state=present
    - name: install configuration file
      copy: src=httpd.conf dest=/etc/httpd/conf/httpd.conf
      tags:
      - conf
      notify:
      - restart httpd
    - name: start httpd
      service: name=httpd state=started
    

    定义handlers

    [root@node-1 webservs]# cat handlers/main.yml
    - name: restart httpd
      service: name=httpd state=restarted
    

    然后到roles目录下

    [root@node-1 webservs]# cd ../../
    [root@node-1 ansible_playbook]# pwd
    /etc/ansible/ansible_playbook
    [root@node-1 ansible_playbook]# ls
    roles
    

    定义site.yml

    这里site.yml是固定用法

    [root@node-1 ansible_playbook]# cat site.yml
    - hosts: webservs
      remote_user: root
      roles:
      - webservs
    [root@node-1 ansible_playbook]# pwd
    /etc/ansible/ansible_playbook
    [root@node-1 ansible_playbook]# ls
    roles  site.yml
    

    最后执行site.yml

    [root@node-1 ansible_playbook]# ansible-playbook site.yml
    
    PLAY [webservs] **********************************************************************************************************************************************
    
    TASK [Gathering Facts] ***************************************************************************************************************************************
    ok: [10.25.196.25]
    
    TASK [webservs : install httpd package] **********************************************************************************************************************
    changed: [10.25.196.25]
    
    TASK [webservs : install configuration file] *****************************************************************************************************************
    ok: [10.25.196.25]
    
    TASK [webservs : start httpd] ********************************************************************************************************************************
    changed: [10.25.196.25]
    
    PLAY RECAP ***************************************************************************************************************************************************
    10.25.196.25               : ok=4    changed=2    unreachable=0    failed=0
    

    可以看到执行成功了,下面来查看一下

    [root@node-1 ansible_playbook]# ansible webservs -m shell -a 'rpm -qa httpd'
     [WARNING]: Consider using the yum, dnf or zypper module rather than running rpm.  If you need to use command because yum, dnf or zypper is insufficient you
    can add warn=False to this command task or set command_warnings=False in ansible.cfg to get rid of this message.
    
    10.25.196.25 | SUCCESS | rc=0 >>
    httpd-2.2.15-69.el6.centos.x86_64
    
    [root@node-1 ansible_playbook]# ansible webservs -m shell -a 'ps aux | grep httpd'
    10.25.196.25 | SUCCESS | rc=0 >>
    root     19148  0.0  0.0 175536  3764 ?        Ss   21:08   0:00 /usr/sbin/httpd
    apache   19150  0.0  0.0 175536  2476 ?        S    21:08   0:00 /usr/sbin/httpd
    apache   19151  0.0  0.0 175536  2448 ?        S    21:08   0:00 /usr/sbin/httpd
    apache   19152  0.0  0.0 175536  2448 ?        S    21:08   0:00 /usr/sbin/httpd
    apache   19153  0.0  0.0 175536  2448 ?        S    21:08   0:00 /usr/sbin/httpd
    apache   19154  0.0  0.0 175536  2448 ?        S    21:08   0:00 /usr/sbin/httpd
    apache   19155  0.0  0.0 175536  2448 ?        S    21:08   0:00 /usr/sbin/httpd
    apache   19156  0.0  0.0 175536  2448 ?        S    21:08   0:00 /usr/sbin/httpd
    apache   19157  0.0  0.0 175536  2448 ?        S    21:08   0:00 /usr/sbin/httpd
    root     19335  0.0  0.0 106104  1128 pts/1    S+   21:16   0:00 /bin/sh -c ps aux | grep httpd
    root     19337  0.0  0.0 103260   832 pts/1    S+   21:16   0:00 grep httpd
    

    可以看到服务都是启动正常的。

    总结:

    最后的site.yml中,可以定义多个hosts,分别执行不同的任务.这样所有的代码都可以被反复使用。

    1. 目录名同角色名;
    2. 目录结构有固定格式;
  • 相关阅读:
    zookeeper 简介
    缓存雪崩 缓存穿透
    SpringCloud实战2-Ribbon客户端负载均衡
    SpringCloud实战1-Eureka
    JVM笔记9-Class类文件结构
    JVM笔记8-虚拟机性能监控与故障处理工具
    JVM笔记7-内存分配与回收策略
    SpringAOP-JDK 动态代理和 CGLIB 代理
    MySQL多数据源笔记5-ShardingJDBC实战
    MySQL多数据源笔记4-Mycat中间件实战
  • 原文地址:https://www.cnblogs.com/winstom/p/9805898.html
Copyright © 2011-2022 走看看