Ansible-Playbook介绍
Ansible Playbooks 提供了一种可重复、可重用、简单的配置管理和多机部署系统,非常适合部署复杂的应用程序。如果需要使用 Ansible 多次执行任务,请编写剧本并将其置于源代码管理之下。然后你可以使用 playbook 推送新配置或确认远程系统的配置。 ansible-examples 存储库中的剧本说明了许多有用的技术。 Playbooks的功能:
声明配置 在多台机器上以定义的顺序编排任何手动写入流程的步骤 同步或异步启动任务
1. playbook语法
以 YAML 格式表示,语法最少。如果不熟悉 YAML,YAML 语法概述,并考虑为您的文本编辑器安装一个附加组件(请参阅其他工具和程序)以帮助您在您的 playbook 中编写干净的 YAML 语法。 剧本由有序列表中的一个或多个“plays”组成。每个 play 执行 playbook 总体目标的一部分,运行一个或多个任务。每个任务调用一个 Ansible 模块。
2. 执行playbook
剧本按从上到下的顺序运行。在每个play中,任务也按从上到下的顺序运行。具有多个“play”的 playbook 可以编排多机部署,在服务器上运行一个 play,然后在您的数据库服务器上运行另一个 play,然后在您的网络基础设施上运行第三个 play等等。至少,每个剧本都定义了两件事:
要定位的受管节点,使用pattern 至少执行一个任务
---
- name : update web servers
hosts : webservers
remote_user : root
tasks :
- name : ensure apache is at the latest version
yum :
name : httpd
state : latest
- name : write the apache config file
template :
src : /srv/httpd.j2
dest : /etc/httpd.conf
- name : update db servers
hosts : databases
remote_user : root
tasks :
- name : ensure postgresql is at the latest version
yum :
name : postgresql
state : latest
- name : ensure that postgresql is started
service :
name : postgresql
state : started
3. 执行任务
默认情况下,Ansible 针对与主机模式匹配的所有机器按顺序执行每个任务,一次一个。每个任务执行一个带有特定参数的模块。当一个任务在所有目标机器上执行完毕后,Ansible 会继续执行下一个任务。可以使用策略来更改此默认行为。在每个play中,Ansible 将相同的任务指令应用于所有主机。如果主机上的任务失败,Ansible 会将该主机排除在剧本其余部分的轮换之外。 当运行剧本时,Ansible 会返回有关连接的信息、所有剧本和任务的名称行、每个任务在每台机器上是成功还是失败,以及每个任务是否已在每台机器上进行更改。在剧本执行的底部,Ansible 提供了目标节点及其执行方式的摘要。一般故障和致命的“无法访问”通信尝试在计数中分开。
4. 期望状态
大多数 Ansible 模块会检查是否已达到所需的最终状态,如果已达到该状态,则退出而不执行任何操作,因此重复任务不会改变最终状态。以这种方式运行的模块通常被称为“幂等”。无论您运行 playbook 一次还是多次,结果都应该是相同的。但是,并非所有剧本和模块都以这种方式运行。如果不确定,请先在沙盒环境中测试剧本,然后再在生产环境中多次运行它们。
5. 运行playbooks
ansible-playbook playbook.yml -f 10
6. 处理程序
有时希望运行任务仅当机器已经发生改变时。如:如果任务更新了该服务的配置,可能希望重新启动该服务,但如果配置未更改则不需要。 Ansible 使用处理程序来解决这个用例。处理程序是仅在收到通知时运行的任务。每个处理程序都应该有一个全局唯一的名称。
---
- name : verify apache installation
hosts : webservers
vars :
http_port : 80
max_clients : 200
remote_user : root
tasks :
- name : ensure apache is at the latest version
yum :
name : httpd
state : latest
- name : write the apache config file
template :
src : /srv/httpd.j2
dest : /etc/httpd.conf
notify :
- restart apache
- name : ensure apache is running
service :
name : httpd
state : started
handlers :
- name : restart apache
service :
name : httpd
state : restarted
- name : template configuration file
template :
src : template.j2
dest : /etc/foo.conf
notify :
- restart memcached
- restart apache
handlers :
- name : restart memcached
service :
name : memcached
state : restarted
- name : restart apache
service :
name : apache
state : restarted
7. 管理正在运行的handlers
默认情况下,处理程序在特定播放中的所有任务完成后运行。这种方法是有效的,因为处理程序只运行一次,而不管有多少任务通知它。
tasks :
- shell : some tasks go here
- meta : flush_handlers
- shell : some other tasks
8. handlers变量
handlers :
- name : restart "{ { web_service_name } } "
tasks :
- name : Set host variables based on distribution
include_vars : "{{ ansible_facts.distribution }}.yml"
handlers :
- name : restart web service
service :
name : "{{ web_service_name | default('httpd') }}"
state : restarted
handlers :
- name : restart memcached
service :
name : memcached
state : restarted
listen : "restart web services"
- name : restart apache
service :
name : apache
state : restarted
listen : "restart web services"
tasks :
- name : restart everything
command : echo "this task will restart the web services"
notify : "restart web services"
9. Ansible-pull
如果想反转 Ansible 的架构,以便节点签入到一个中央位置,而不是将配置推送给它们 ansible-pull 是一个小脚本,它将从 git 中检出配置指令的 repo,然后针对该内容运行 ansible-playbook。 假设您对checkout进行负载平衡,ansible-pull 基本上可以无限扩展。 运行 ansible-pull --help
可以看到更多细节 playbook可用于通过 crontab 从推送模式配置 ansible-pull
10. 验证playbook
可能希望在运行 playbook 之前验证它们以捕获语法错误和其他问题。 ansible-playbook 命令提供了几个验证选项,包括 --check
、--diff
、--list-hosts
、list-tasks
和 --syntax-check
。用于验证剧本的工具描述了用于验证和测试剧本的其他工具. 在执行 playbook 之前,您可以使用 ansible-lint 获取详细的、特定于 Ansible 的反馈.
$ ansible-lint verify-apache.yml
[ 403 ] Package installs should not use latest
verify-apache.yml:8
Task/Handler: ensure apache is at the latest version