Ansible之playbook
简介
playbook是一个非常简单的配置管理和多主机部署系统。可作为一个适合部署复杂应用程序的基础。
playbook可以定制配置,可以按指定的操作步骤有序执行,支持同步和异步方式。
playbook是通过YAML格式来进行描述定义的,可实现多台主机应用的部署,对不同分组的主机执行特定指令步骤。
playbook通过示例展示其用法
定制一个简单的Nginx软件包管理,内容包括安装、配置模板、状态管理等。
配置文件:nginx.yml
---
- hosts: webservers #hosts参数作用:定义操作的对象,本例操作对象为webservers组 vars: #vars参数作用:定义变量(配置模板时会用到),作用域只限于webservers组
worker_processes: 4
num_cpus: 4
max_open_file: 65506
root: /data remote_user: root #指定远程操作的用户名,默认是root,支持sudo运行,通过添加sudo:yes即可 tasks: #定义任务列表(自上而下顺序执行)
- name: ensure nginx is at the latest version #每个事务都可以定义一个name标签,好处是增强可读性,便于观察结果输出时了解运行的位置
yum: pkg=nginx state=latest #yum安装最新版本的nginx
- name: write the nginx config file
template: src=/home/test/ansible/nginx/nginx2.conf dest=/etc/nginx/nginx.conf #根据模板配置nginx配置文件,src为主控端模板路径,dest为被控端nginx配置文件路径
notify:
- restart nginx
- name: ensure nginx is running
service: name=nginx state=started #启动nginx handlers: #通知处理程序(必须要有notify触发才会执行),根据notify选择handlers中对应的name标签,从而进行相应操作。如notify中是restart nginx,则handlers中的name标签内容也是restart nginx,才能执行
- name: restart nginx
service: name=nginx state=restarted
模板:nginx2.conf
user nginx;
worker_processes {{ worker_prcesses }};
{% if num_cpus == 2 %}
worker_cpu_affinity 01 10;
{% elif num_cpus == 4 %}
worker_cpu_affinity 1000 0100 0010 0001;
{% elif num_cpus >= 8 %}
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
{% else %}
worker_cpu_affinity 1000 0100 0010 0001;
{% endif %}
worker_flimit_notifile {{ max_open_file }};
... ...
执行playbook
格式:
ansible-playbook playbook.yml(playbook文件,可自定义名称) [参数]
例:
ansible-playbook /home/test/ansible/playbooks/nginx.yml -f 10 #启用10个并行进程数执行playbook(nginx.yml)
常用参数:
-u REMOTE_USER #手工指定playbook的系统用户
--syntax-check #检查playbook的语法
--list-hosts playbook #匹配到的主机列表
-T TIMEOUT #定义playbook执行超时时间
--step #以单任务分步骤运行,方便做每一步确认工作
--help #帮助信息
playbook角色与包含声明
包含
当playbook文件非常大时,想要复用某些功能是就会显得相当吃力,Ansible支持写playbook文件时拆分成多个文件,通过包含(include)的形式进行引用。
例:
功能(复用)文件:tasks/fool.yml
---
#possibly saved as tasks/foo.yml
- name: placeholder foo
command: /bin/foo
- name: placeholder bar
command: /bin/bar
使用的playbook文件:playbook.yml
tasks:
- include: tasks/foo.yml #通过include来引用复用的功能
角色
角色:Ansible定制好的一种标准规范,以不同级别目录层次及文件对角色、变量、任务、处理程序等进行拆分,为后续功能扩展、可维护性打下基础。
例:
以上面的nginx.yml为例进行拆分,结构如下:

