zoukankan      html  css  js  c++  java
  • 4、Ansible(tags、roles)

    Tags   

    https://docs.ansible.com/ansible/latest/user_guide/playbooks_tags.html

    http://www.zsythink.net/archives/2641

    tags用于让用户选择运行playbook中的部分代码。ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可以通过tags跳过此些代码片断。

    tags:在playbook中可以为某个或这些任务定义一个"标签",在执行此playbook时,通过ansible-playbook命令使用--tags选项能实现仅运行指定的tasks而非所有的。

    # vim apache.yml //在配置文件修改以后,没有必要把整个playbook定义的tasks都运行一遍。运行playbooks时只需指定说明需要运行的task。

     1 - hosts: websrvs        //如何只运行所需要运行的task?可以给每个task都给一个单独的标签或者只给需要郧运行的task一个单独的标签,在运行ansible-playbook明确指明标签对应的task就可以了。
     2   remote_user: root
     3   vars:
     4   - package: httpd
     5   - service: httpd
     6   tasks:    //第一次运行的时候,tasks全部运行一边,再次运行时可以只运行一分部内容
     7   - name: install httpd package    //比如第一个tasks在第一次运行后,如果配置文件发生改变,那么再次执行tasks时,没有必要把此tasks再执行一遍,因为即使执行了也没有发生任何改变。
     8     yum: name={{ package }} state=latest
     9   - name: install configuration file for httpd   //文件修改后,可以之运行这个任务,其他的任务可以不运行
    10     template: src=/root/templates/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
    11     tags:    //此处定义标签
    12     - conf   //标签对应的task名字
    13     notify:
    14     - restart httpd
    15   - name: start httpd service
    16     service: name={{ service }} enabled=true state=started
    17   handlers:
    18   - name: restart httpd
    19     service: name=httpd state=restarted

    # vim /etc/ansible/hosts   //对websrvs进行修改,表示playbook中定义的配置文件有修改

    [websrvs]
    192.168.184.142 http_port=8080
    192.168.184.143 http_port=80

    # ansible-playbook apache.yml --tags="conf"

     1 PLAY [websrvs] ***********************************************************************************************************************
     2    
     3 TASK [Gathering Facts] ***************************************************************************************************************
     4 ok: [192.168.184.143]
     5 ok: [192.168.184.142]
     6                           //安装程序包的task和启动服务的task都没有执行,而是直接复制配置文件到被管控主机。
     7 TASK [install configuration file for httpd] ******************************************************************************************
     8 changed: [192.168.184.143]     //这里只运行了标签tags为conf的task
     9 changed: [192.168.184.142]
    10 
    11 RUNNING HANDLER [restart httpd] ******************************************************************************************************
    12 changed: [192.168.184.142]    //由于存在notify机制,所以在配置文件修改后会重启服务
    13 changed: [192.168.184.143] 
    14 
    15 PLAY RECAP ***************************************************************************************************************************
    16 192.168.184.142            : ok=3    changed=2    unreachable=0    failed=0   
    17 192.168.184.143            : ok=3    changed=2    unreachable=0    failed=0   

    Roles详解 

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

     

    一个roles的案例如下所示:

    site.yml   //整个yml文件的主调接口

    webservers.yml   //两个子yml文件

    dbservers.yml

    roles/            //roles里面定义了多个role

    common/        //第一个是通行角色,无论是通行角色还是服务器角色下都有子目录

    files/      //文件:源文件和目标文件

    templates/   //模板

    tasks/       //所有的task

    handlers/    //处理器

    vars/         //变量

    meta/         //元数据

    webservers/    //服务器角色

    files/

    templates/

    tasks/

    handlers/

    vars/

    meta/

     

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

    ---

    - hosts: webservers

      roles:   //定义roles为common和webservers,直接调用roles里面的内容

    - common

    - webservers

     

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

    ---

    - hosts: webservers

      roles:    //调用roles时

    - common   

    - { role: foo_app_instance, dir: '/opt/a',  port: 5000 }  //foo_app_instance是角色,传递某个参数dir: '/opt/a',  port: 5000

    - { role: foo_app_instance, dir: '/opt/b',  port: 5001 }

     

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

    ---

    - hosts: 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文件;

    files目录:存放由copy或script等模块调用的文件;

    templates目录:template模块会自动在此目录中寻找Jinja2模板文件;

    handlers目录:此目录中应当包含一个main.yml文件,用于定义此角色用到的各handler;在handler中使用include包含的其它的handler文件也应该位于此目录中;

    vars目录:应当包含一个main.yml文件,用于定义此角色用到的变量;

    meta目录:应当包含一个main.yml文件,用于定义此角色的特殊设定及其依赖关系;ansible 1.3及其以后的版本才支持;

    default目录:为当前角色设定默认变量时使用此目录;应当包含一个main.yml文件;

     

    什么场景下可以用到role?

    有三台主机,A配置成httpd服务器,B配置为php服务器,C配置成MySQL server。这三台服务都要配置上ntp服务,方便同步时间,这里使用crontab命令来执行。

    如何定义playbook?第一个play应用于A即web server上,第二个play应用于B即php server,第三个play应用于C即mysql server,但是这样操作不利于模块化和重复调用。假如随后又加进一个主机D,既要配置成web server又要配置成php server,那么可能就要写第四个play应用于D主机了。

    为了避免代码重复,roles定义的功用可以实现代码被多次调用。比如定义三个角色分别是:websrvs、phpsrvs和dbsrvs,那么下面调用角色就如下所示:

    hosts: A    //当定义主机A时,使用websrvs角色

    role:

    - websrvs

    hosts: B    //当定义主机B时,使用phpsrvs角色

    role:

    - phpsrvs   //当定义主机C时,使用dbsrvs角色

    hosts: C

    role:

    - dbsrvs    //当定义主机D时,使用websrvs角色和phpsrvs角色

    hosts: D

    role:

    - websrvs

    - phpsrvs

    实验示例

    # mkdir -pv ansible_playbooks/roles/{websrvs,dbsrvs}/{tasks,files,templates,meta,handlers,vars}   //按照规定创建目录

    # tree ansible_playbooks/    //查看此目录的树形结构

    ansible_playbooks/
    └── roles
        ├── dbsrvs
        │   ├── files
        │   ├── handlers
        │   ├── meta
        │   ├── tasks
        │   ├── templates
        │   └── vars
        └── websrvs
            ├── files
            ├── handlers
            ├── meta
            ├── tasks
            ├── templates
            └── vars

    # cd ansible_playbooks/roles/websrvs/    //要注意目录的改变

    # cp /etc/httpd/conf/httpd.conf files/    //这里假设每一个服务的配置文都是相同的,当作静态文件使用

    # vim tasks/main.yml  //定义所有的任务

    - name: install httpd package
      yum: name=httpd
    - name: install configuration file
      copy: src=httpd.conf dest=/etc/httpd/conf/httpd.conf     //注意:src使用的相对路径,即相对于ansible_playbooks/roles/websrvs/files,files下的文件都可以使用相对路径,直接调用
      tags:
      - conf
      notify:
      - restart httpd     //注意这里需要用到触发器handlers,需要另外定义
    - name: start httpd
      service: name=httpd state=started

    # vim handlers/main.yml      //此前把handlers和任务都是定义在一个文件中,现在需要分别定义,每一个内容都放在以它的标签命名的目录下面

                                //注意路径:ansible_playbooks/roles/websrvs

    - name: restart httpd
      service: name=httpd state=restarted

    # vim vars/main.yml    //如果还要定义变量,就需要在ansible_playbooks/roles/websrvs/vars目录下定义变量,这里可以暂时先删除

    - http_port: 80    //这里只是作为示例

    以上就定义了websrvs这个角色,如果想调用这个角色,需要在roles的目录之外创建一个固定格式为site.yml的文件。

    # vim site.yml   //定义playbook,只需在这个文件中定义调用那个角色就可以了

    - hosts: websrvs     //定义playbook所应用的主机
      remote_user: root  
      role:    //定义上面所指定主机的应用角色
        - websrvs   //角色名字,这个角色里面所有tasks、handlers、vars都可以在这里调用

    # ansible-playbook site.yml   //由于被管控主机之前已经安装了httpd程序,所以这里只是修改了配置文件

    PLAY [websrvs] ***********************************************************************************************************************
    
    TASK [Gathering Facts] ***************************************************************************************************************
    ok: [192.168.184.143]
    ok: [192.168.184.142]
    
    TASK [websrvs : install httpd package] ***********************************************************************************************
    ok: [192.168.184.142]
    ok: [192.168.184.143]
    
    TASK [websrvs : install configuration file] ******************************************************************************************
    changed: [192.168.184.143]
    changed: [192.168.184.142]
    
    TASK [websrvs : start httpd] *********************************************************************************************************
    ok: [192.168.184.142]
    ok: [192.168.184.143]
    
    RUNNING HANDLER [websrvs : restart httpd] ********************************************************************************************
    changed: [192.168.184.143]
    changed: [192.168.184.142]
    
    PLAY RECAP ***************************************************************************************************************************
    192.168.184.142            : ok=5    changed=2    unreachable=0    failed=0   
    192.168.184.143            : ok=5    changed=2    unreachable=0    failed=0   

    下面定义dbsrvs角色

    # yum install mariadb-server   //首先先在管控主机上安装mysql,因为要用到配置文件my.cnf

    # cd ansible_playbooks/roles/dbsrvs/   //看清楚路径,这里编辑是dbsrvs角色

    # cp /etc/my.cnf files/         //放在files目录下,使用相对路径直接调用就可以了

    # vim tasks/main.yml       //定义dbsrvs角色的任务

    - name: install mariadb-server package
      yum: name=mariadb-server state=latest
    - name: install configuration file
      copy: src=my.cnf dest=/etc/my.cnf    //src直接引用dbsrvs/files目录下的文件
      tags:
      - myconf
      notify:
      - restart mariadb
    - name: start mariadb service
      service: name=mariadb enabled=true state=started

    # vim handlers/main.yml    //定义处理器

    - name: restart mariadb
      service: name=mariadb state=restarted

    # vim site.yml     //分开指明角色

    - hosts: 192.168.184.142
      remote_user: root
      roles:
      - websrvs
    
    - hosts: 192.168.184.143
      remote_user: root
      roles:
      - dbsrvs
    
    - hosts: 192.168.184.145
      remote_user: root
      roles:
      - websrvs
      - dbsrvs

    roles注意事项:

    1、目录名同角色名

    2、目录结构有固定格式;

    files:静态文件

    templates:Jinjia2模板文件

    tasks:至少有一个main.yml文件,定义各handlers

    vars:至少有一个main.yml文件,定义变量

    meta:定义依赖关系等信息

    3、site.yml中定义playbook,额外也可以有其他的yml文件;

  • 相关阅读:
    jquery及相关兼容插件的版本搭配
    jquery IE7 下报错:SCRIPT257: 由于出现错误 80020101 而导致此项操作无法完成
    兼顾php和jquery新版本的checkbox的写法
    jquery.validate动态更改校验规则 【转】
    Google的10大座右铭
    用jQuery屏蔽掉按回车键时提交表单
    sizeof()和strlen()在求字符串长度时的差别
    Matlab使用心得
    C++ 数据类型及相关问题 及输出精度控制
    原生javascript满屏上下滚动
  • 原文地址:https://www.cnblogs.com/hanshanxiaoheshang/p/10214947.html
Copyright © 2011-2022 走看看