Ansible(八)——角色

标准角色结构

[root@wzy roles]#tree example/
example/
├── defaults
│   └── main.yml
├── files
├── handlers
│   └── main.yml
├── meta
│   └── main.yml
├── README.md
├── tasks
│   └── main.yml
├── templates
├── tests
│   ├── inventory
│   └── test.yml
└── vars
    └── main.yml

8 directories, 8 files

角色目录

目录说明
defaults此目录中main.yml文件包含角色变量默认值,使用角色时可以覆盖。优先级较低,在playbook中应更改和自定义
files此目录包含角色任务引用的静态文件
handlers此目录中的main.yml文件包含角色的处理程序定义
meta此目录中的main.yml文件包含与角色相关的信息,如作者、平台等
tasks此目录中的main.yml文件包含角色的任务定义
templates此目录包含由角色任务引用的Jinja2模板
tests此目录可包含清单和test.yml。测试角色
vars此目录中的main.yml文件定义角色的变量值。这些变量通常用于角色内部。优先级较高,在playbook中使用不应更改

示例

#在playbook中调用roleone角色和roletwo角色
---
- name:
  hosts: all 
  roles:
    - roleone
    - roletwo

# 如果设置roletwo的两个角色变量var1和var2的值,则使用roletwo时,任何defaults和vars变量都会被覆盖
---
- name:
  hosts: all 
  roles:
    - roleone
    - roletwo
      var1: one
      var2: two

pre_task和post_task

pre_task:列在此部分的所有任务将在执行任何角色前执行,如果这些任务中有任何一个通知了处理程序,则处理程序也在角色和普通任务执行前执行

post_task:列在此部分的所有任务将在play的普通任务和普通任务通知的任何处理程序运行之后运行。

示例

[root@wzy ansible]#vim prepost.yml 
---
- name: 
  hosts: AA 
  pre_tasks: 
    - name: 
      shell: 
        cmd: echo This is pre_tasks
      register: result1
      notify: my handler 
   
    - name: 
      debug: 
        msg: "{{ result1.stdout }}"  
  
  roles: 
    - roleone
 
  #同一个tasks里面调用多次handlers,仅会触发一次handlers。一个tasks对应一个handlers且仅会调用自己的handlers

  tasks: 
    - name: 
      shell: 
        cmd: echo This is tasks1
      register: result2
      notify: my handler 
   
    - name: 
      debug: 
        msg: "{{ result2.stdout }}"
  
    - name: 
      shell: 
        cmd: echo This is tasks2
      register: result3
      notify: my handler

    - name: 
      debug: 
        msg: "{{ result3.stdout }}"

  post_tasks: 
    - name: 
      shell: 
        cmd: echo This is post_tasks
      register: result4
      notify: my handler

    - name: 
      debug: 
        msg: "{{ result4.stdout }}"
    
      notify: my handler 

  #位置一
  handlers: 
    - name: my handler
      debug: 
        msg: echo This is my handler

#因为不是同一个tasks,此tasks无法调用上方的handlers,所以下方执行结果会报错not found
- name: 
  hosts: BB 
  tasks: 
    - name: 
      shell: 
        cmd: echo This is tasks3
      register: result5
      notify: my handler

    - name: 
      debug: 
        msg: "{{ result5.stdout }}"
       
#位置二。如果把位置一的handlers注释掉,此处启用。则上个tasks在pre_tasks处就会报错not found
# handlers: 
#   - name: my handler
#     debug: 
#       msg: echo This is my handler

[root@wzy ansible]#ansible-playbook prepost.yml 

PLAY [AA] ************************************************************************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************************************************************
ok: [192.168.29.142]

TASK [shell] *********************************************************************************************************************************************************
changed: [192.168.29.142]

TASK [debug] *********************************************************************************************************************************************************
ok: [192.168.29.142] => {
    "msg": "This is pre_tasks"
}

RUNNING HANDLER [my handler] *****************************************************************************************************************************************
ok: [192.168.29.142] => {
    "msg": "echo This is my handler"
}

TASK [roleone : debug] ***********************************************************************************************************************************************
ok: [192.168.29.142] => {
    "msg": "This is roleone content"
}

TASK [shell] *********************************************************************************************************************************************************
changed: [192.168.29.142]

TASK [debug] *********************************************************************************************************************************************************
ok: [192.168.29.142] => {
    "msg": "This is tasks1"
}

TASK [shell] *********************************************************************************************************************************************************
changed: [192.168.29.142]

TASK [debug] *********************************************************************************************************************************************************
ok: [192.168.29.142] => {
    "msg": "This is tasks2"
}

RUNNING HANDLER [my handler] *****************************************************************************************************************************************
ok: [192.168.29.142] => {
    "msg": "echo This is my handler"
}

TASK [shell] *********************************************************************************************************************************************************
changed: [192.168.29.142]

TASK [debug] *********************************************************************************************************************************************************
ok: [192.168.29.142] => {
    "msg": "This is post_tasks"
}

