4、Ansible(tags、roles)
Tags
https://docs.ansible.com/ansible/latest/user_guide/playbooks_tags.html
http://www.zsythink.net/archives/2641
tags用于让用户选择运行playbook中的部分代码。ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可以通过tags跳过此些代码片断。
tags:在playbook中可以为某个或这些任务定义一个"标签",在执行此playbook时,通过ansible-playbook命令使用--tags选项能实现仅运行指定的tasks而非所有的。
# vim apache.yml //在配置文件修改以后,没有必要把整个playbook定义的tasks都运行一遍。运行playbooks时只需指定说明需要运行的task。
- hosts: websrvs //如何只运行所需要运行的task?可以给每个task都给一个单独的标签或者只给需要郧运行的task一个单独的标签,在运行ansible-playbook明确指明标签对应的task就可以了。
remote_user: root
vars:
- package: httpd
- service: httpd
tasks: //第一次运行的时候,tasks全部运行一边,再次运行时可以只运行一分部内容
- name: install httpd package //比如第一个tasks在第一次运行后,如果配置文件发生改变,那么再次执行tasks时,没有必要把此tasks再执行一遍,因为即使执行了也没有发生任何改变。
yum: name={{ package }} state=latest
- name: install configuration file for httpd //文件修改后,可以之运行这个任务,其他的任务可以不运行
template: src=/root/templates/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
11 tags: //此处定义标签
12 - conf //标签对应的task名字
notify:
- restart httpd
- name: start httpd service
service: name={{ service }} enabled=true state=started
handlers:
- name: restart httpd
service: name=httpd state=restarted
# vim /etc/ansible/hosts //对websrvs进行修改,表示playbook中定义的配置文件有修改
[websrvs]
192.168.184.142 http_port=8080
192.168.184.143 http_port=80
# ansible-playbook apache.yml --tags="conf"
PLAY [websrvs] *********************************************************************************************************************** TASK [Gathering Facts] ***************************************************************************************************************
ok: [192.168.184.143]
ok: [192.168.184.142]
//安装程序包的task和启动服务的task都没有执行,而是直接复制配置文件到被管控主机。
TASK [install configuration file for httpd] ******************************************************************************************
changed: [192.168.184.143] //这里只运行了标签tags为conf的task
changed: [192.168.184.142] RUNNING HANDLER [restart httpd] ******************************************************************************************************
changed: [192.168.184.142] //由于存在notify机制,所以在配置文件修改后会重启服务
changed: [192.168.184.143] PLAY RECAP ***************************************************************************************************************************
192.168.184.142 : ok= changed= unreachable= failed=
192.168.184.143 : ok= changed= unreachable= failed=
Roles详解
ansilbe自1.2版本引入的新特性,用于层次性、结构化地组织playbook。roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。简单来讲,roles就是通过分别将变量、文件、任务、模板及处理器放置于单独的目录中,并可以便捷地include它们的一种机制。角色一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中。
一个roles的案例如下所示:
site.yml //整个yml文件的主调接口
webservers.yml //两个子yml文件
dbservers.yml
roles/ //roles里面定义了多个role
common/ //第一个是通行角色,无论是通行角色还是服务器角色下都有子目录
files/ //文件:源文件和目标文件
templates/ //模板
tasks/ //所有的task
handlers/ //处理器
vars/ //变量
meta/ //元数据
webservers/ //服务器角色
files/
templates/
tasks/
handlers/
vars/
meta/
而在playbook中,可以这样使用roles:
---
- hosts: webservers
roles: //定义roles为common和webservers,直接调用roles里面的内容
- common
- webservers
也可以向roles传递参数,例如:
---
- hosts: webservers
roles: //调用roles时
- common
- { role: foo_app_instance, dir: '/opt/a', port: 5000 } //foo_app_instance是角色,传递某个参数dir: '/opt/a', port: 5000
- { role: foo_app_instance, dir: '/opt/b', port: 5001 }
甚至也可以条件式地使用roles,例如:
---
- hosts: webservers
roles:
- { role: some_role, when: "ansible_os_family == 'RedHat'" }
创建role的步骤
(1) 创建以roles命名的目录;
(2) 在roles目录中分别创建以各角色名称命名的目录,如webservers等;
(3) 在每个角色命名的目录中分别创建files、handlers、meta、tasks、templates和vars目录;用不到的目录可以创建为空目录,也可以不创建;
(4) 在playbook文件中,调用各角色;
role内各目录中可用的文件
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?

