设为首页 收藏本站
查看: 1240|回复: 0

[经验分享] 运维工具Ansible浅谈playbook讲解以及YAML语法和JSON语法的互化

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-11-15 09:10:32 | 显示全部楼层 |阅读模式
  引言:运维发展到今天已经远远不是传统的运维做一些重复性的枯燥工作,面对海量爆发的访问量,传统的运维已经很吃力,比如让你装三五台机器的系统,这个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的框架:
    QQ截图20161115090930.png
    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安装好了以后,我们来看看他的配置文件
    wKioL1goif7BW1N-AAAN238Cd2Q456.jpg   
   /etc/ansible这是他的配置文件的目录,ansible-cfg这个文件是我们的主配置文件,hosts文件就是我们需要定义的主机,也就是我们管理哪些主机
   三,Ansible用法详解
   Ansible内置了大量的模块,我们正是使用这些模块来管理成千的机器,示例使用的是CentOS6.8的腾讯云主机,由于ansible是基于SSH协议的,那我们就先来做一次互信吧,负责是不通的
   (1)SSH互信 wKiom1gojDnhylOHAABI9A4ssLU058.jpg
完了后会生成下列两个文件
wKioL1gojMKixD-vAAAJE1sbCvQ674.jpg 一个是公钥一个是私钥
然后我们使用这个命令:
   cat id_rsa.pub > authorized_keys ,我们每次使用SSH连接时,互信的公钥都会在这个公钥里面,因为我是要连接本机自身,所以用的是自己的公钥,这样我们就可以ssh user@localhost或者ssh user@127.0.0.1这样免密码登录了。
  (2)Ansible使用
   Ansible安装后会产生下列命令    wKiom1gojuSBb2tmAAAMZBhG8kQ494.jpg    使用的时候,我们现在hosts文件中定义下我们的管理的主机
    wKioL1goj0nDNjFSAAAEqM9RL8w046.jpg
   名字就叫做webservers,这个组里面有127.0.0.1这个IP,当然我们也可以定义多个
   我们使用这个命令来查看我们的这台机器IP是否通,使用
    wKiom1gokpvggzmMAAAQ5WCHumg889.jpg
   这个说明我们的机器是IP是通的,显示为"pong",其中-m参数表示我们的模块,使用ping模块,想要看看我们有哪些模块可以使用下面命令:
   ansible-doc -l    wKioL1gokzywCwLNAACIpqxbsgc376.jpg
每一个模块是如何使用的我们使用: ansible-doc -s MODULE,例如
我们查看yum模块:
wKioL1golEHSYM_hAADPoNYymtA018.jpg ansible默认的模块是command模块,后面可以跟我们的命令,因为是默认的所以可以省略,比如
wKioL1golQOh6_6jAAAT1Jxnvus299.jpg
-a表示 模块特有的参数
想要看服务器的一些信息。我们可以使用:
wKiom1goleHw3A8wAABTqgDHjdM501.jpg
想要看某个参数可以使用 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
如果格式不正确就会出现下面的错误 wKiom1goo1DTGo3yAAAvxfwT6fg227.jpg   这一点是特别坑的,没什么特别重要的语法,但是这个格式就不得不吐槽了!!!
  如果我们的playbook执行无误的话会返回每个状态信息,如下如所示
wKiom1gorMmy6dasAABP0AULTzA041.jpg 我们会看到他一折一折的演,也就是一个接一个的执行
   playbook中还有事件通知机制,比如,我们安装好了nginx,将他的配置文件改变为我们想要的了,但我们可能随时修改这个配置文件模板,所以我们还要重启,要有个通知机制来告诉我,然后触发某种条件,执行,我们配置支持tls加密的nginx服务,也就是我们的https,编辑nginx-tls.yml如下图所示:    wKioL1gorkSxUjBEAAB5xwxlt2A545.jpg   我们先来说说上面的注意事项(6)也就是那个我遇到的最大的坑
   vars和tasks必须要对齐,如果tasks超出了vars的v字母对应的位置那么就会报错,很容易发现,但是如果tasks比vars缩进的更多,那么最大的问题出现了他执行完全没问题,不会有任何错误出现,但是tasks里面定义的所有的name他一个都不会执行,状态码都显示的是0.
  这么个傻逼格式,我当初排了很久的错误才找到的,切记,切记,切记,重要的事情说三遍。他会显示这样信息,如图所示。    wKioL1gosLOiE9MPAAAng3w7bWg033.jpg 我们的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执行成功后,我们访问下看看   wKiom1gouxjyQCG8AAAt7OHJya8940.jpg    因为我们的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"
   }




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-300565-1-1.html 上篇帖子: 自动化运维工具ansible基础应用 下篇帖子: ansible 普通用户使用的一些问题
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表