-
什么是
Ansible
Playbooks
?
Ansible Playbook
是Ansible
的编排语言。在Playbooks
中, 我们定义了我们想要Ansible
做什么。这是一组你提供给Ansible
的指令来发挥它的魔力。
例如上面的例子, 它可以像在不同服务器上按顺序运行一系列命令一样简单,并以特定顺序重新启动这些服务器。或者, 它可能像在公共和私有云基础架构中部署数百个VM
一样复杂,为VM
提供存储, 设置其网络和群集配置,配置其上的应用程序(如Web
服务器或数据库服务器), 设置负载平衡,设置监控组件, 安装和配置备份客户端以及使用有关新VM
的信息更新配置数据库等。 -
Playbooks
的编写
让我们仔细看看行动手册是如何编写的。请记住, 所有Playbook
都是以YAML
格式编写的,就是为什么我们之前花了一些时间来介绍YAML。
Playbook
是包含一组Play
的单个YAML
文件。
一个Play
定义了一组要在单个或一组主机上运行的活动。
tasks
是要在主机上执行的单个操作。tasks
包括在主机上执行命令或脚本、在主机上安装包, 或者执行关闭或重新启动操作。让我们来看看实际的Paly
。这里显示的是一个简单的Ansible Playbook
, 其中包含一个名为play 1
的单一play
。此Play
的目的是在本地主机上一个接一个地运行一组活动。
请记住, 要运行这些操作的hosts
是和name
以及tasks
同一级别定义的。在本例中, 我们只想在本地主机上进行测试, 这就是将其设置为localhost
的原因。hosts
可能是你Inventory
文件里的任何东西。
接下来, 我们在主机上一个接一个地运行一组命令。首先, 我们打印日期, 然后在服务器上运行脚本,然后使用YAML
模块安装httpd
包, 最后使用service
模块启动Web
服务器。让我们看看这个示例剧本格式, 并尝试将它与我们在前面的
YAML
部分中学习的内容联系起来。我做了一个小改动, 把任务列表分成两个单独的部分。
YAML
文件是我们的Playbook
,包含两个Play
,每一个Play
是数组list
,这由破折号-
指出。每个Play
又是一个字典,并有一组名为name
、hosts
和tasks
的属性。记住, 这些是字典的属性,所以顺序并不重要。所以, 即使你交换了name
或hosts
的位置,它仍然有效。
但是, 对于tasks来说, 这是不一样的。如您所见, 这些任务是一个lists
数组,由破折号表示。lists
是有序的集合,因此条目的位置很重要。如果您在这里交换条目的位置,将会使得意义变得不同。
因此,YAML
格式是开发Playbook
的关键,您必须特别注意文件的结构。
hosts
指定为localhost
,这意味着任务下列出的所有这些操作都将在本地主机上执行。您可以在此处指定任何主机或组,但必须确保在创建的Inventory
文件中首先定义主机或组。Inventory
文件中定义的主机必须与Playbook
中使用的hosts
匹配,并且从inventory
文件中检索主机的所有连接信息。如果指定了一个组,则列出的任务将同时在该组下列出的所有主机上执行。让我们转向
module
。tasks
运行的不同操作称为module
。
在本例中,command
、script
、yum
和service
都是Ansible
模块。还有数百个其他模块可开箱即用。有关这些模块的信息可以在Ansible
文档网站上找到,或者您可以简单地运行ansible-doc -l
命令。目前,您只需要了解基本的command
模块。稍后, 我们将更详细地介绍其他一些基本模块。
最后, 一旦你成功地构建了Ansible
剧本, 你如何运行它?很简单
执行ansible-playbook
命令并指定您刚刚创建的Ansible playbook
的名称, 就这样。如果你执行ansible-playbook --help
命令,你将了解更多关于这个命令的一些附加参数。我们将在后面的部分中讨论其中的一些。
-
Ansible中运行命令的两种方式
一种是使用ansible
命令直接运行,一种是使用ansible-playbook
命令。第一种方式适合于一次性任务,例如通过ping
命令controller
和target
主机之间的连通性;重启主机等,这不是ansible
的理想用例,除非是一些特殊的情况;推荐使用第二种方法,而且playbooks
可以被保存在github
这样的源代码库中。
例子: 下面的命令,通过ping
测试inventory
文件中所有的主机的连通性,all
是ansible inventory
默认就有的一个分组,表示的是该文件中所有的主机。ansible all -m ping -i inventory.tex
通过playbook实现,编写下面这个playbook,ping命令没有参数
- name: Test connectivity to target servers hosts: all tasks: - name: Ping test ping:
通过
ansible-playbook
运行上面的playbook
,能够达到相同的效果。更多关于
Ansible
的文章,请参考我的Ansible
专栏:https://blog.csdn.net/u011069294/category_12331290.html