有三台主机,A配置成httpd服务器,B配置为php服务器,C配置成MySQL server。这三台服务都要配置上ntp服务,方便同步时间,这里使用crontab命令来执行。
如何定义playbook?第一个play应用于A即web server上,第二个play应用于B即php server,第三个play应用于C即mysql server,但是这样操作不利于模块化和重复调用。假如随后又加进一个主机D,既要配置成web server又要配置成php server,那么可能就要写第四个play应用于D主机了。
为了避免代码重复,roles定义的功用可以实现代码被多次调用。比如定义三个角色分别是:websrvs、phpsrvs和dbsrvs,那么下面调用角色就如下所示:
hosts: A //当定义主机A时,使用websrvs角色
role:
- websrvs
hosts: B //当定义主机B时,使用phpsrvs角色
role:
- phpsrvs //当定义主机C时,使用dbsrvs角色
hosts: C
role:
- dbsrvs //当定义主机D时,使用websrvs角色和phpsrvs角色
hosts: D
role:
- websrvs
- phpsrvs
实验示例
# mkdir -pv ansible_playbooks/roles/{websrvs,dbsrvs}/{tasks,files,templates,meta,handlers,vars} //按照规定创建目录
# tree ansible_playbooks/ //查看此目录的树形结构
ansible_playbooks/
└── roles
├── dbsrvs
│ ├── files
│ ├── handlers
│ ├── meta
│ ├── tasks
│ ├── templates
│ └── vars
└── websrvs
├── files
├── handlers
├── meta
├── tasks
├── templates
└── vars
# cd ansible_playbooks/roles/websrvs/ //要注意目录的改变
# cp /etc/httpd/conf/httpd.conf files/ //这里假设每一个服务的配置文都是相同的,当作静态文件使用
# vim tasks/main.yml //定义所有的任务
- name: install httpd package
yum: name=httpd
- name: install configuration file
copy: src=httpd.conf dest=/etc/httpd/conf/httpd.conf //注意:src使用的相对路径,即相对于ansible_playbooks/roles/websrvs/files,files下的文件都可以使用相对路径,直接调用
tags:
- conf
notify:
- restart httpd //注意这里需要用到触发器handlers,需要另外定义
- name: start httpd
service: name=httpd state=started
# vim handlers/main.yml //此前把handlers和任务都是定义在一个文件中,现在需要分别定义,每一个内容都放在以它的标签命名的目录下面
//注意路径:ansible_playbooks/roles/websrvs
- name: restart httpd
service: name=httpd state=restarted
# vim vars/main.yml //如果还要定义变量,就需要在ansible_playbooks/roles/websrvs/vars目录下定义变量,这里可以暂时先删除
- http_port: 80 //这里只是作为示例
以上就定义了websrvs这个角色,如果想调用这个角色,需要在roles的目录之外创建一个固定格式为site.yml的文件。

