Ansible自动化部署从入门到弃坑

0x00 @Before

上次Ansible自动部署入门,最后写了点playbook的项目,了解了一些如task,template,vars等简单的用法。但是真正的Ansible项目并不是通过主机来分Roles的,而是一个Ansible管理多台主机,用Roles来区分项目。
所以这一次,我带来了不一样的使用姿势。

1x00 Playbook再介绍

playbook 是剧本,我在上片已经介绍了点,总之入口是一个yml文件

- hosts: local
  remote_user: zing
  environment: 
    JAVA_HOME:  /application/jdk8/
    JRE_HOME: /application/jdk8/jre/
    M2_HOME: /application/maven/bin/
  tasks:
    - name: package project
      shell: mvn clean package
      remote_user: zing
    - name: deploy to maven service
      shell: mvn deploy
      sudo: yes
      ignore_errors: yes
  

如果项目简单, 一个playbook.yml文件就可以搞定了

1x01 Handler

handler,用来执行某些条件下的任务,比如当配置文件发生变化的时候,通过notify触发handler去重启服务器。如下面playbook。

- hosts: local
  remote_user: zing
  tasks:
    - name: copy properties
      copy: src=/home/zing/project.properties dest=/home/java/pro/project.properties
    - name: 
      file: path=/home/java/pro/project.properties mode=600
      notify:
        - restart server
  handlers:
    - name: restart server
      service: name=tomcat state=restarted

还有一种条件判断,可以直接写在task里面,如下

- hosts: local
  remote_user: zing
  tasks:
    - name: copy properties
      copy: src=/home/zing/project.properties dest=/home/java/pro/project.properties
    - name: modify project property
      file: path=/home/java/pro/project.properties mode=600
    - name: restart server when server is zing
      service: name=tomcat state=restarted
      when: result|changed

when的用法还有很多,可以自己探索。不过一般用Handler会更加灵活一些。when的条件判断需要了解很多Ansible变量,想知道的话,可以自己参考官方文档

1x02 循环迭代

上一篇文章已经写过迭代了,我怕写的笼统,这里再拿出来讲一下

- hosts: local
  remote_user: zing
  tasks:
    - name: transfom template
      template: src={{item.file_src}} dest={{item.target_file_path}}
      with_items:
        - {file_src: '/home/zing/template/application.j2', target_file_path: '/home/service/resources/application.properties'}
        - {file_src: '/home/zing/template/config.j2', target_file_path: '/home/service/resources/config.properties'}

使用with_items,将下面的参数迭代进tasks里面,这样每一个参数都按照变量名称会放入{{ }}对应的变量名称中。直到item循环迭代介绍,才会执行下一个task

1x03 Tags

通过tag可以指定运行的task,然而简单的部署时tag并不常用,需要tag的时候一般可以直接使用ansible命令处理,或者再写新的playbook。只有在大型项目部署的时候,偶尔才会使用。所以只简单介绍一下tag的用法。

  • 首先,在tasks内的yml文件中,对需要的task打上tag:
- name: yun install package 
  yum: name={{ item }} state=installed 
  with_items: 
     - httpd 
     - memcached 
  tags: 
     - packages 

 - name: configuration modity 
  template: src=templates/src.j2 dest=/etc/foo.conf 
  tags: 
      - configuration

  • 调用某个tag:
 ansible-playbook example.yml – tags “configuration,packages”

task可以打上任意多个tag。

1x04 变量

变量分好几种,可以定义在playbook中,也可以定义在hosts文件上,后面也可以写在roles的vars文件夹中。
上面介绍循环迭代,{{item.file_src}}就是变量引用,with_items下的就是变量值。变量可以放置在几乎所有地方,除了关键字外,其他地方都可以引用变量。Ansible自己也定义了好多自带的变量,有兴趣的可以自己看看

hosts主机变量如下

# 针对主机的主机变量
127.0.0.1 my_name_is=zing

# 针对组的变量
[webServer]
domain1.example.com
domain2.example.com
[webServer:vars]
server_user_name_is="zing"
server_user_is="java_programer"

# 针对所有主机的所有变量
[all:vars]
user_name_is="zing"
user_is="java_programer"

使用变量只要在正确的位置加上变量引用{{ varable_name }}就好

- hosts: local
  remote_user: {{ user_name_is }}
  tasks:
    - name: copy properties
      copy: src=/home/zing/project.properties 

Ansible支持复杂变量,我们的{{ item.src }}就是一个复杂型的,通过.来引用item下的src值。所以,变量名称不要带.

复杂变量也很简单。不过一般定义在yaml文件里面,playbook中可以这么定义

- hosts: local
  remote_user: zing
  tasks:
    - name: start server {{ server1.name }}
      service: name=tomcat state=restarted
  vars:
    server1:
        name: "zing_service"
        type: "tomcat"

