初窥Ansible playbook

Ansible是一个系列文章,我会尽可能以通俗易懂、诙谐幽默的总结方式给你们呈现这些枯燥的知识点,让学习变的有趣一些。
Ansible系列博文直达连接:Ansible入门系列shell

前言

在上一篇文章中说到Ansible有两种玩法,一种是Ansible Ad-Hoc,另外一种是就是这里要说的playbook。playbook是Ansible进行配置管理的组件,虽然Ansible的平常Ad-Hoc命令功能很强大,能完成一些基本的配置管理工做,可是Ad-Hoc命令没法支撑复杂环境的配置管理工做。在咱们实际使用Ansible的工做中,大部分时间都是在编写playbook,接下来就重点说说如何玩转这个playbook。apache

执行playbook命令

咱们都是按照yaml语法规则来编写playbook,至于yaml怎么玩,后面的文章我会总结一下的。在咱们按照要求编写好了yaml文件后,如何来执行这个yaml文件呢?ssh

Ansible提供了一个单独的命令:ansible-playbook命令,咱们能够经过这个命令来执行yaml脚本。常见的ansible-playbook的使用方法以下:异步

最简单的使用方法:学习

ansible-playbook copyDemo.yaml

咱们还可使用如下命令查看输出的细节:设计

ansible-playbook copyDemo.yaml --verbose

咱们也可使用如下命令查看该yaml脚本将影响的主机列表:rest

ansible-playbook copyDemo.yaml --list-hosts

还可使用如下命令检查yaml脚本语法是否正确:code

ansible-playbook copyDemo.yaml --syntax-check

上面的几种使用方法基本就涵盖了咱们平常工做中80%的场景了,剩余的20%场景,好比并行、异步等,不多用到,等真正用到的时候再去查阅相关资料也来的及。而工做中,更多的时候,咱们不是在编写playbook,就是在编写playbook的路上。因此,接下来我重点说说如何写这个playbook,也就是playbook的基本语法。server

playbook基本语法

最基本的playbook脚本分为三个部分:md5

  1. 在哪些机器上以什么身份执行
  2. 执行的任务有哪些
  3. 善后任务有哪些

咱们在编写playbook脚本的时候,老是离不开上面的三个部分的。下面先来一个稍微有点复杂的playbook脚本,让你们先有一个总体的认识。

---
- hosts: server1
  user: root
  vars:
    http_port: 80
    max_clients: 200

  tasks:
    - name: Write apache config file
      template: src=/home/test1/httpd.j2 dest=/home/test2/httpd.conf
      notify:
        - restart apache
    - name: Ensure apache is running
      service: name=httpd state=started

  handlers:
    - name: restart apache
      service: name=httpd state=restarted

如今就对上述三部分稍做详细总结。

主机和用户

上面的yaml脚本,咱们一开始就会看到hostsuservars,其中vars在后面的文章进行专门总结。而这里的hostsuser就是表示咱们这个yaml将要在哪些主机上用哪一个用户身份去操做。而这里的深一层次的关系以下表所示:

key 含义
hosts 为主机的IP,或者主机组名,或者关键字all
user 在远程以哪一个身份执行
become 切换成其余用户身份执行,值为yes或者no
become_method 与become一块儿使用,值能够为sudo/su
become_user 与become一块儿使用,能够是root或者其它用户名

在实际工做中,若是咱们不指定user时,则默认使用链接远程主机的用户进行操做,若是指定了执行用户而与ansible_ssh_user指定用户不一致时,则须要开启become操做,这里的become配置与ansible.cfg中配置将相互配合完成工做,yaml中的become优先级高于ansible.cfg中配置中的优先级。

任务列表

任务列表是整个playbook的核心,对于任务列表,咱们首先须要知道如下三点内容:

  • 任务是从上到下顺序执行的,若是中间发生错误,那么整个playbook会停止;
  • 每个任务都是对模块的一次调用,只是使用不一样的参数和变量而已;
  • 每个任务最好有一个name属性,这样在执行yaml脚本时,能够看到执行进度信息。

对于任务的参数有两种不一样的写法,咱们在编写yaml脚本时,能够按照本身的喜爱进行选择。

写法一:

- name: Write apache config file
  template: src=/home/test1/httpd.j2 dest=/home/test2/httpd.conf

写法二:

- name: Write apache config file
  template: 
    src: /home/test1/httpd.j2
    dest: /home/test2/httpd.conf

这两种写法都是OK的,我通常喜欢第二种写法。

最后,对于任务咱们还须要特别一个点,那就是任务的执行状态。咱们在执行Ansible Ad-Hoc或者ansible-playbook的时候,在输出中都会有一个changed字段,好比:

192.168.1.3                : ok=2    changed=0    unreachable=0    failed=0

或者

192.168.1.3                : ok=2    changed=1    unreachable=0    failed=0

这里的这个changed就是人物的执行状态,可是它为何一会是0,一会有是1呢?这就要说到Ansible中一个叫作“幂等性”的概念。

幂等性

幂等性是数学和计算机科学上一个常见的概念,屡次执行产生的结果不会发生改变,这样的特性就被成为幂等性。

大多数的Ansible模块在设计时保证了幂等性,幂等性保证了Ansible脚本屡次执行状况下的相同结果,尽量的避免使用那些不能知足幂等性的模块。好比咱们常用的shell模块就是非幂等性的。

咱们要明白Ansible是以“结果为导向的”,咱们指定了一个“目标状态”,Ansible会自动判断“当前状态”是否与“目标状态”一致,若是一致,则不进行任何操做;若是不一致,那么就将“当前状态”变成“目标状态”,这就是“幂等性”,“幂等性”能够保证咱们重复的执行同一项操做时,获得的结果是同样的。

那这个幂等性与上面的changed又有什么关系呢?且听我下面慢慢道来!

  • changed为false或者0时,表示Ansible没有进行任何操做,没有“改变什么”;
  • changed为true或者大于0时,表示Ansible执行了操做,“当前状态”已经被Ansible改变成了“目标状态”。

copy这个模块来举例子说明,当咱们准备将一个文件经过Ansible拷贝到远程主机时,copy模块首先检查远程是否已经存在了该文件,若是不存在,则把文件拷贝过去,返回changed为大于0;若是存在时,则开始比对两个文件的md5值,若是md5值一致,则说明两个文件是同样的,则不须要拷贝,此时copy模块则什么都不干,返回changed为0。

总结

经过三篇文章总结了Ansible中的经常使用模块、Ansible Ad-Hoc和ansible-playbook的一些惯用用法,从个人实际学习经验来讲,学到这里,你能够将这三块内容结合起来使用了,至少能够在大家生产环境鼓捣一下了。生来就是折腾,更况且咱们这么拼命、努力的学习呢!

果冻想,认真玩技术的地方。

2019年5月18日,于内蒙古呼和浩特。

相关文章
相关标签/搜索