初窥Ansible playbook

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

前言

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

执行playbook命令

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

Ansible提供了一个单独的命令:ansible-playbook命令,我们可以通过这个命令来执行yaml脚本。常见的ansible-playbook的使用方法如下:

最简单的使用方法:

ansible-playbook copyDemo.yaml

我们还可以使用以下命令查看输出的细节:

ansible-playbook copyDemo.yaml --verbose

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

ansible-playbook copyDemo.yaml --list-hosts

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

ansible-playbook copyDemo.yaml --syntax-check

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

playbook基本语法

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

在哪些机器上以什么身份执行

执行的任务有哪些

善后任务有哪些

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

--- - hosts: server1 user: root vars: http_port: 80 max_clients: 200 tasks: - name: Write apache config file template: src=http://www.likecs.com/home/test1/httpd.j2 dest=http://www.likecs.com/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脚本,我们一开始就会看到hosts、user和vars,其中vars在后面的文章进行专门总结。而这里的hosts和user就是表示我们这个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=http://www.likecs.com/home/test1/httpd.j2 dest=http://www.likecs.com/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中一个叫做“幂等性”的概念。

幂等性

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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wppgjs.html