说明:
hosts
#自定义主机,非必选项,默认将引用/etc/ansible/hosts的参数,要引用自定义hosts,需要通过-i file参数来实现,如:ansible-playbook -i hosts
[webservers]
192.168.1.111
192.168.1.112
group_vars
#定义组变量目录,目录中的文件名要与组名保持一致,组变量文件定义的变量作用域只在该组内,不能作用到其他组
【group_vars/all】 #代表所有主机
---
#Variables listed here are applicable to all host groups
ntpserver: ntp.sjtu.edu.cn
【group_vars/webservers】 #webservers组
---
worker_processes: 4
num_cpus: 4
max_open_file: 66535
root: /data
site.yml
#全局配置文件,下面内容引用了两个角色块,角色的应用范围及实现功能都不一样
---
- name: apply common configuration to all nodes
hosts: all
roles:
- common #对应目录为:nginx/roles/common
- name: configure and deploy the webservers and application code
hosts: webservers
roles:
- web #对应目录为:nginx/roles/web
roles
#角色目录,通常每个角色对应着一个特定的功能服务
【roles/common】
handlers/main.yml #处理程序文件
---
- name: restart ntp
service: name=ntp state=restarted
tasks/main.yml #任务列表文件
---
- name: Install ntp
yum: name=ntp state=present
- name: Configure ntp file
template: src=ntp.conf.j2 dest=/etc/ntp.conf #引用模板无需写路径,默认在上级的templates目录中查找
notify: restart ntp
- name: Start the ntp service
service: name=ntp state=started enabled=true
- name: test to see if selinux is running
command: getenforce
register: sestatus
changed_when: false
templates/ngp.conf.j2 #模板
driftfile /var/lib/ntp/drift
restrict 127.0.0.1
restrict -6 ::1
server {{ ntpserver }} #此处ntpserver引用vars/main.yml中定义的ntpserver变量
includefile /etc/ntp/rypto/pw
keys /etc/ntp/keys
vars/main.yml #变量配置文件
---
#Variable listed here are applicable to all host groups
ntpserver: 210.72.145.44
【roles/web】
handlers/main.yml #处理程序文件
---
- name: restart nginx
service: name=nginx state=restarted
tasks/main.yml #任务列表文件
---
- name: ensure nginx is at the latest version #每个事务都可以定义一个name标签,好处是增强可读性,便于观察结果输出时了解运行的位置
yum: pkg=nginx state=latest #yum安装最新版本的nginx
- name: write the nginx config file
template: src=/home/test/ansible/nginx/nginx2.conf dest=/etc/nginx/nginx.conf #根据模板配置nginx配置文件,src为主控端模板路径,dest为被控端nginx配置文件路径
notify:
- restart nginx
- name: ensure nginx is running
service: name=nginx state=started #启动nginx
templates/nginx2.conf #模板
user nginx;
worker_processes {{ worker_prcesses }};
{% if num_cpus == 2 %}
worker_cpu_affinity 01 10;
{% elif num_cpus == 4 %}
worker_cpu_affinity 1000 0100 0010 0001;
{% elif num_cpus >= 8 %}
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
{% else %}
worker_cpu_affinity 1000 0100 0010 0001;
{% endif %}
worker_flimit_notifile {{ max_open_file }};
... ...
运行角色
ansible-playbook -i hosts site.yml -f 10 #启用10个并行进程数执行playbook。hosts文件通过-i指向自定义hosts,playbook配置文件为site.yml
参考资料:
根据刘天斯《Python自动化运维技术与最佳实践》整理
Ansible之playbook的更多相关文章
- Ansible进阶--playbook的使用
一.什么是playbooksplaybooks是ansible的脚本.如同shell脚本一样,它是控制远程主机的一系列命令的集合,通过YAML语言编写.执行一些简单的任务,我们可以使用ad-hoc命令 ...
- ansible基础-playbook剧本的使用
ansible基础-playbook剧本的使用 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.YAML概述 1>.YAML的诞生 YAML是一个可读性高,用来表达数据序 ...
- Ansible之playbook的使用总结 - 运维笔记
之前详细介绍了Ansible的安装, 配置, 以及Ansible常用模块的使用. 下面对Ansible的playbook用法做一小结. 为什么引入playbook?一般运维人员完成一个任务, 比如安装 ...
- ansible学习-playbook的YAML语法
[一篇非常好的ansible参考博文] 初识Ansible http://liumissyou.blog.51cto.com/4828343/1616462 --------------------- ...
- 自动化运维工具——ansible剧本playbook(三)
一.Playbook--Ansible剧本 playbook是由一个或多个 "play"组成的列表 play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的ta ...
- Ansible基于playbook批量修改主机名实战
Ansible基于playbook批量修改主机名 安装Ansible,相信这里也不用多说,大家都知道 说一下环境:这里的主机名是修改之后的,我先把其他两台的主机名改为别的 192.168.30.21 ...
- 利用ansible书写playbook在华为云上批量配置管理工具自动化安装ceph集群
首先在华为云上购买搭建ceph集群所需云主机: 然后购买ceph所需存储磁盘 将购买的磁盘挂载到用来搭建ceph的云主机上 在跳板机上安装ansible 查看ansible版本,检验ansible是否 ...
- 利用ansible书写playbook搭建HAProxy+Keepalived+PXC负载均衡和高可用的PXC环境续
ansible.playbook.haproxy.keepalived.PXC haproxy+keepalived双主模式调度pxc集群 HAProxy介绍 反向代理服务器,支持双机热备支持虚拟主机 ...
- Ansible 和 Playbook 暂存
Ansible 和 Playbook 暂存 , 也是一个批量管理工具 自动化的批量管理工具 主机清单 HOST Inventory 模块插件 Playbooks 查看ansible的目录结构 ...
- ansible使用playbook的简单例子(ansible2.9.7)
一,ansible使用playbook的优点 1,用ansible执行一些简单的任务,使用ad-hoc命令就可以解决问题 如果执行复杂的功能,需要大量的操作,执行的ad-hoc命令会不够方便,这时我们 ...
随机推荐
- iOS学习笔记---oc语言第三天
继承.初始化方法 一.继承 继承的上层:父类 继承的下层:子类 继承是单向的,不能相互继承 继承具有传递性:A继承于B,B继承于C,A具有B和C的特征和行为 子类能继承父类全部的特征和行为(私有变量 ...
- ZOJ 3805--解题报告
题目相关: 3805相关链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5337 在二维的矩形上, 机器通过管道(pipe ...
- asp.net 中json字符串转换
List<ATTVal> Replys = JsonParser.FromJson<List<ATTVal>>(attrValueStr);
- textarea元素在加上runat="server"后运行报错解决
当出现这个报错的时候,在后台引用相应的命名空间,为 using System.Web.UI; using System.Web.UI.HtmlControls;using System.Web.UI. ...
- mysql 关联删除
参考网址:http://www.111cn.net/database/mysql/51146.htm 原网页广告太多,自己抄了下. 1.delete from t1 where 条件2.delete ...
- 转:linux 修改sftp服务默认提供者sshd的session timeout
ssh连接超时问题解决方案: 1.修改server端的etc/ssh/sshd_config ClientAliveInterval 60 #server每隔60秒发送一次请求给client,然后cl ...
- Docker仓库管理
1.# docker pull registry //下载registry镜像,registry为docker官方提供的一个镜像,我们可以用它来创建本地的docker私有仓库. 2.# docker ...
- JS 的线程、事件循环、任务队列简介
JS 是单线程的,但是却能执行异步任务,这主要是因为 JS 中存在事件循环(Event Loop)和任务队列(Task Queue). 事件循环:JS 会创建一个类似于 while (true) 的循 ...
- 如何安装 VLFeat工具包到Linux (Ubuntu) 64_bit system matlab 中?
最近要提一个数据集的feature,想先用HOG特征做一个baseline,听师兄说VLFeat 是一个不错的工具包,就下载了试试,刚刚配置成功,网上各种搜索教程啊 但是都不行,最后还是硬着头皮看官网 ...
- C# Post方式传输报文,和处理响应
public string DoPost(string url, string data) { HttpWebRequest req = GetWebRequest(url, "POST&q ...