Ansible-Playbook介绍
文章目录 Ansible-Playbook介绍 1. playbook语法 2. 执行playbook 3. 执行任务 4. 期望状态 5. 运行playbooks 6. 处理程序 7. 管理正在运行的handlers 8. handlers变量 9. Ansible-pull 10. 验证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 至少执行一个任务
# 第一个play指定web服务器,第二个play指定数据库服务器
---
- name: update web servershosts: webserversremote_user: roottasks:- name: ensure apache is at the latest versionyum:name: httpdstate: latest- name: write the apache config filetemplate:src: /srv/httpd.j2dest: /etc/httpd.conf- name: update db servershosts: databasesremote_user: roottasks:- name: ensure postgresql is at the latest versionyum:name: postgresqlstate: latest- name: ensure that postgresql is startedservice:name: postgresqlstate: started# Playbook中可以不止一个host和task,例如上面,playbook给每个play都设置了一个 remote_user ,这是ssh连接的用户账号。可以添加playbook_keywords在playbook,play或者task level影响ansible的行为。Playbook关键字可以控制连接插件,是否使用提权,如何处理错误等等。为了支持各种环境,Ansible 允许在 Ansible 配置或清单中将其中许多参数设置为命令行标志。
3. 执行任务
默认情况下,Ansible 针对与主机模式匹配的所有机器按顺序执行每个任务,一次一个。每个任务执行一个带有特定参数的模块。当一个任务在所有目标机器上执行完毕后,Ansible 会继续执行下一个任务。可以使用策略来更改此默认行为。在每个play中,Ansible 将相同的任务指令应用于所有主机。如果主机上的任务失败,Ansible 会将该主机排除在剧本其余部分的轮换之外。 当运行剧本时,Ansible 会返回有关连接的信息、所有剧本和任务的名称行、每个任务在每台机器上是成功还是失败,以及每个任务是否已在每台机器上进行更改。在剧本执行的底部,Ansible 提供了目标节点及其执行方式的摘要。一般故障和致命的“无法访问”通信尝试在计数中分开。
4. 期望状态
大多数 Ansible 模块会检查是否已达到所需的最终状态,如果已达到该状态,则退出而不执行任何操作,因此重复任务不会改变最终状态。以这种方式运行的模块通常被称为“幂等”。无论您运行 playbook 一次还是多次,结果都应该是相同的。但是,并非所有剧本和模块都以这种方式运行。如果不确定,请先在沙盒环境中测试剧本,然后再在生产环境中多次运行它们。
5. 运行playbooks
# 运行playbook,使用ansible-playbook命令
ansible-playbook playbook.yml -f 10# 使用 --verbose 标志以查看成功模块和不成功模块的详细输出。
6. 处理程序
有时希望运行任务仅当机器已经发生改变时。如:如果任务更新了该服务的配置,可能希望重新启动该服务,但如果配置未更改则不需要。 Ansible 使用处理程序来解决这个用例。处理程序是仅在收到通知时运行的任务。每个处理程序都应该有一个全局唯一的名称。
# 这个playbook,包含了一个简单play包含了变量、远程用户和一个handlers
---
- name: verify apache installationhosts: webserversvars:http_port: 80max_clients: 200remote_user: roottasks:- name: ensure apache is at the latest versionyum:name: httpdstate: latest- name: write the apache config filetemplate:src: /srv/httpd.j2dest: /etc/httpd.confnotify:- restart apache- name: ensure apache is runningservice:name: httpdstate: startedhandlers:- name: restart apacheservice:name: httpdstate: restarted# 第二个task关注handlers,一个简单的task可以有多个handlers
- name: template configuration filetemplate:src: template.j2dest: /etc/foo.confnotify:- restart memcached- restart apachehandlers:- name: restart memcachedservice:name: memcachedstate: restarted- name: restart apacheservice:name: apachestate: restarted
7. 管理正在运行的handlers
默认情况下,处理程序在特定播放中的所有任务完成后运行。这种方法是有效的,因为处理程序只运行一次,而不管有多少任务通知它。
# 如果需要handlers在play结束前,增加一个task刷新使用meta的模块
tasks:- shell: some tasks go here- meta: flush_handlers- shell: some other tasks
8. handlers变量
# Ansible handlers使用变量应避免将变量放在处理程序的名称中,由于处理程序名称是早期模板化的,因此 Ansible 可能没有可用于处理程序名称的值
handlers:
# this handler name may cause your play to fail!
- name: restart "{{ web_service_name }}"# 如果处理程序名称中使用的变量不可用,则整个play失败。在play过程中更改该变量不会导致新创建的处理程序。# 相反,将变量放在处理程序的任务参数中,可以像这样使用 include_vars 加载值
tasks:- name: Set host variables based on distributioninclude_vars: "{{ ansible_facts.distribution }}.yml"handlers:- name: restart web serviceservice:name: "{{ web_service_name | default('httpd') }}"state: restarted# handlers也可以监听,tasks会注意这些
handlers:- name: restart memcachedservice:name: memcachedstate: restartedlisten: "restart web services"- name: restart apacheservice:name: apachestate: restartedlisten: "restart web services"tasks:- name: restart everythingcommand: echo "this task will restart the web services"notify: "restart web services"# 这种用法使得触发多个处理程序变得更加容易。,它还将处理程序与其名称分离,从而更容易在剧本和角色之间共享处理程序(尤其是在使用来自共享源(如 Galaxy)的第 3 方角色时)。# 1. 处理程序是按照定义顺序,而不是按照通知语句中列出的顺序运行,使用 listen 的处理程序也是如此。
# 2. 处理程序名称和侦听主题位于全局命名空间中。
# 3. 处理程序名称是可模板化的,而侦听主题不是。
# 4. 使用唯一的处理程序名称。如果触发多个具有相同名称的处理程序,第一个将被覆盖。只有最后一个定义的才会运行。
# 5. 可以notify一个handler在一个静态模块里面
# 6. 不可以notify一个handler在一个动态模块里面# 注意:
# 1. handlers 在 pre_tasks,tasks和pods_tasks部分在部分结束会自动刷新
# 2. handlers 在 roles 模块中会在task结束自动刷新,但是在任何的task前
# 3. handlers 在play范围内,因此可以在它们定义的角色之外使用
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
# ansible-lint 默认规则页面描述了每个错误。对于 [403],建议的修复方法是将 state: latest 更改为 state: present 在playbook中。