zoukankan      html  css  js  c++  java
  • ansible使用三(ansible roles)

    ansible roles 

      在实际的工作当中,一个完整的项目实际上是很多功能体的组合,如果将所有的功能写在一个playbook中会存在如代码耦合程度高、playbook长而维护成本大、灵活性低等一系列的问题。使用roles能巧妙的解决这一系列的问题。roles是ansible1.2版本后加入的新功能,适合于大项目playbook的编排架构。

    1、ansible playbook中使用includes 

        include在ansible中起引用功能,不仅可以引用ansible的playbook文件,也可以引用vars、handlers、file等文件。

    (1)includes的使用场景

             大量的playbook内容需要重复编写

             各tasks之间的功能需要相互调用

             playbook中的内容过多

    (2)include的用法

             用法:

                    tasks:

                    - include: playbookname.yaml

            修改主机名并添加用户admin,在修改主机名的playbook中使用include导入添加用户的playbook。           

    #修改主机名的playbook
    ---
    - hosts: test
      remote_user: root
      tasks:
      - name: change hostname
        hostname: name={{ servername }}
      - include: useradd.yaml
    #添加用户的playbook
    ---
    - name: user add
      user: name=admin state=present
    --------------------- 

    (3)动态includes

       动态的includes是指在满足一定的条件时,加载includes。

       编写安装配置zabbix-agent的ansible playbook如下:

    ---
    - hosts: "*"
      remote_user: root
      tasks:
     # 将安装文件拷贝到远程主机的/tmp目录下
      - name: copy zabbix-agent
        copy: src=/tmp/zabbix-agent-3.0.9-1.el6.x86_64.rpm dest=/tmp/
     # 安装zabbix-agent
      - name: install zabbix_agent
        yum: name=/tmp/zabbix-agent-3.0.9-1.el6.x86_64.rpm state=present
    # 启动zabbix-agent
      - name: start zabbix_agent
        service: name="zabbix-agent" state=started
     # 导入配置zabbix-agent的playbook
      - include: configzabbix.yaml
        # 只有当系统为centos6时才导入configzabbix.yaml
        when: ansible_distribution_major_version == "6"
     # 导入重启zabbix-agent 的playbook
      - include: zabbix_agent_restart.yaml
    congfigzabbix.yaml的文件内容如下:
    ---
    - name: configure zabbix_agent
      template: src=/home/dayi123/ansible/0418/zabbix_agent.conf.j2 dest=/etc/zabbix/zabbix_agent.conf

    重启zabbix_agent的配置文件zabbix_agent_restart.yaml内容如下:

    ---
    - name: restart zabbix_agent
      service: name=zabbix-agent state=restarted

    2、ansible roles
       通过includes可以在playbook中导入playbook,在一定程度上解决了将代码写入一个playbook中耦合性低及维护困难等一些列的问题。如果使用include导入大量的playbook及模板文件时,没有规范及统一的存放目录及命名规范,也不利于维护,roles正好解决了这一问题。

            roles主要依赖于目录的命名和摆放,默认tasks/main.yml是所有任务的人口,使用roles的过程也可以认为是目录规范化命名的过程。roles每个目录下均由main.yml定义该功能的任务集,tasks/main.yml默认执行所有定义的任务;roles目录建议放在ansible.cfg中”roles_path”定义的目录下。

    (1)ansible roles目录结构

        一个完整的roles是由task、handlers、files、vars、templates、meta等一系列目录组成,各目录存放不同的文件实现不同的功能,在调用时直接下文件名即可调用。ansible roles目录结构图如下:

    1)tasks目录

         tasks目录用于存放ansible执行的任务,tasks目录下必须存在main.yml文件,main.yml为主函数,用于导入需要执行的任务。

    2)handlers 目录

         handlers经常和notify搭配使用,当文件、进程及返回状态发生变化时,notify通过handlers做响应的变更。handlers目录下也需要包含main.yml,包含在在main.yml中的handlers将被执行

    3)templates及file目录

         templates目录及file目录均用于ansible目录文件处理,两个目录下均用于存放传输的文件,但templates目录下存放的是”.j2”格式的文件模板,文件中可以写变量。

    4)vars目录

         vars目录下用于定义当前roles执行时使用的变量,应当存在main.yml文件。

    5)default目录

      为当前角色定义默认变量时使用此目录,应该包含一个main.yml文件

    6)meta目录

      应当包含一个main.yml文件,用于定义此角色的特殊设定及其依赖关系。

    (2)ansible roles的执行方法

         roles的执行方法同ansible-playbook执行方法一样,需要调用roles的调用文件Rolesname.yml文件

    rolesname.yml文件格式如下:

    ---
    - hosts: all
      remote_user: root
      roles:
      - Rolename

    如果存在不同版本的操作系统是,roles调度文件可以根据不同的操作系统类型执行不同的roles。

    ---
    - hosts: all
      remote_user: root
      roles:
      - { role: rolename1, when: when: ansible_distribution_major_version == "6" }
      - { role: rolename1, when: when: ansible_distribution_major_version == "7" }

    roles执行方式如下:

    ansible-playbook rolesname.yml

    3、创建roles初始化系统

    (1)系统出书化的roles目录结构:

    [root@ansible-server ansible]# tree roles/
    roles/
    ├── init_system6
    │   ├── files
    │   │   └── zabbix-agent-3.0.9-1.el6.x86_64.rpm
    │   ├── tasks
    │   │   ├── init_system.yml
    │   │   ├── installpack.yaml
    │   │   ├── install_zabbixagent.yml
    │   │   └── main.yml
    │   ├── templates
    │   │   └── zabbix_agent.conf.j2
    │   └── vars
    │       └── main.yml
    └── initsystem.yml

    (2)各配置文件内容

     roles/initsystem.yml 中的内容:

    ---
    - hosts: 10.0.0.13
      remote_user: root
      roles: 
        - init_system

    roles/init_system/tasks/main.yml 中的内容:

        ---
         - include: init_system.yml
         - include: installpack.yaml
         - include: install_zabbixagent.yml

    roles/init_system/tasks/init_system.yml 中的内容(变量”servername”是配置在/etc/ansible/hosts中):

    ---
     - name: hostname
       hostname: name={{ servername }} 
     
     - name: disabled iptables
       service: name=iptables state=started enabled=no
     
     - name: shutdown selinux
       replace: dest=/etc/selinux/config regexp=^SELINUX=enforcing replace=SELINUX=disabled
       tags: selinux
     
     - name: install ntpdate
       yum: name=ntpdate state=present
     - name: lock-in time
       shell: ntpdate {{ timeserver }} && hwclock -w
     - name: crontab ntpdate
       cron: minute=1 hour=*/2 job='/usr/bin/ntpdate {{ timeserver }}' name=ntpdate
     
     - name: Change nofile limits.
       lineinfile: dest=/etc/security/limits.conf line={{ item }}
       with_items:
         - '* - nofile 65535'
         - '* soft nofile 65535'
         - '* hard nofile 65535'

    roles/init_system/tasks/installpack.yaml 中的内容:

    - name: Install RPM package
       yum: name={{ item }} state=present
       with_items:
        - gcc
        - gcc-c++
        - make
        - lrzsz
        - vim

    roles/init_system/tasks/install_zabbixagent.yml 中配置:

    ---
     - name: mkdir /tmp/tools
       shell: mkdir /tmp/tools -p
     - name: copy zabbix-agent
       copy: src=zabbix-agent-3.0.9-1.el6.x86_64.rpm dest=/tmp/tools/
     - name: install zabbix_agent
       yum: name=/tmp/tools/zabbix-agent-3.0.9-1.el6.x86_64.rpm state=present
     - name: configure zabbix_agent
       template: src=zabbix_agent.conf.j2 dest=/etc/zabbix/zabbix_agent.conf
     - name: start zabbix_agent
       service: name="zabbix-agent" state=started

    roles/init_system/vars/main.yml 中的内容:

    ---
    timeserver: time.windows.com

    roles/init_system/templates/zabbix_agent.conf.j2为zabbix的模板文件,其中部分配置了使用了模板

    [root@ansible-server ansible]# egrep ^Hostname roles/init_system/templates/zabbix_agent.conf.j2
    Hostname={{ servername }}

    4、ansible galaxy
          ansible galaxy主要用于管理galaxy.ansible.com上的roles,默认下载的roles存放在/etc/ansible/roles目录下,也可在ansible的配置文件中自动以存放目录。在ansible使用过程中,我们可以下载别人写好的roles直接使用,也可将自己的roles上传于galaxy.ansible.com上,在下载使用别人的roles前最好能将下载好的roles代码查看一遍,然后再去使用。

  • 相关阅读:
    Python学习笔记009_构造与析构
    Python学习笔记008_类_对象_继承_组合_类相关的BIF
    Python学习笔记007_图形用户界面[EasyGui][Tkinter]
    Python学习笔记006_异常_else_with
    Python学习笔记005_文件_OS_模块_pickle
    Python学习笔记004_字典_集合
    小甲鱼:Python学习笔记003_函数
    小甲鱼:Python学习笔记002_数组_元组_字符串
    Java数据库连接泄漏应对办法-基于Weblogic服务器
    java单点登录
  • 原文地址:https://www.cnblogs.com/songhuasheng/p/10415445.html
Copyright © 2011-2022 走看看