首页 > 代码库 > 运维工具Ansible浅谈playbook讲解以及YAML语法和JSON语法的互化

运维工具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协议的,那我们就先来做一次互信吧,负责是不通的

   (1)SSH互信 技术分享

完了后会生成下列两个文件

技术分享一个是公钥一个是私钥

然后我们使用这个命令: 

   cat id_rsa.pub > authorized_keys ,我们每次使用SSH连接时,互信的公钥都会在这个公钥里面,因为我是要连接本机自身,所以用的是自己的公钥,这样我们就可以ssh user@localhost或者ssh user@127.0.0.1这样免密码登录了。

  (2)Ansible使用

   Ansible安装后会产生下列命令   技术分享   使用的时候,我们现在hosts文件中定义下我们的管理的主机

   技术分享 

   名字就叫做webservers,这个组里面有127.0.0.1这个IP,当然我们也可以定义多个

   我们使用这个命令来查看我们的这台机器IP是否通,使用

   技术分享

   这个说明我们的机器是IP是通的,显示为"pong",其中-m参数表示我们的模块,使用ping模块,想要看看我们有哪些模块可以使用下面命令:

   ansible-doc -l   技术分享

每一个模块是如何使用的我们使用: 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=http://www.mamicode.com/root/files/nginx.conf dest=/etc/nginx/


   - name: enable configuration

     file: >

          dest=/etc/nginx/default.d/nginx.conf.bak

          src=http://www.mamicode.com/etc/nginx/nginx.conf

          state=link

   - name: copy index.html

     template: src=http://www.mamicode.com/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语法的互化