# vim site.yml //定义playbook,只需在这个文件中定义调用那个角色就可以了
- hosts: websrvs //定义playbook所应用的主机
remote_user: root
role: //定义上面所指定主机的应用角色
- websrvs //角色名字,这个角色里面所有tasks、handlers、vars都可以在这里调用
# ansible-playbook site.yml //由于被管控主机之前已经安装了httpd程序,所以这里只是修改了配置文件
PLAY [websrvs] *********************************************************************************************************************** TASK [Gathering Facts] ***************************************************************************************************************
ok: [192.168.184.143]
ok: [192.168.184.142] TASK [websrvs : install httpd package] ***********************************************************************************************
ok: [192.168.184.142]
ok: [192.168.184.143] TASK [websrvs : install configuration file] ******************************************************************************************
changed: [192.168.184.143]
changed: [192.168.184.142] TASK [websrvs : start httpd] *********************************************************************************************************
ok: [192.168.184.142]
ok: [192.168.184.143] RUNNING HANDLER [websrvs : restart httpd] ********************************************************************************************
changed: [192.168.184.143]
changed: [192.168.184.142] PLAY RECAP ***************************************************************************************************************************
192.168.184.142 : ok= changed= unreachable= failed=
192.168.184.143 : ok= changed= unreachable= failed=
下面定义dbsrvs角色
# yum install mariadb-server //首先先在管控主机上安装mysql,因为要用到配置文件my.cnf
# cd ansible_playbooks/roles/dbsrvs/ //看清楚路径,这里编辑是dbsrvs角色
# cp /etc/my.cnf files/ //放在files目录下,使用相对路径直接调用就可以了
# vim tasks/main.yml //定义dbsrvs角色的任务
- name: install mariadb-server package
yum: name=mariadb-server state=latest
- name: install configuration file
copy: src=my.cnf dest=/etc/my.cnf //src直接引用dbsrvs/files目录下的文件
tags:
- myconf
notify:
- restart mariadb
- name: start mariadb service
service: name=mariadb enabled=true state=started
# vim handlers/main.yml //定义处理器
- name: restart mariadb
service: name=mariadb state=restarted
# vim site.yml //分开指明角色
- hosts: 192.168.184.142
remote_user: root
roles:
- websrvs - hosts: 192.168.184.143
remote_user: root
roles:
- dbsrvs - hosts: 192.168.184.145
remote_user: root
roles:
- websrvs
- dbsrvs
roles注意事项:
1、目录名同角色名
2、目录结构有固定格式;
files:静态文件
templates:Jinjia2模板文件
tasks:至少有一个main.yml文件,定义各handlers
vars:至少有一个main.yml文件,定义变量
meta:定义依赖关系等信息
3、site.yml中定义playbook,额外也可以有其他的yml文件;
4、Ansible(tags、roles)的更多相关文章
- 五十五.ansible概述、ansible基础 、ad-hoc、批量配置管理
1.环境准备 (自动化工具,批量操作) 6台 2cpu,1.5G以上内存,20G硬盘,1网卡 1.1 基础环境准备 1)启动6台虚拟机,ansible.sh 2)真机配置yum仓库 ]# tar ...
- Linux centosVMware 自动化运维Ansible介绍、Ansible安装、远程执行命令、拷贝文件或者目录、远程执行脚本、管理任务计划、安装rpm包/管理服务、 playbook的使用、 playbook中的循环、 playbook中的条件判断、 playbook中的handlers、playbook实战-nginx安装、管理配置文件
一.Ansible介绍 不需要安装客户端,通过sshd去通信 基于模块工作,模块可以由任何语言开发 不仅支持命令行使用模块,也支持编写yaml格式的playbook,易于编写和阅读 安装十分简单,ce ...
- 3、Ansible playbooks(Hosts、Users、tasks、handlers、变量、条件测试(when、迭代)、templates)
Ansible playbooks playbook是由一个或多个“play”组成的列表.play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色.从根本上来讲 ...
- 1、Ansible简介及简单安装、使用
参考Ansible权威指南:https://ansible-tran.readthedocs.io/en/latest/index.html 以下内容学习自马哥教育 Ansible: 运维工作:系统安 ...
- 2、Ansible配置文件详解
0.配置文件 两个核心文件:ansible.cfg和hosts文件,默认都存放在/etc/ansible目录下. ansible.cfg:主要设置一些ansible初始化的信息,比如日志存放路径.模块 ...
- 17、ansible配置管理
17.1.前言: 1.说明: ansible是自动化运维工具,基于Python开发,实现了批量系统配置.批量程序部署.批量运行命令等功能. ansible是基于模块工作的,本身没有批量部署的能力,真正 ...
- Fbric、Ansible、Docker、Chaos Monkey:DevOps工具的年中回顾
Fbric.Ansible.Docker.Chaos Monkey:DevOps工具的年中回顾 [编者按]近日,Cyber Engineering Solutions Group 技术经理 Hasan ...
- SVN 中trunk、tags、branches使用
简介 我们都知道SVN是管理项目源代码的软件,可以把我们开发中的各个阶段的代码记录下来,供我们以后来使用,那么SVN具体的结构你是否知道呢?下面我们来介绍一下它的基本结构 Trunk.Branches ...
- ansilbe 入门001、ansible的介绍
概述: ansible 作为一个配置管理工具.首先我们要“告诉”它管理的是那几台机器啊:而这个信息就在要ansible 的配置文件中体现了.默认情况下ansible的配置文件保存在 /etc/ansi ...
随机推荐
- 20165316 技能学习心得与c语言学习
20165316 技能学习心得与c语言学习 一.技能学习经验 我会打乒乓球,在中国,我只能说我"会"打,至于"比大多数人更好"我不敢断言,因为我无时无刻不感受到 ...
- xml.dom——文档对象模型API
文档对象模型,或者“DOM”,是一个跨语言API的World Wide Web Consortium(W3C)来访问和修改XML文档.DOM的实现提供了一个XML文档树结构,或允许客户机代码从头开始建 ...
- flask框架----flask-session组件
简介 flask-session是flask框架的session组件,由于原来flask内置session使用签名cookie保存,该组件则将支持session保存到多个地方,如: redis:保存数 ...
- 实用的 图片上传 html+css
html <form id="mainForm"> <div class="content"> <div class=" ...
- 像黑客一样使用Linux命令行(转载)
阅读目录 前言 使用 tmux 复用控制台窗口 在命令行中快速移动光标 在命令行中快速删除文本 快速查看和搜索历史命令 快速引用和修饰历史命令 录制屏幕并转换为 gif 动画图片 总结 回到顶部 前言 ...
- jQuery获取子元素个数的方法
//获取id=div1下的子元素的个数 $('#id').children().length; //获取id=div1下的p元素个数 $('#id').children('p').length;
- 2017第十三届湖南省省赛A - Seating Arrangement CSU - 1997
Mr. Teacher老师班上一共有n个同学,编号为1到n. 在上课的时候Mr. Teacher要求同学们从左至右按1, 2, …, n的顺序坐成一排,这样每个同学的位置是固定的,谁没来上课就一目了然 ...
- ES6知识整理(9)--class的基本语法
(总结完知识点,出去滑板刷街) promise的catch 上一节promise中漏了一个知识点: promise对象可以使用catch来避免每个then中都加error判断,让错误时都进到catch ...
- phpstorm激活大全--持续更新(支持2018最新版)
方法一. 通过Licence Server 激活PHPStorm(快速) 方法原理是通过搭建服务器激活,不过网上有许多搭建好的. http://idea.goxz.gq http://v2mc.net ...
- 01:saltstack 基本使用
1.1 准备实验环境: 安装系统 1)硬件配置如下 2) 先把光标放到”install CentOS 7”,按 Tab键编辑内核参数,添加 (net.ifnames=0 biosdevname=0) ...