运维工具Ansible浅谈playbook讲解以及YAML语法和JSON语法的互化
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了运维工具Ansible浅谈playbook讲解以及YAML语法和JSON语法的互化相关的知识,希望对你有一定的参考价值。
引言:运维发展到今天已经远远不是传统的运维做一些重复性的枯燥工作,面对海量爆发的访问量,传统的运维已经很吃力,比如让你装三五台机器的系统,这个so easy,那要是安装几百上千台呢,还easy吗。我要安装nginx服务,并提供好相应的端口转发机制以及location资源访问机制,但是有多发十几台这样的机制,并且每台机器转发机制都不相同,这个对我们来说是一个不小的挑战,因此运维进入了自动化时代,自动化运维就显得重要了。因此本文就是围绕自动化运维工具Ansible来展开的。
一,为什么要使用Ansible
自动化运维工具发展到如今已经很多了,为什么要使用Ansible呢,首先Ansible比起其他的自动化运维工具(puppet,saltstack,chef)来说他基于SSH协议,使用python的Jinja2模板,并且使用SSH multiplexing来优化性能,并且相比较puppet和saltstack来说它是轻量级的,远程主机无须安装任何依赖,不像puppet和saltstack那样需要master和agent,并且ansible的配置管理脚本playbook基于YAML语言,通俗易懂。其次内置大量的模块。
二,Ansible框架和安装
我们来看看Ansible的框架:
Ansible是基于大量的模块来工作的,这些模块是Ansible工作的核心
Host Inventory:定义了我们要监控的主机,我们所要操作的主机就在这个里面
Playbooks:就是我们的剧本,剧本可以执行多个任务
Connection Plugins:连接插件,负责和被管理节点之间的通信
Linux下安装:
(1)使用pip安装
因为ansible使用python开发,因此使用pip安装没问题的
pip install ansible
(2)GitHub安装
git clone https://github.com/ansible/ansible.git --recursive
cd ./ansible
source ./hacking/env-setup
(3)yum安装
使用epel源
yum install ansible
建议使用yum安装,因为自动解决依赖关系,并且安装方便,使用前先安装好epel源的包,yum安装好了以后,我们来看看他的配置文件
/etc/ansible这是他的配置文件的目录,ansible-cfg这个文件是我们的主配置文件,hosts文件就是我们需要定义的主机,也就是我们管理哪些主机
三,Ansible用法详解
Ansible内置了大量的模块,我们正是使用这些模块来管理成千的机器,示例使用的是CentOS6.8的腾讯云主机,由于ansible是基于SSH协议的,那我们就先来做一次互信吧,负责是不通的
完了后会生成下列两个文件
然后我们使用这个命令:
cat id_rsa.pub > authorized_keys ,我们每次使用SSH连接时,互信的公钥都会在这个公钥里面,因为我是要连接本机自身,所以用的是自己的公钥,这样我们就可以ssh [email protected]或者ssh [email protected]这样免密码登录了。
(2)Ansible使用
Ansible安装后会产生下列命令 使用的时候,我们现在hosts文件中定义下我们的管理的主机
名字就叫做webservers,这个组里面有127.0.0.1这个IP,当然我们也可以定义多个
我们使用这个命令来查看我们的这台机器IP是否通,使用
这个说明我们的机器是IP是通的,显示为"pong",其中-m参数表示我们的模块,使用ping模块,想要看看我们有哪些模块可以使用下面命令:
每一个模块是如何使用的我们使用: ansible-doc -s MODULE,例如
我们查看yum模块:
ansible默认的模块是command模块,后面可以跟我们的命令,因为是默认的所以可以省略,比如
-a表示 模块特有的参数
想要看服务器的一些信息。我们可以使用:
想要看某个参数可以使用 ansible webservers -m setup -a ‘filter=xxxx‘,比如bios时间 ansible webservers -m setup -a filter=‘ansible_bios_date‘
三,playbook讲解和YAML语法讲解
playbook也就是我们的剧本,剧本中一折接着一折演出,ansible的playbook就是这么个意思,一个接着一个的执行,比如我要安装nginx,并且启动这个使用ansible就很简单了,使用ansible webservers -m yum -a "name=nginx state=present"这样子就成功了,但是我要让nginx安装启动后,并且使用一个我们自定义的配置文件,并且我们自定义一个h5页面访问,这样的话,一条简单的命令就无法达到了,我们看就必须得使用playbook了。
playbook和play,host,task和模块(module)之间的关系如下所示
playbook--------play-------host
|
|
task-------module
一个playbook由多个play构成,多个play在哪一个host上操作,每个play有同的task,每个task是由很多模块组成的
playbook的语法是使用YAML(Yet Another Markup Language)来配置的,yaml自身通俗易懂我们理解起来很简单。下面就实例安装nginx,并且使用我们自定义的配置文件,自定义的H5页面。一般playbook我们都是以yam结尾命名,我们编辑一个web-nginx.yml的文件,写入
- name: Configuration webserver with nginx
hosts: webservers
tasks:
- name: install nginx
yum: name=nginx state=present
- name: copy nginx config file
copy: src=/root/files/nginx.conf dest=/etc/nginx/
- name: enable configuration
file: >
dest=/etc/nginx/default.d/nginx.conf.bak
src=/etc/nginx/nginx.conf
state=link
- name: copy index.html
template: src=/root/template/index.html.j2 dest=/usr/share/nginx/html/index.html
mode=0644
- name: restart nginx
service: name=nginx state=restarted
name:表示每一出剧本的名字
hosts:表示的是我们管理的主机组
tasks:就是我们的任务
yum,copy,file,template,service表示我们的模块名字,后面跟的表示他的一些用法,具体怎么用就按照上面ansible-doc -s MUDULE来查看
注意事项:这是个人使用过程中遇到的大坑,因此总结出来的。切记
(1)所有的-和name之间都必须要有一个空格,否则是错误无法执行的
(2)所有的:后面都必须要空一格否则是错误的
(3)task的开头字母必须要比下面的-超出,否则仍然是错误的
(4)task里面定义的- name中,每个- name必须缩进相同的空格,否则是错误的(有例外,等会说)
(5)- name的下一行首字母必须要和name的n字母对齐
(6)稍后讲解,这是我遇到最大的一个坑
执行playbook我们使用这个命令: ansible-playbook web-nginx.yml
如果格式不正确就会出现下面的错误 这一点是特别坑的,没什么特别重要的语法,但是这个格式就不得不吐槽了!!!
如果我们的playbook执行无误的话会返回每个状态信息,如下如所示
playbook中还有事件通知机制,比如,我们安装好了nginx,将他的配置文件改变为我们想要的了,但我们可能随时修改这个配置文件模板,所以我们还要重启,要有个通知机制来告诉我,然后触发某种条件,执行,我们配置支持tls加密的nginx服务,也就是我们的https,编辑nginx-tls.yml如下图所示: 我们先来说说上面的注意事项(6)也就是那个我遇到的最大的坑
vars和tasks必须要对齐,如果tasks超出了vars的v字母对应的位置那么就会报错,很容易发现,但是如果tasks比vars缩进的更多,那么最大的问题出现了他执行完全没问题,不会有任何错误出现,但是tasks里面定义的所有的name他一个都不会执行,状态码都显示的是0.
这么个傻逼格式,我当初排了很久的错误才找到的,切记,切记,切记,重要的事情说三遍。他会显示这样信息,如图所示。 我们的task一个都没有执行,没有任何错误
上面注意事项(4)说的例外就是,我们handlers里面的- name可以不用和tasks里面的- name对齐
现在我们来说说上面多出来代表的意思了:
handlers:他和tasks很相像,但是他只有task通知的时候才会执行,如果task改变了系统的状态,那么就需要触发通知机制
notify:就是我们的通知机制
vars:就类似于我们在shell中定义了一个变量,后面频繁的引用这个变量,这个是同理的,我们定义了很多变量来保存,后面只需要引用变量即可。
关于handlers只会在所有的任务执行完成后执行,而且即使被多次通知,他也只会执行一次,他是按照play中定义的顺序执行不是通知顺序。
至于怎么创建nginx.key和nginx.crt这里就不再赘述,怎么使用可以看看openssl这个强大的命令
一个playbook必须包含下面两项:
(1) host:需要配置的一组主机
(2) task:需要在这些主机上所做的任务
将上述的playbook执行成功后,我们访问下看看 因为我们的TLS证书不是互联网中流通的证书,因此前面那样显示。
四,YAML语法和JSON语法互化
相比较JSON格式的数据,我想大家看到YAML格式的数据更加易懂吧,因为JSON首先就是一种机器交互格式的,YAML是便于人类读写识别,下面我们就来介绍下之间的转化
很多看了playbook的肯定都是一头雾水,为什么是那样子写,为什么name前面有个"-"之类的。
文件的起始:
YAML文件已三个减号开头表示标记文章的开始:
---
但是我们的playbook中并没出现,这是因为我们缺少,并不影响我们的运行
字符串:
YAML格式的字符串: I have a pen i have an apple
等价的JSON格式:"I have a pen i have an apple"
布尔型:
YAML的布尔型:True
等价的JSON格式:true
列表:
YAML中的列表就像是python中的列表一样,不过他是使用"-"作为分隔符的,就像下面这样
- My Fair Lady
- Houston
- Doctor Strange
等价的JSON格式:
[
"My Fair Lady",
"Houston",
"Doctor Strange"
]
字典:
YAML中的字典就像是python中的字典了,就是个映射对应关系,
YAML格式的字典:
address:742 Evergreeen Terrace
city:Las Vegas
state:United states
等价的JSON格式为:
{
"address":"742 Evergreeen Terrace"
"city":"Las Vegas"
"state": "United states"
}
本文出自 “berniem2m” 博客,请务必保留此出处http://berniem2m.blog.51cto.com/9203249/1872502
以上是关于运维工具Ansible浅谈playbook讲解以及YAML语法和JSON语法的互化的主要内容,如果未能解决你的问题,请参考以下文章
Ansible自动化运维工具Ansible的playbook基本用法
ansible自动运维工具之ansible-playbook详解