Ansible-playbook

实施playbook

Ansible playbook

play是针对清单中选定的主机运行的一组有序任务,playbook是一个文本文件,其中包含由一个或多个按特定顺序运行的play组成的列表。
Play可以将一系列冗长而复杂的手动管理任务转变为可轻松重复的例程,并且具有可预测的成功成果。在playbook中,可以将play内的任务序列保存为人类可读并可立即运行的形式。根据任务的编写方式,任务本身记录了部署应用或基础架构所需的步骤

Playbook核心元素

  • Hosts: 执行的远程主机列表
  • Tasks:任务集
  • Varniables:内置变量或自定义变量在playbook中调用
  • Templates:模板,及使用模板语法的文件,比如配置文件等
  • Handlers和notity结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
  • tags标签,指定某条任务执行,用于选择运行playbook中的部分代码

格式化playbook

Playbook是以YAML格式编写的文本文件,通常使用扩展名yml保存。Playbook使用空格字符缩进来表示其数据结构。YAML对应用与缩进的空格数量没有严格的要求,但有两个基本的规则:

  • 处于层次结构中同一级别的数据元素(例如同意列表中的项目)必须具有相同的缩进量
  • 如果项目属于其他项目的子项,其缩进量必须大于父项

只有空格字符可以用于缩进,不允许使用tab键。约定俗称的缩进量一般是一级两个空格

Playbook开头的一行由三个破折号(—)组成,这是文档开始标记。其末尾可能使用三个圆点(…)作为文档结束标记,尽管在实践中这通常会省略

Play本身是一个键值对集合。同一play中的键应当使用相同的缩进量。以下示例显示了具有三个键的YAML代码片段。前两个键具有简单的值。第三个将含有三个项目的列表作为值。

- name:example
  hosts:web
  tasks:
    - first
    - second  

作为play中的一部分,tasks属性按顺序实际列出要在受管主机上运行的任务。列表中各项任务本身是一个键值对集合。

还以上面创建用户的play为例,play中唯一任务有两个键:

  • name是记录任务用途的可选标签。最好命名所有的任务,从而帮助记录自动流程中的每一步用途。
  • user是要为这个任务运行的模块。其参数作为一组键值对传递,它们是模块的子项(name、uid和state)。
tasks:
  - name: web
    service:
      name: httpd
      enabled: true
  - name: NTP server is enabled
     service:
      name: chronyd
      enabled: true

提高输出的详细程度

ansible-playbook命令提供的默认输出不提供详细的任务执行信息。ansible-playbook -v命令提供了额外的信息,总共有四个级别。
配置playbook执行的输出详细程序

选项描述
-v显示任务结果
-vv任务结果和任务配置都会显示
-vvv包含关于与受管主机连接的信息
-vvvv增加了连接插件相关的额外详细程序选项,包括受管主机上用于执行脚本的用户以及所执行的脚本

执行空运行

可以使用-C选项对playbook执行空运行。这会使Ansible报告在执行该playbook时将会发生什么更改,但不会对受管主机进行任何实际的更改。

下例演示了一个playbook的空运行,它包含单项任务,可确保在受管主机上安装了最新版本的httpd软件包。注意该空运行报告此任务会对受管主机产生的更改。

ansible-playbook -C webserver.yml

play中的远程用户和特权升级

Play可以将不同的远程用户或特权升级设置用于play,取代配置文件中指定的默认设置。这些在play本身中与hosts或tasks关键字相同的级别上设置。

用户属性

playbook中的任务通常通过与受管主机的网络连接来执行。与临时命令相同,用于任务执行的用户帐户取决于Ansible配置文件/etc/ansible/ansible.cfg中的不同关键字。运行任务的用户可以通过remote_user关键字来定义。不过,如果启用了特权升级,become_user等其他关键字也会发生作用。

如果用于任务执行的Ansible配置中定义的远程用户不合适,可以通过在play中使用remote_user关键字覆盖。

remote_user: remoteuser

特权升级属性
Ansible也提供额外的关键字,从而在playbook内定义特权升级参数。become布尔值关键字可用于启用或禁用特权升级,无论它在Ansible配置文件中的定义为何。它可取yes或true值来启用特权升级,或者取no或false值来禁用它。

