ansible的roles介绍和实战

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

创建 roles 的步骤

(1) 创建以roles命名的目录;
(2) 在roles目录中分别创建以各角色名称命名的目录,如webservers等。注意:在 roles 必须包括 site.yml文件,可以为空;
(3) 在每个角色命名的目录中分别创建files、handlers、meta、tasks、templates和vars目录;用不到的目录可以创建为空目录,也可以不创建;
(4) 在playbook文件中,调用各角色;

roles 内各目录中可用的文件

tasks目录:至少应该包含一个名为main.yml的文件,其定义了此角色的任务列表;此文件可以使用include包含其它的位于此目录中的task文件;
files目录:存放由copy或script等模块调用的文件;
templates目录:template模块会自动在此目录中寻找Jinja2模板文件;
handlers目录:此目录中应当包含一个main.yml文件,用于定义此角色用到的各handler;在handler中使用include包含的其它的handler文件也应该位于此目录中;
vars目录:应当包含一个main.yml文件,用于定义此角色用到的变量;
meta目录:应当包含一个main.yml文件,用于定义此角色的特殊设定及其依赖关系;ansible 1.3及其以后的版本才支持;
default目录:为当前角色设定默认变量时使用此目录;应当包含一个main.yml文件。

示例 一 、

分别创建三个 role ,分别为 http mysql php,创建要使用的目录,一般为全部创建,使用不到的可以为空,

测试主机 1 安装 httpd

测试主机 2 安装 mysql

测试主机 3 安装 http mysql php

1、

创建目录

[[email protected] ansible_playbooks]# pwd
/opt/ansible_playbooks
[[email protected] ansible_playbooks]# ls
hosts
[[email protected] ansible_playbooks]# mkdir -pv roles/{http,mysql,php}/{tasks,handlers,files,vars,templates,meta,default}

2、测试主机为:

[[email protected] ansible_playbooks]# cat hosts
[http]
192.168.100.131
[mysql]
192.168.100.132
[lamp]
192.168.100.130
[[email protected] ansible_playbooks]#

3、编辑 role http 任务文件

[[email protected] roles]# pwd
/opt/ansible_playbooks/roles
[[email protected] roles]# tree http
http
├── default
├── files
│   └── httpd.conf
├── handlers
│   └── main.yml
├── meta
├── tasks
│   └── main.yml
├── templates
│   └── httpd.conf
└── vars
    └── main.yml

7 directories, 5 files
[[email protected] roles]#

tasks 任务列表

[[email protected] roles]# cat http/tasks/main.yml 
- name: install httpd service
  yum: name=httpd state=present
- name: start httpd service
  service: name=httpd state=started enabled=true
- name: modify httpd config file from template  
  template: src=httpd.conf dest=/etc/httpd/conf/httpd.conf
  tags:
   - modifyhttpconf
  notify:
   - restart httpd service

[[email protected] roles]#

handlers

[[email protected] roles]# cat http/handlers/main.yml 
- name: restart httpd service
  service: name=httpd state=restarted
[[email protected] roles]#

files 和 templates 下的文件差别如下,这里只是为了演示 vars 的作用

[[email protected] roles]#  diff http/files/httpd.conf http/templates/httpd.conf 
136c136
< Listen 8090
---
> Listen {{listen.0}}:{{listen.1}}
277c277
< 
---
>  ServerName {{host_fqdn.0}}
[[email protected] roles]#

vars

[[email protected] roles]# cat http/vars/main.yml 
listen:
  - "{{ansible_all_ipv4_addresses.0}}"
  - 8080
host_fqdn:
  - "{{ansible_nodename}}"
[[email protected] roles]#

这里的 hostname 和 address 其实可以直接使用 setup 变量,这里这样做是为了演示 vars 的用法

4、编辑 role mysql 任务文件

[[email protected] roles]# pwd
/opt/ansible_playbooks/roles
[[email protected] roles]# tree mysql
mysql
├── default
├── files
│   └── my.cnf
├── handlers
│   └── main.yml
├── meta
├── tasks
│   └── main.yml
├── templates
│   └── my.cnf
└── vars
    └── main.yml

7 directories, 5 files
[[email protected] roles]#

tasks:

[[email protected] roles]# cat mysql/tasks/main.yml 
- name: install mysql-server package
  yum: name=mysql-server state=present
- name: start mysqld service
  service: name=mysqld state=started enabled=true
- name: copy my.cnf to remote host
  template: src=my.cnf dest=/etc/my.cnf
  tags:
   - modifymycnf
  notify:
   restart mysqld service
[[email protected] roles]#

handlers:

[[email protected] roles]# cat mysql/handlers/main.yml 
- name: restart mysqld service
  service: name=mysqld state=restarted
[[email protected] roles]#

files 和 templates 下的 my.cnf 差别如下  (templates 下的多了两个配置项,其中一个引用了 vars 的变量文件)

[[email protected] roles]# diff mysql/files/my.cnf mysql/templates/my.cnf 
1a2,3
> port=3306
> bind-address={{host_ip.0}}
[[email protected] roles]#

vars:

[[email protected] roles]# cat mysql/vars/main.yml 
host_ip:
  - "{{ansible_all_ipv4_addresses.0}}"
[[email protected] roles]#

5、编辑 role php 任务文件

[[email protected] roles]# cat php/tasks/main.yml 
-name: install php package
 yum: name=php state=present

6、开始执行

[[email protected] ansible_playbooks]# ansible-playbook -i hosts site.yml 

PLAY [http] ******************************************************************* 

GATHERING FACTS *************************************************************** 
ok: [192.168.100.131]

TASK: [http | install httpd service] ****************************************** 
changed: [192.168.100.131]

TASK: [http | start httpd service] ******************************************** 
changed: [192.168.100.131]

TASK: [http | modify httpd config file from template] ************************* 
changed: [192.168.100.131]

NOTIFIED: [http | restart httpd service] ************************************** 
changed: [192.168.100.131]

PLAY [mysql] ****************************************************************** 

GATHERING FACTS *************************************************************** 
ok: [192.168.100.132]

TASK: [mysql | install mysql-server package] ********************************** 
changed: [192.168.100.132]

TASK: [mysql | start mysqld service] ****************************************** 
changed: [192.168.100.132]

TASK: [mysql | copy my.cnf to remote host] ************************************ 
ok: [192.168.100.132]

PLAY [lamp] ******************************************************************* 

GATHERING FACTS *************************************************************** 
ok: [192.168.100.130]

TASK: [http | install httpd service] ****************************************** 
changed: [192.168.100.130]

TASK: [http | start httpd service] ******************************************** 
changed: [192.168.100.130]

TASK: [http | modify httpd config file from template] ************************* 
changed: [192.168.100.130]

TASK: [mysql | install mysql-server package] ********************************** 
changed: [192.168.100.130]

TASK: [mysql | start mysqld service] ****************************************** 
changed: [192.168.100.130]

TASK: [mysql | copy my.cnf to remote host] ************************************ 
changed: [192.168.100.130]

TASK: [php | install php package] ********************************************* 
changed: [192.168.100.130]

NOTIFIED: [http | restart httpd service] ************************************** 
changed: [192.168.100.130]

NOTIFIED: [mysql | restart mysqld service] ************************************ 
changed: [192.168.100.130]

PLAY RECAP ******************************************************************** 
192.168.100.130            : ok=10   changed=9    unreachable=0    failed=0   
192.168.100.131            : ok=5    changed=4    unreachable=0    failed=0   
192.168.100.132            : ok=4    changed=2    unreachable=0    failed=0   

[[email protected] ansible_playbooks]#

查看结果

[[email protected] ansible_playbooks]#  ansible -i hosts all -m shell -a ‘netstat -natpl |grep httpd‘
192.168.100.131 | success | rc=0 >>
tcp        0      0 192.168.100.131:8080        0.0.0.0:*                   LISTEN      14662/httpd         

192.168.100.132 | FAILED | rc=1 >>

192.168.100.130 | success | rc=0 >>
tcp        0      0 192.168.100.130:8080        0.0.0.0:*                   LISTEN      11127/httpd         

[[email protected] ansible_playbooks]#  ansible -i hosts all -m shell -a ‘netstat -natpl |grep mysqld‘
192.168.100.131 | FAILED | rc=1 >>

192.168.100.132 | success | rc=0 >>
tcp        0      0 192.168.100.132:3306        0.0.0.0:*                   LISTEN      61783/mysqld        

