zoukankan      html  css  js  c++  java
  • linux中级之ansible配置(roles)

    一、roles介绍

    什么情况下用到roles

    假如我们现在有3个被管理主机,第一个要配置成httpd,第二个要配置成php服务器,第三个要配置成MySQL服务器。我们如何来定义playbook

    第一个play用到第一个主机上,用来构建httpd,第二个play用到第二个主机上,用来构建php,第三个play用到第三个主机上,用来构建MySQL。这些个play定义在playbook中比较麻烦,将来也不利于模块化调用,不利于多次调。比如说后来又加进来一个主机,这个第4个主机既是httpd服务器,又是php服务器,我们只能写第4play,上面写上安装httpdphp。这样playbook中的代码就重复了。

    也就是说playbooks的所有的方式有个弊端---无法实现重复使用且代码重复;假设在同时部署httpd,php,mayql时或不同服务器组合不同的应用就需要写多个yaml文件。很难实现灵活的调用。

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

    二、角色集合

    角色集合:roles/

    phpserver/

    webserver/

    mysqlserver/

    files/:存储由copyscript等模块调用的文件;src直接指定文件名称,不需要写绝对路径;

    tasks/:此目录中至少应该有一个名为main.yaml的文件,用于定义各task;其它的文件需要由main.yaml进行“包含”调用;

    handlers/:此目录中至少应该有一个名为main.yaml的文件,用于定义各handler;其它的文件需要由main.yaml进行“包含”调用;

    vars/:此目录中至少应该有一个名为main.yaml的文件,用于定义各variable;其它的文件需要由main.yaml进行“包含”调用;

    templates/:存储由template模块调用的模板文本;src只写文件名即可,不需要写绝对路径;

    meta/:此目录中至少应该有一个名为main.yaml的文件,定义当前角色的特殊设定及其依赖关系;其它的文件需要由main.yaml进行“包含”调用;

    default/:此目录中至少应该有一个名为main.yaml的文件,用于设定默认变量;

    site.yaml:入站文件(站点文件),用于调用roles中的角色,一般创建在roles目录下,和角色同级;也可在roles同级目录下创建playbook执行文件(yaml)

    三、角色定制实例

    1、在roles目录下生成对应的目录结构

    [root@ren6 ~]# mkdir -pv ansible/roles/{webserver,phpserver,mysqlserver}/{files,tasks,vars,templates,handlers}

    [root@ren6 ansible]# tree

     

    2、配置角色(webserver

    1)配置files文件:将httpd配置文件上传到files目录下(线配置一台主机)

    [root@ren6 ~]# cp /etc/httpd/conf/httpd.conf ansible/roles/webserver/files/httpd.conf

    2)编写tasks任务列表

    [root@ren6 ~]# vim ansible/roles/webserver/tasks/main.yaml

     1 - name: install httpd
     2   yum: name=httpd state=present
     3   ignore_errors: yes
     4 - name: copy httpd.conf
     5   copy: src=httpd.conf dest=/etc/httpd/conf/httpd.conf
     6   tags:
     7   - conf
     8   notify:
     9   - restart httpd
    10 - name: start httpd
    11   service: name=httpd state=started
    12 - name: echo http_port
    13   shell: echo {{ http_port }} > /root/port.txt

    3)由于上面的tasks中定义了notify,所以要定义handlers

    [root@ren6 ~]# vim ansible/roles/webserver/handlers/main.yaml

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

    4tasks中定义了变量,需要在vars目录下创建main.yaml文件,并在文件中写入变量,以key: value的形式定义

    [root@ren6 ~]# vim ansible/roles/webserver/vars/main.yaml

    http_port: 88

    5)在roles下编辑站点文件site.yaml

    [root@ren6 ~]# vim ansible/roles/site.yaml

    1 ---
    2 - hosts: 192.168.11.4
    3   remote_user: root
    4   roles:
    5   - webserver

    6)语法检测及模拟运行

    [root@ren6 ~]# ansible-playbook --syntax-check ansible/roles/site.yaml

    [root@ren6 ~]# ansible-playbook -C ansible/roles/site.yaml

    7)使用模板文件templates ,复制httpd的配置文件至templates目录下

    [root@ren6 ~]# cp /etc/httpd/conf/httpd.conf ansible/roles/webserver/templates/

    8)编辑templates文件

    [root@ren6 ~]# vim ansible/roles/webserver/templates/httpd.conf

    Listen {{ http_port }}

    9)修改tasks文件

    [root@ren6 ~]# vim ansible/roles/webserver/tasks/main.yaml

    - name: install httpd
      yum: name=httpd state=present
      ignore_errors: yes
    - name: copy httpd.conf
      template: src=httpd.conf dest=/etc/httpd/conf/httpd.conf
      tags:
      - conf_vars
      notify:
      - restart httpd
    - name: start httpd
      service: name=httpd state=started

    10)修改站点文件

    [root@ren6 ~]# vim ansible/roles/site.yaml

    1 ---
    2 - hosts: test1
    3   remote_user: root
    4   roles:
    5   - webserver

    11)修改主机信息管理文件

    [root@ren6 ~]# vim /etc/ansible/hosts

    1 [test1]
    2 192.168.11.5 ansible_ssh_user=root ansible_ssh_pass=root ansible_ssh_port=22 http_port=81
    3 192.168.11.4 ansible_ssh_user=root ansible_ssh_pass=root ansible_ssh_port=22 http_port=82

    12)语法检测及运行

    [root@ren6 ~]# ansible-playbook --syntax-check ansible/roles/site.yaml

    [root@ren6 ~]# ansible-playbook ansible/roles/site.yaml

    PLAY [test1] *************************************************************************************************************************
    
    TASK [Gathering Facts] ***************************************************************************************************************
    ok: [192.168.11.5]
    ok: [192.168.11.4]
    
    TASK [webserver : install httpd] *****************************************************************************************************
    ok: [192.168.11.5]
    ok: [192.168.11.4]
    
    TASK [webserver : copy httpd.conf] ***************************************************************************************************
    changed: [192.168.11.5]
    changed: [192.168.11.4]
    
    TASK [webserver : start httpd] *******************************************************************************************************
    changed: [192.168.11.4]
    changed: [192.168.11.5]
    
    RUNNING HANDLER [webserver : restart httpd] ******************************************************************************************
    changed: [192.168.11.4]
    changed: [192.168.11.5]
    
    PLAY RECAP ***************************************************************************************************************************
    192.168.11.4               : ok=5    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
    192.168.11.5               : ok=5    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

     四、注意

    1、在tasks文件下可以创建多个yaml文件,但roles只会调用main.yaml文件,所以可以用include关键字来调用其他yaml文件(- include_tasks: a.yaml)

    2、roles目录下的角色名称可以随意起,不过,最好和其功能联系在一起

    3、角色下的几个目录名称必须正确,s必须加上(files,tasks,vars,templates,handlers)

    4、站点文件(site.yaml)内可以定义多个hosts,每个hosts下可以调用多个角色

  • 相关阅读:
    谈谈Nginx有哪些特点
    网站嵌入百度地图制作
    8张图理解Java
    linux问题-easy_install安装bpython时报错
    linux问题-Centos 安装Sublime text 3
    python例子-Nmap扫描IP并更新
    python例子-PyQuery抓取信息.
    python例子-MySQLdb和练习题
    python例子-线程和队列
    mysql问题-centos7中mysql远程连接问题
  • 原文地址:https://www.cnblogs.com/renyz/p/11418658.html
Copyright © 2011-2022 走看看