RUNNING HANDLER [my handler] *****************************************************************************************************************************************
ok: [192.168.29.142] => {
    "msg": "echo This is my handler"
}

PLAY [BB] ************************************************************************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************************************************************
ok: [192.168.29.143]

TASK [shell] *********************************************************************************************************************************************************
ERROR! The requested handler 'my handler' was not found in either the main handlers list nor in the listening handlers list

在普通任务中调用角色

include_role:可以动态包含角色(ansible2.3新增)

import_role:可静态导入角色(ansible2.4新增)

示例

[root@wzy ansible]#vim prepost.yml 
---
- name: 
  hosts: AA 
  tasks: 
    - name: 
      debug: 
        msg: "This is tasks 1" 
    - name: 
      include_role: roleone

系统角色

安装系统角色

yum -y install rhel-system-roles.noarch

安装后系统角色位于/usr/share/ansible/roles目录

每个角色的文档目录均包含一个README.md文件。即帮助文档

RHEL系统角色

名称状态角色描述
rhel-system-roles.kdump全面支持配置kdump崩溃恢复服务
rhel-system-roles.network全面支持配置网络接口
rhel-system-roles.selinux全面支持配置和管理SElinux自定义,包括SElinux模式、文件和端口上下文、布尔值设置,SElinux用户
rhel-system-roles.timesync全面支持使用网络时间协议或精确时间协议配置时间同步
rhel-system-roles.postfix技术预览使用postfix服务将每个主机配置为邮件传输代理
rhel-system-roles.firewall开发中配置主机防火墙
rhel-system-roles.tuned开发中配置tuned服务,系统调优

使用系统角色

使用时间同步角色

安装 RHEL 系统角色软件包,并创建符合以下条件的 playbook timesync.yml :

在所有受管节点上运行

使用 timesync 角色

配置该角色,以使用当前有效的 NTP 提供商

配置该角色,以使用时间服务器 classroom.example.com

配置该角色,以启用 iburst 参数

#安装角色
sudo yum -y install rhel-system-roles.noarch
#复制安装的角色到 ~/ansible/roles/
cp -r /usr/share/ansible/roles/rhel-system-roles.timesync/ /home/student/ansible/roles/timesync
#编写playbook,可参考README.md
vim timesync.yml
---
- name: set time sync
  hosts: all
  vars: 
    timesync_ntp_servers:
      - hostname: ntp.aliyun.com
        iburst: yes
  roles:
    - timesync
#执行剧本
ansible-playbook timesync.yml

自定义角色

创建和使用角色三个步骤:

一、创建角色目录结构。

[root@wzy ansible]#cd roles/
[root@wzy roles]#ansible-galaxy init examrole   
- Role examrole was created successfully
[root@wzy roles]#tree examrole/
examrole/
├── defaults
│   └── main.yml
├── files
├── handlers
│   └── main.yml
├── meta
│   └── main.yml
├── README.md
├── tasks
│   └── main.yml
├── templates
├── tests
│   ├── inventory
│   └── test.yml
└── vars
    └── main.yml

8 directories, 8 files

二、定义角色内容

[root@wzy roles]#vim examrole/tasks/main.yml 
---
# tasks file for examrole
- name:
  debug:
    msg: "This is examrole"

三、在playbook中使用角色

[root@wzy role]#cd /root/ansible/
[root@wzy ansible]#vim examrole.yml
---
- name:
  hosts: AA
  roles:
    - examrole
[root@wzy ansible]#ansible-playbook examrole.yml 

PLAY [AA] *******************************************************************************************************************************************************************************

TASK [Gathering Facts] ******************************************************************************************************************************************************************
ok: [192.168.29.142]

TASK [examrole : debug] *****************************************************************************************************************************************************************
ok: [192.168.29.142] => {
    "msg": "This is examrole"
}

PLAY RECAP ******************************************************************************************************************************************************************************
192.168.29.142             : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

通过变量更改角色行为

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

一、在清单文件中定义,作为主机变量或组变量

二、在playbook项目的group_vars或host_vars目录下的yml文件中定义

三、作为变量嵌套在play的vars关键字中定义

四、在play的roles关键字中包含该角色时作为变量定义

使用ansible-galaxy部署角色

ansible-galaxy公共资源库:https://galaxy.ansible.com

从命令行搜索角色

ansible-galaxy search 'timesync'

从命令行查看角色信息

ansible-galaxy info 'linux-system-roles.timesync'

安装角色

ansible-galaxy install rolename -p 安装位置

根据文件安装角色

可在roles/requirements.yml文件中指定所需角色。

ansible-galaxy install -r rolename -p 安装位置

示例

#要求文件
vim roles/requirements.yml
 
---
- name: balancer
  src: http://content.example.com/haproxy.tar.gz
 
- name: phpinfo
  src: http://content.example.com/phpinfo.tar.gz
 
#执行playbook
ansible-galaxy install -r /home/student/ansible/roles/requirements.yml -p /home/student/ansible/roles/

列出本地找到的角色

ansible-galaxy list

删除本地角色

ansible-galaxy remove nginx-acme-ssh

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值