192.168.100.130 | success | rc=0 >>
tcp        0      0 192.168.100.130:3306        0.0.0.0:*                   LISTEN      11388/mysqld        

[[email protected] ansible_playbooks]#

还可以进行 when 判断:

[[email protected] ansible_playbooks]# cat hosts
[http]
192.168.100.131
[mysql]
192.168.100.132
192.168.100.131
[lamp]
192.168.100.130

[[email protected] ansible_playbooks]# cat site.yml 
- hosts: mysql
  remote_user: root
  roles:
   - { role: mysql, when: "ansible_nodename == ‘v3.lansgg.com‘"}

执行结果:可以看到不满足条件的 skipping

[[email protected] ansible_playbooks]# ansible-playbook -i hosts site.yml 

PLAY [mysql] ****************************************************************** 

GATHERING FACTS *************************************************************** 
ok: [192.168.100.131]
ok: [192.168.100.132]

TASK: [mysql | install mysql-server package] ********************************** 
skipping: [192.168.100.131]
changed: [192.168.100.132]

TASK: [mysql | start mysqld service] ****************************************** 
skipping: [192.168.100.131]
changed: [192.168.100.132]

TASK: [mysql | copy my.cnf to remote host] ************************************ 
skipping: [192.168.100.131]
ok: [192.168.100.132]

PLAY RECAP ******************************************************************** 
192.168.100.131            : ok=1    changed=0    unreachable=0    failed=0   
192.168.100.132            : ok=4    changed=2    unreachable=0    failed=0

7、也可以在 传递变量

[[email protected] ansible_playbooks]# cat site.yml 
- hosts: http
  remote_user: root
  roles:
   - { role: http, http_port: 2020,ServerName: "{{ansible_nodename}}"}
[[email protected] ansible_playbooks]#

tasks:

[[email protected] ansible_playbooks]# cat roles/http/tasks/main.yml 
- name: install httpd service
  yum: name=httpd state=present
- name: start httpd service
  service: name=httpd state=started enabled=true
- name: modify httpd config file from template  
  template: src=httpd.conf dest=/etc/httpd/conf/httpd.conf
  tags:
   - modifyhttpconf
  notify:
   - restart httpd service

[[email protected] ansible_playbooks]#

template 文件变量部分:

[[email protected] ansible_playbooks]# grep Listen roles/http/templates/httpd.conf  |grep -v  ^#
Listen {{listen.0}}:{{http_port}}
[[email protected] ansible_playbooks]# grep ServerName roles/http/templates/httpd.conf  |grep -v  ^#
 ServerName {{ServerName}}
[[email protected] ansible_playbooks]#

执行结果:

[[email protected] ansible_playbooks]# ansible-playbook -i hosts site.yml 

PLAY [http] ******************************************************************* 

GATHERING FACTS *************************************************************** 
ok: [192.168.100.131]

TASK: [http | install httpd service] ****************************************** 
changed: [192.168.100.131]

TASK: [http | start httpd service] ******************************************** 
changed: [192.168.100.131]

TASK: [http | modify httpd config file from template] ************************* 
changed: [192.168.100.131]

NOTIFIED: [http | restart httpd service] ************************************** 
changed: [192.168.100.131]

PLAY RECAP ******************************************************************** 
192.168.100.131            : ok=5    changed=4    unreachable=0    failed=0
时间: 2024-10-05 01:49:37

ansible的roles介绍和实战的相关文章

自动化运维工具ansible 角色Roles介绍(三)

一.角色(roles)介绍角色定制:roles 对于以上所有的方式有个弊端就是无法实现复用假设在同时部署Web.db.ha 时或不同服务器组合不同的应用就需要写多个yml文件.很难实现灵活的调用. roles 用于层次性.结构化地组织playbook.roles 能够根据层次型结构自动装载变量文件.tasks以及handlers等.要使用 roles只需要在playbook中使用include指令即可.简单来讲,roles就是通过分别将变量(vars).文件(file).任务(tasks).模块

ansible的playbook介绍和实战

