• 27 roles


    Role

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

    运维复杂的场景:建议使用 roles,代码复用度高

    roles:多个角色的集合目录, 可以将多个的role,分别放至roles目录下的独立子目录中,如下示例

    roles/
     mysql/
     nginx/
     tomcat/
     redis/Copy to clipboardErrorCopied
    

    默认roles存放路径

    /root/.ansible/roles
    /usr/share/ansible/roles
    /etc/ansible/rolesCopy to clipboardErrorCopied
    

    Ansible Roles目录编排

    ├── nginx -------------role1名称
    │   ├── defaults  ---------必须存在的目录,存放默认的变量,模板文件中的变量就是引用自这里。defaults中的变量优先级最低,通常我们可以临时指定变量来进行覆盖
    │   │   └── main.yml
    │   ├── files -------------ansible中unarchive、copy等模块会自动来这里找文件,从而我们不必写绝对路径,只需写文件名
    │   │   ├── mysql.tar.gz
    │   │   └── nginx.tar.gz
    │   ├── handlers -----------存放tasks中的notify指定的内容
    │   │   └── main.yml
    │   ├── meta
    │   ├── tasks --------------存放playbook的目录,其中main.yml是主入口文件,在main.yml中导入其他yml文件,要采用import_tasks关键字,include要弃用了
    │   │   ├── install.yml
    │   │   └── main.yml -------主入口文件
    │   ├── templates ----------存放模板文件。template模块会将模板文件中的变量替换为实际值,然后覆盖到客户机指定路径上
    │   │   └── nginx.conf.j2
    │   └── varsCopy to clipboardErrorCopied
    

    Roles各目录作用

    • files/ :存放由copy或script模块等调用的文件

    • templates/:template模块查找所需要模板文件的目录

    • tasks/:定义task,role的基本元素,至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含

    • handlers/:至少应该包含一个名为main.yml的文件;此目录下的其它的文件需要在此文件中通过

    • include进行包含

    • vars/:定义变量,至少应该包含一个名为main.yml的文件;此目录下的其它的变量文件需要在此文件中通过include进行包含

    • meta/:定义当前角色的特殊设定及其依赖关系,至少应该包含一个名为main.yml的文件,其它文件需在此文件中通过include进行包含

    • default/:设定默认变量时使用此目录中的main.yml文件,比vars的优先级低

      创建role

    创建role的步骤

    1 创建以roles命名的目录
    2 在roles目录中分别创建以各角色名称命名的目录,如mysql等
    3 在每个角色命名的目录中分别创建files、handlers、tasks、templates和vars等目录;用不到的目录可以创建为空目录,也可以不创建
    4 在每个角色相关的子目录中创建相应的文件,如 tasks/main.yml,templates/nginx.conf.j2
    5 在playbook文件中,调用需要的角色
    
    [root@m01 package]# mkdir -p /root/package/roles/nginx/{files,handlers,tasks,templates,vars,meta}
    [root@m01 package]# tree
    .
    └── roles
        └── nginx
            ├── files
            ├── handlers
            ├── meta
            ├── tasks
            ├── templates
            └── vars
    Copy to clipboardErrorCopied
    

    针对大型项目使用Roles进行编排

    # 范例
    nginx-role.yml 
    roles/
    └── nginx 
         ├── files
         │   └── main.yml 
         ├── tasks
         │   ├── groupadd.yml 
         │   ├── install.yml 
         │   ├── main.yml 
         │   ├── restart.yml 
         │   └── useradd.yml 
         └── vars 
             └── main.ymlCopy to clipboardErrorCopied
    

    playbook调用角色

    • 调用角色方法1
    ---
    - hosts: web
      remote_user: root
      roles:
        - mysql
        - memcached
        - nginx  Copy to clipboardErrorCopied
    
    • 调用角色方法2
    ---
    - hosts: all
      remote_user: root
      roles:
        - mysql
        - { role: nginx, username: nginx }Copy to clipboardErrorCopied
    
    • 调用角色方法3
    ---
    - hosts: all
      remote_user: root
      roles:
        - { role: nginx, username: nginx, when: ansible_distribution_major_version == '7' }Copy to clipboardErrorCopied
    
    • 调用角色方法4
    ---
    - hosts: appsrvs
      remote_user: root
      roles:
        - { role: nginx ,tags: [ 'nginx', 'web' ] ,when: ansible_distribution_major_version == "6" }
        - { role: httpd ,tags: [ 'httpd', 'web' ] }
        - { role: mysql ,tags: [ 'mysql', 'db' ] }
        - { role: mariadb ,tags: [ 'mariadb', 'db' ] }Copy to clipboardErrorCopied
    

    案例

    httpd角色

    #创建角色相关的目录
    [root@ansible ~]#mkdir -pv /data/ansible/roles/httpd/{tasks,handlers,files}
      
    #创建角色相关的文件
    [root@ansible ~]#cd /data/ansible/roles/httpd/
    
    #main.yml 是task的入口文件
    [root@ansible ~]#vim tasks/main.yml
    - include: group.yml
    - include: user.yml
    - include: install.yml
    - include: config.yml
    - include: index.yml
    - include: service.yml
    
    [root@ansible ~]#vim tasks/group.yml
    - name: create apache group
      group: name=apache system=yes gid=80
      
    [root@ansible ~]#vim tasks/user.yml
    - name: create apache user
      user: name=apache system=yes shell=/sbin/nologin home=/var/www/ uid=80 group=apache
      
    [root@ansible ~]#vim tasks/install.yml
    - name: install httpd package
      yum: name=httpd
    [root@ansible ~]#vim tasks/config.yml
    - name: config file
      copy: src=httpd.conf dest=/etc/httpd/conf/ backup=yes
      notify: restart
    [root@ansible ~]# tasks/index.yml
    - name: index.html
      copy: src=index.html dest=/var/www/html/
    [root@ansible ~]#vim tasks/service.yml
    - name: start service
      service: name=httpd state=started enabled=yes
    [root@ansible ~]#vim handlers/main.yml
    - name: restart
      service: name=httpd state=restarted
      
    #在files目录下准备两个文件
    [root@ansible ~]#ls files/
    httpd.conf index.html
    [root@ansible ~]#tree /data/ansible/roles/httpd/
    /data/ansible/roles/httpd/
    ├── files
    │   ├── httpd.conf
    │   └── index.html
    ├── handlers
    │   └── main.yml
    └── tasks
       ├── config.yml
       ├── group.yml
       ├── index.yml
       ├── install.yml
       ├── main.yml
       ├── service.yml
       └── user.yml
    3 directories, 10 files
    #在playbook中调用角色
    [root@ansible ~]#vim /data/ansible/role_httpd.yml
    ---
    # httpd role
    - hosts: websrvs
      remote_user: root
      roles:
        - httpd
        
    #运行playbook
    [root@ansible ~]#ansible-playbook /data/ansible/role_httpd.ymlCopy to clipboardErrorCopied
    

    NGINX角色

    [root@ansible ~]#mkdir -pv /data/ansible/roles/nginx/{tasks,handlers,templates,vars}
    
    #创建task文件
    [root@ansible ~]#cd /data/ansible/roles/nginx/
    [root@ansible nginx]#vim tasks/main.yml 
    - include: install.yml
    - include: config.yml
    - include: index.yml
    - include: service.yml
    [root@ansible nginx]#vim tasks/install.yml 
    - name: install
      yum: name=nginx 
     
    [root@ansible nginx]#vim tasks/config.yml 
    - name: config file for centos7
      template: src=nginx7.conf.j2 dest=/etc/nginx/nginx.conf
      when: ansible_distribution_major_version=="7"
      notify: restart
    - name: config file for centos8
      template: src=nginx8.conf.j2 dest=/etc/nginx/nginx.conf
      when: ansible_distribution_major_version=="8"
      notify: restart
      
    #跨角色调用文件
    [root@ansible nginx]#vim tasks/index.yml 
    - name: index.html
      copy: src=roles/httpd/files/index.html dest=/usr/share/nginx/html/
    [root@ansible nginx]#vim tasks/service.yml 
    - name: start service
      service: name=nginx state=started enabled=yes
    #创建handler文件
    [root@ansible nginx]#cat handlers/main.yml 
    - name: restart
      service: name=nginx state=restarted
    #创建两个template文件
    [root@ansible nginx]#cat templates/nginx7.conf.j2
    ...省略...
    user {{user}};
    worker_processes {{ansible_processor_vcpus+3}};   #修改此行
    error_log /var/log/nginx/error.log;
    pid /run/nginx.pid;
    ...省略...
    [root@ansible nginx]#cat templates/nginx8.conf.j2
    ...省略...
    user nginx;
    worker_processes {{ansible_processor_vcpus**3}};  #修改此行
    error_log /var/log/nginx/error.log;
    pid /run/nginx.pid;
    ...省略...
    #创建变量文件
    [root@ansible nginx]#vim vars/main.yml 
    user: daemon
    #目录结构如下
    [root@ansible ~]#tree /data/ansible/roles/nginx/
    /data/ansible/roles/nginx/
    ├── handlers
    │   └── main.yml
    ├── tasks
    │   ├── config.yml
    │   ├── file.yml
    │   ├── install.yml
    │   ├── main.yml
    │   └── service.yml
    ├── templates
    │   ├── nginx7.conf.j2
    │   └── nginx8.conf.j2
    └── vars
       └── main.yml
    4 directories, 9 files
    #在playbook中调用角色
    [root@ansible ~]#vim /data/ansible/role_nginx.yml 
    ---
    #nginx role 
    - hosts: web
     roles:
        - role: nginx
        
    #运行playbook
    [root@ansible ~]#ansible-playbook /data/ansible/role_nginx.yml
    

    创建Nginx的roles

    # 创建初始文件
    [root@m01 roles]# ansible-galaxy init nginx
    - Role nginx was created successfully
    
    # 查看目录层级结构
    baim0/
    └── roles
        └── nginx
            ├── defaults
            │   └── main.yml
            ├── files
            ├── handlers
            │   └── main.yml
            ├── meta
            │   └── main.yml
            ├── README.md
            ├── tasks
            │   └── main.yml
            ├── templates
            ├── tests
            │   ├── inventory
            │   └── test.yml
            └── vars
                └── main.yml
    
    # 
    
  • 相关阅读:
    logstash 字段引用
    Filter Conditions 过滤条件
    Not found org.springframework.http.converter.json.MappingJacksonHttpMessageConve
    rsyslog Properties
    rsyslog 模板
    rsyslog 基本结构
    awk RS ORS
    elasticsearch分布式特点
    spring事物配置,声明式事务管理和基于@Transactional注解的使用
    myBatis:事务管理
  • 原文地址:https://www.cnblogs.com/zhaokunhao/p/14856439.html
Copyright © 2020-2023  润新知