Ansible-Playbook介绍
创始人
2025-05-29 22:57:38
0

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-hostslist-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中。

相关内容

热门资讯

血细胞智能检测与计数软件(Py... 摘要:血细胞智能检测与计数软件应用深度学习技术智能检测血细胞图像中红细胞、镰状细胞等不...
PropertyPlaceho... 一、PropertyPlaceholderConfigurer 的继承体系 ​ PropertyPl...
“父母修养”之七:《争取“成功... 据报道,每年高考过后,考生家长离婚率猛增。据统计,2009年、2010年和2011年,每年高考结束后...
教书的是老师,但育人的一定是父... 俞敏洪《教书的是老师,但育人的一定是父母》的文章在网络上广为传播,转载的公众号无数。此论不细看,貌似...
盼孩子成绩好不如盼孩子性格好 ... 许多父母以为,家庭教育的核心就是让孩子学习好,因而掠夺式的开发孩子的智力,两三岁背唐诗,四五岁学英语...
柳州最新学区划分,最新或202... 柳州公办小学招生范围按照义务教育免试就近入学原则,市区公办小学实行依街道划片招生。本文为您介绍柳州小...
桂林最新学区划分,最新或202... 桂林公办小学招生范围按照义务教育免试就近入学原则,市区公办小学实行依街道划片招生。本文为您介绍桂林小...
面试热点题:回溯算法 电话号码... 前言: 如果你一点也不了解什么叫做回溯算法,那么推荐你看看这一篇回溯入门...
JetsonNano搭载的扩展... 在DIY机器人时,我们可以使用远程连接到机器人查看相关信息,也就是前面提...
贺州最新学区划分,最新或202... 最新或2023(历届)1月26日,教育部办公厅下发了《关于做好最新或2023(历届)城市义务教育招生...
百色最新学区划分,最新或202... 从百色右江区教育局了解到,百色右江区小学划片政策已经公布。太阳教育网为大家准备了最新或2023(历届...
渗透学习-CTF篇-web-C... 文章目录前言web入门部分反序列化web254web255web256web257web258 前...
梧州最新学区划分,最新或202... 今年,梧州市万秀区进行了秋季学期小学招生改革,首次采用“学区制”的形式进行招生。近日,有家长提出自己...
贵港最新学区划分,最新或202... 入学对象和安排顺序入学对象基本要求1.小学新生入学对象是城区户籍(包括符合进城务工人员随迁子女条件的...
玉林最新学区划分,最新或202... 江南区古定中心小学,是一所全日制公办小学,始建于1907年,该校于2002年获得了“中国名校”称号。...
钦州最新学区划分,最新或202... 钦州市区最新或2023(历届)初中学区划分方案根据《中华人民共和国义务教育法》《广西壮族自治区实施〈...
温州最新学区划分,最新或202... 温州公办小学招生范围按照义务教育免试就近入学原则,市区公办小学实行依街道划片招生。本文为您介绍温州小...
绍兴最新学区划分,最新或202... 绍兴公办小学招生范围按照义务教育免试就近入学原则,市区公办小学实行依街道划片招生。本文为您介绍绍兴小...
金华最新学区划分,最新或202... 金华公办小学招生范围按照义务教育免试就近入学原则,市区公办小学实行依街道划片招生。本文为您介绍金华小...
湖州最新学区划分,最新或202... 学校名称划片区域湖师附小教育集团(幸福里校区、余家漾校区、西山漾校区)潜庄公寓、白漾港小区、米兰花园...