• ansible 角色的使用


    roles介绍

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

    角色的相关概念

    每个角色都是以特定的层级目录结构进行组织:

    files:
        存放由copy或script模块等调用的文件。
    
    templates:
        template模块查找所需要模板文件的目录。
    
    tasks:
        用于定义任务,至少应该包含一个名为main.yml的文件(类似于java和go等编译性语言,用于指定程序的入口),其他的文件需要在此文件中通过include进行包含。
    
    handlers:
        定义处理器,至少应该包含一个名为main.yml的文件,其他的文件需要在此文件中通过include进行包含。
    
    vars:
        定义变量,至少应该包含一个名为main.yml的文件,其他的文件需要在此文件中通过include进行包含。
    
    meta:
        定义元数据,至少应该包含一个名为main.yml的文件,定义当前角色的特殊设定及其依赖关系,其他的文件需要在此文件中通过include进行包含。
    
    default:
        设定模式变量时使用此目录中的main.yml文件。

    这是他的项目结构

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

    role存放的路径在配置文件ansible.cfg中定义

    roles_path = path/roles  (默认目录:/etc/ansible/roles)

    创建目录结构

    ansible-galaxy init apache(创建apache目录结构,即角色)
    ansible-galaxy role list  ##查看角色列表

     playbook中使用roles

    - playbook中使用roles:
        ---
        - hosts: server2
          roles:
            - role: role1
            - role: role2
              var1: value1        ##此处变量会覆盖roles中的定义变量
        ...

    控制任务执行顺序

    ---
    - hosts: server2
      roles:
        - role: role1    ##角色任务
      pre_tasks:        ##角色执行前执行的play
        - tasks1
      tasks:        ##普通任务
        - tasks2
      post_tasks:        ##在角色和普通任务执行完毕后执行的play
        - tasks3
      handlers:
    ...

    创建一个角色框架

     

    [root@RedHat roles]# ansible-galaxy init ceshi
    - Role ceshi was created successfully
    [root@RedHat roles]# tree
    .
    └── ceshi
        ├── defaults
        │   └── main.yml
        ├── files
        ├── handlers
        │   └── main.yml
        ├── meta
        │   └── main.yml
        ├── README.md
        ├── tasks
        │   └── main.yml
        ├── templates
        ├── tests
        │   ├── inventory
        │   └── test.yml
        └── vars
            └── main.yml
    
    9 directories, 8 files

     

     

     

     如果想在playbook中使用角色只需要

    ---
    - hosts: ***
        roles:  
          - role1 
          - role2

    创建简易的角色任务

    [root@RedHat roles]# tree      //在roles中创建ceshi角色
    .
    ├── ansible.cfg
    ├── ceshi
    │   ├── defaults
    │   │   └── main.yml
    │   ├── files
    │   ├── handlers
    │   │   └── main.yml
    │   ├── meta
    │   │   └── main.yml
    │   ├── README.md
    │   ├── tasks
    │   │   └── main.yml                      //任务写在这里
    │   ├── templates
    │   │   └── test.j2
    │   ├── tests
    │   │   ├── inventory
    │   │   └── test.yml
    │   └── vars
    │       └── main.yml
    ├── hosts
    ├── inventory
    └── test1.yml                             //test1.yml测试
    
    
    [root@RedHat roles]# cat test1.yml 
    ---
    - hosts: php
      roles: 
        - ceshi  
    
    [root@RedHat roles]# cat ceshi/tasks/main.yml 
    ---
    # tasks file for ceshi
    - debug:
        msg: "hello"   
    
    [root@RedHat roles]# ansible-playbook test1.yml   //执行结果
    
    PLAY [php] *******************************************************************************************
    
    TASK [Gathering Facts] *******************************************************************************
    ok: [php]
    
    TASK [ceshi : debug] *********************************************************************************
    ok: [php] => {
        "msg": "hello"
    }
    
    PLAY RECAP *******************************************************************************************
    php                        : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
    
    [root@RedHat roles]#

    通过变量更改角色行为

    编写良好的角色利用默认变量来改变角色行为,使之与相关的配置场景相符。这有助于让角色变得更为通用,可在各种不同的上下文中重复利用。

    如果通过以下方式定义了相同的变量,则角色的defaults目录中定义的变量的值将被覆盖:

    • 在清单文件中定义,作为主机变量或组变量
    • 在playbook项目的group_vars或host_vars目录下的YAML文件中定义
    • 作为变量嵌套在play的vars关键字中定义
    • 在play的roles关键字中包含该角色时作为变量定义

    创建test角色模板文件,引用Ansible事实和test_variable

    [root@RedHat roles]# cat ceshi/templates/test.j2     //使用模板变量测试 
    
    This is the system {{ ansible_facts['hostname'] }}.
    
    Today's date is: {{ ansible_facts['date_time']['date'] }}.
     
    ceshi   {{ ceshi_variable }}
    
    
    [root@RedHat roles]# cat ceshi/defaults/main.yml 
    ---
    # defaults file for ceshi
    ceshi_variable: apache
    
    [root@RedHat roles]# ansible-playbook test1.yml 
    
    PLAY [php] *******************************************************************************************
    
    TASK [Gathering Facts] *******************************************************************************
    ok: [php]
    
    TASK [ceshi : template] ******************************************************************************
    changed: [php]
    
    PLAY RECAP *******************************************************************************************
    php                        : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
    
    [root@RedHat roles]# ansible php -a "cat /opt/test"
    php | CHANGED | rc=0 >>
    This is the system RedHat.
    
    Today's date is: 2021-02-24.
     
    ceshi   apache

     

  • 相关阅读:
    flex,flashDevelop和gumbo编译器比较
    用侦听器的useCapture属性决定事件哪个阶段做处理
    关于显示对象的parent,stage属性的说明
    ASP.NET MVC 1.0 Result 几何?
    MVC Controller与ActionResult的返回值
    C# 可空类型和空接合运算符(??)
    C# 2.0新特性与C# 3.5新特性
    创建返回Excel的自定义ActionResult
    jQuery getJSON()函数及getScript()函数
    如何使用ASP.NET MVC的Filter
  • 原文地址:https://www.cnblogs.com/lichouluoyu/p/14438202.html
Copyright © 2020-2023  润新知