Ansible-Playbook介绍

AnsiblePlaybook是用YAML编写的配置管理工具,用于声明式地配置多台机器,按顺序执行任务。它允许同步或异步操作,并确保任务幂等性。剧本由plays组成,每个play针对特定主机执行任务。处理程序在需要时执行,如服务重启。Ansible-pull则允许节点从中央仓库拉取配置。验证playbook的工具有助于检查语法错误和问题。
摘要由CSDN通过智能技术生成

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
    • 至少执行一个任务
# 第一个play指定web服务器,第二个play指定数据库服务器
---
- 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

# 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 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

# 第二个task关注handlers,一个简单的task可以有多个handlers
- 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

  • 默认情况下,处理程序在特定播放中的所有任务完成后运行。这种方法是有效的,因为处理程序只运行一次,而不管有多少任务通知它。
# 如果需要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 distribution
    include_vars: "{{ ansible_facts.distribution }}.yml"

handlers:
  - name: restart web service
    service:
      name: "{{ web_service_name | default('httpd') }}"
      state: restarted

# handlers也可以监听,tasks会注意这些
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"
    
# 这种用法使得触发多个处理程序变得更加容易。,它还将处理程序与其名称分离,从而更容易在剧本和角色之间共享处理程序(尤其是在使用来自共享源(如 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中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值