becom: true

如果启用了特权升级,则可以使用become_method关键字来定义特定play期间要使用的特权升级方法。

以下示例中指定sudo用于特权升级:

become_method: sudo

此外,启用了特权升级时,become_user关键字可定义特定play上下文内要用于特权升级的用户帐户。

become_user: privileged_user

运行playbook

在运行playbook时,将生成输出来显示所执行的play和任务。输出中也会报告执行的每一项任务的结果。

以下示例中显示了一个简单的playbook的内容,后面是运行它的结果。

[root@client playbook]# cat playbook.yml 
---
- name: create jerry user
  hosts: 192.168.8.128
  tasks:
    - name: jerry
      user:
        name: jerry
        state: present

[root@client playbook]# ansible server -m command -a "id jerry"
192.168.8.128 | CHANGED | rc=0 >>
uid=1001(jerry) gid=1001(jerry)=1001(jerry)

缩写多个playbook

Playbook是一个YAML文件,含有由一个或多个play组成的列表。记住一个play按顺序列出了要对清单中的选定主机执行的任务。因此,如果一个playbook中有多个play,每个play可以将其任务应用到单独的一组主机。

在编排可能涉及对不同主机执行不同任务的复杂部署时,这会大有帮助。我们可以这样进行编写:对一组主机运行一个play,完成后再对另一组主机运行另一个play。

缩写包含多个play的playbook非常简单。Playbook中的各个play编写为playbook中的顶级列表项。各个play是含有常用play关键字的列表项。

[root@client playbook]# cat playbook.yml 
---
- name: first
  hosts: 192.168.8.128
  tasks:
    - name: httpd install
      yum: 
        name: httpd
        status: latest

    - name:
      service:
        name: nginx
        enabled: true

- name: second
  hosts: 192.168.8.130
  tasks:
    - name: mkdir /opt/ABC
      file:
        path: /opt/ABC
        state: directory

[root@client playbook]# ansible-playbook playbook.yml 

PLAY [first] *********************************************************************************

TASK [Gathering Facts] ***********************************************************************
ok: [192.168.8.128]

TASK [install httpd] *************************************************************************
ok: [192.168.8.128]

TASK [enabled httpd] *************************************************************************
changed: [192.168.8.128]

PLAY [second] ********************************************************************************

TASK [Gathering Facts] ***********************************************************************
ok: [192.168.8.130]

TASK [mkdir /opt/ABC] ************************************************************************
changed: [192.168.8.130]

PLAY RECAP ***********************************************************************************
192.168.8.128              : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.8.130              : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

ansible-playbook --syntax-check playbook.yml #用于检查playbook的语法问题

运维发布方式

  • 蓝绿部署
  • 灰度发布
  • 滚动发布
  • 红黑部署

蓝绿部署

用于0 downtime应用上线的一套部署策略。它不需要停机,不用停止老版本,额外搞一套新版本,等测试发现新版本OK后,删除老版本。
在部署新版本前,需要将部署新版本的流量掐断,全部打到OK的老版本上,使用条件,需要两倍的机器资源。

灰度发布

灰度发布又称金丝雀发布

不停止老版本,额外搞一套新版本,常常按照用户设置路由权重,例如90%的用户维持使用老版本,10%的用户尝鲜新版本。不同版本应用共存,经常与A/B测试一起使用,用于测试选择多种方案。
它是对某一产品的发布逐步扩大使用群体范围的一种发布方式,让用户尽早参与,获取用户反馈,完善产品功能,提升产品质量。

滚动发布

一般是取出一个或者多个服务器停止服务,执行更新,并重新将其投入使用。周而复始,直到集群中所有的实例都更新成新版本
比蓝绿部署节约资源,但服务器节点数量多,会很慢。

红黑部署

红黑部署的好处是服务始终在线,同时采用不可变部署的方式,也不像蓝绿部署一样得保持冗余的服务始终在线。

需要注意: 在蓝绿色部署中,两个版本可能暂时同时获取请求,而在红黑中,只有一个版本在任何时间点获得流量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值