注意:
某些时候YAML冒号后面的值不能以{开头,如果有要以{开头,必须加上引号。解决方式如下。

- hosts: zing_servers
  vars:
       server_path: "{{ base_path }}/zing"

1x05 模板和变量搭配使用

所谓的模板就是以一个现成的文件为样板,向其中填充参数,来生成我们需要的真实文件,这个无须多介绍,参考
https://micorochio.github.io/2017/06/05/ansible-learning-02/#0x03-yaml和playbook
下的 application.properties.j2 文件写法,双大括号里的参数会被定义的变量所替换,文件替换流程参考下面的写法

- name: transfom template
  template: src={{item.template_file}} dest={{item.target_file}}
  with_items:
    - {template_file: 'template/application.j2', target_file: 'resources/application.properties'}
    - {template_file: 'template/config.j2', target_file: 'resources/config.properties'}

这段task的意思是:将item的模板template_file转换成target_file。定义多个item 自动迭代,将参数替换到task变量中

2x00 Roles

这是个新的概念,playbook只能管理一个项目的话,通过Roles可以用一个ansible工程,管理公司所有的工程。上一篇文章,我介绍的Roles是根据主机来分Roles(角色)的,实际开发中,大多是根据项目名称来分角色。这样一套ansible,就能hold住全部工程。

2x01 正确的ansible工程目录

inventory/                   //hosts文件夹
    project_a_host           //工程a的hosts
    project_a_hosts          //工程b的hosts
project_a_playbook.yml       //参考上篇文章的side.yml
project_b_playbook.yml       //参考上篇文章的side.yml
roles/                       //roles文件夹,第一级子文件夹就是就是role的名称
   project_a/                //role,表示工程A
     files/                  //一般用来存放脚本,或者其他部署时需要使用的文件
     templates/              //存放模板
     tasks/                  //存放任务tasks
     handlers/               //存放Handler
     vars/                   //存放本角色可以使用的变量
     defaults/               //用来存放默认变量的,如果其他地方不定义,会在这里找,否则会使用其他地方定义的变量
     meta/                   //用于定义此角色的特殊设定及其依赖关系,我还没用到这个
   project_b/
     files/
     templates/
     tasks/
     handlers/
     vars/
     defaults/
     meta/

2x02 一个开源的 tomcat 工程实例

这个例子的开源地址:https://github.com/ansible/ansible-examples/tree/master/tomcat-memcached-failover
这个例子很好的展示了Tomcat服务的自动化部署的Ansible工程写法

3x00部署一个Maven版的java项目

只是简单介绍一下从0开始到部署的一个流程,具体的例子,可以到https://github.com/ansible/ansible-examples 上随意查找,里面应有尽有。

流程如下:

  • 所有主机安装Java (首次执行)
  • Ansible主机安装Maven(首次执行)
  • Ansible主机安装git (首次执行)
  • 使用Ansible shell模块清理残余代码(首次无须执行)
  • Ansible主机使用git 获取Java项目源码
  • Ansible Template替换新源码
  • 使用shell模块,执行mvn package打出jar包或者war包
  • 服务主机安装服务软件Tomcat Nginx Mysql等(首次执行)
  • 关闭服务(如果是热更新,无须关闭)
  • 将jar包或者war包使用copy模块,传输到服务主机
  • 修改服务软件配置等主机环境
  • 启动服务

如果是多项目部署,最好是:

  • 每个项目都有自己的role name,
  • 运维负责在当前role使用的inventory文件中修改配置,
  • 将这些配置通过模板的方式,覆盖到代码的各个配置文件中,
  • 最后打成运行包,传输到承载软件的服务器上,启动即可。

这样不会出现不同环境切换,程序员自己手动改配置,出现:在生产上使用了测试的数据库。生产服务连接测试的 redis,打爆了测试用的redis服务器还造成了严重的数据丢失。

4x00Ansible和Jenkins一键部署

其实很简单,安装Jinkens,用Jinkens 执行

ansible-playbook project-playbool.yml -i inventory-file

下面的东西就交给Ansible了,不再需要用繁琐的Shell脚本来写Jenkins部署脚本了。并且,每个项目都是一键发布,而且不用维护用于项目发布的部署shell,十分轻量,尤其是对微服务,批量扩展和修改很方便。

写到这里就出坑了,毕竟不是专业的运维,多谢观看

5x00 @After

参考:
极力推荐=》https://github.com/ansible/ansible-examples

转载请注明出处: Ansible自动化部署从入门到弃坑

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,383评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,522评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,852评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,621评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,741评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,929评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,076评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,803评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,265评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,582评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,716评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,395评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,039评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,027评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,488评论 2 361
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,612评论 2 350

推荐阅读更多精彩内容