1.playbook 介绍: 简单的说就是定义一个配置文件,文件中写入你需要安装的服务,配置文件,变量等信息,使他们可以按照事先定义好的机制完成一个任务. Playbook使用YAML语法结构,所以配置阅读起来都比较简单. 2.playbook 的组成结构: target section 定义将要执行playbook的远程主机组 variable section 定义playbook运行时需要使用的变量 task section 定义将要在远程主机上执行的任务列表 handler section

ansible 的简单介绍

ansible简介: ansible只是一个框架,并不具有部署的能力,真正具有批量部署能力的是ansible的模板, 架构包括: 连接插件connection plugins负责和被监控端实现通信. Host Inventory:指定操作的主机,是一个配置文件里面定义监控的主机 各种模块核心模块command模块自定义模块 借助于插件完成记录日志邮件等功能 PlayBooks:剧本执行多个任务时.并非必需可以让节点一次性运行多个任务 ansible中的一些元素: ansible.cfg:配置文件

Ansible 之 roles使用

1  概述 角色(roles):把playbook根据功能,如handler,tasks等分门别类的放在在各自的子目录下,形成一个集合,就是角色,建议把角色放在固定的目录下,目录可以ansible的配置文件中的roles_path来定义. role模板查看链接:https://github.com/ansible/ansible-examples 2  配置介绍 以层级结构组织Playbook的核心元素,成为roles. 核心元素包括以下几点: Hosts:主机 Tasks:任务列表 Varia

自动化运维Ansible之Roles部署配置LAMP架构

Roles介绍 Ansible为了层次化.结构化地组织Playbook,使用了角色(roles).Roles能够根据层次型结构自动装载变量文件.task以及handlers等.简单来讲,roles就是通过分别将变量.文件.任务.模块及处理器放置于单独的目录中,并可以便捷地include它们,roles一般用于基于主机构建服务的场景中,但也可以用于构建守护进程等场景中. 创建Roles 创建roles时一般需要以下步骤:首先创建以roles命名的目录.然后在roles目标下分别创建以个角色名称命令

Ansible的roles功能(五)

针对大型项目使用Roles进行编排,更便利 目录结构编排 一键安装httpd并提供服务 创建目录结构 [[email protected] ansible]# mkdir -p roles/httpd/{tasks,files,vars} [[email protected] ansible]# cd roles/httpd/tasks [[email protected] roles]#touch httpd/{files/main.yml,tasks/{groupadd.yml,instal

Qinq技术介绍与实战

说明:本文介绍部分是我在网络收集整理并添加提供. Qinq技术介绍与实战 Qinq介绍 Qinq就是为用户提供一种较为简单的二层VPN隧道.最核心的思想就是将用户私网VLAN tag封装到公网VLANtag上,报文带着两层tag穿越服务商的骨干网络.在用户端口上使QinQ功能时,都会为每个用户分配一个Customer-ID.其中报文中的两层tag标签包括内层ce-vid--VLAN标签和外层pe-vid-Qint标签. 那么问题来了,为什么要带两层标签呢? 我们知道,普通VLAN中的一个VLAN

nfs网络文件系统服务介绍与实战第一部

1.NFS原理描述 什么是NFS?NFS是Network File System的缩写,它的主要功能是通过网络让不同的机器之间可以彼此共享文件或目录.NFS服务器可以允许NFS客户端将远端NFS服务器端的共享目录挂在到本地的NFS客户端中.在本地NFS客户端的机器看来,NFS服务器端共享的目录就好像是自己的磁盘分区或者目录一样. NFS一般用来存储共享视频.图片等静态数据,是当前互联网系统架构中最常用的服务之一. 2.NFS挂载结构图 图解:NFS对外共享了video这个目录,下面有两台NFS客

nfs网络文件系统服务介绍与实战第二部

本博文议程如下: 1.生产情况应用案例 2.NFS客户端可挂载的参数 3.人为模拟错误的学习方法 4.NFS在网站架构中的位置 5.NFS的优缺点 议程1.生产情况实际案例概述: 实现当多台客户端同时挂载一台NFS Server时,无论从哪个客户端写入数据,其他客户端同样可以读写,即让所有NFS客户端写入到NFS Server的文件或目录在NFS Server上的用户和组都是同一个名称nfsnobody .请给出操作步骤,并加以说明. 实现NFS服务端的/data目录共享,指定主机(自己设置),