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

 

原文地址:https://www.cnblogs.com/lichouluoyu/p/14438202.html