Ansible 与日常工作流集成:第三方服务与调试技巧
1. Ansible Galaxy 任务
有一个任务是选取之前创建的某个角色,对其进行调整以适用于多个操作系统,然后将其发布到 Ansible Galaxy 上。
2. Ansible 与第三方服务集成
Ansible 自带多个核心模块,可与第三方服务协作,提供实时通知,以下是一些常见的第三方服务集成情况。
2.1 Slack 集成
Slack 已迅速成为 IT 服务各部门基于团队的协作服务的首选。它不仅通过其应用目录支持第三方应用,还拥有强大的 API,可将工具引入 Slack 提供的聊天室。
生成令牌步骤 :
1. 登录到你的 Slack 工作区。若没有,可在 Slack 免费注册一个。
2. 使用 Web 客户端或桌面应用登录工作区后,从管理菜单中选择“管理应用”选项。
3. 这将打开浏览器并带你进入工作区的应用目录,在此搜索“传入 Webhook”,然后点击“添加配置”。
4. 选择传入 Webhook 要发布消息的频道,例如选择“general”频道。
5. 选择频道后,会进入一个页面,该页面会提供一个 Webhook URL,务必记录此 URL。
6. 在页面底部的集成设置中,可自定义 Webhook,例如设置描述性标签、自定义名称等。
7. 填写完上述详细信息后,点击“保存设置”按钮。
Ansible 剧本示例 :
---
environment_name: "VPC-Slack"
ec2_region: "eu-west-1"
slack:
token: "TBCRVDMGA/BBCPTPNH1/tyudQIccviG7gh4JnfeoPScc"
username: "Ansible"
icon:
"https://upload.wikimedia.org/wikipedia/commons/thumb/0/05/Robot_icon.svg/2
00px-Robot_icon.svg.png"
发送检查 VPC 是否存在的通知:
- name: Send notification message via Slack all options
slack:
token: "{{ slack.token }}"
msg: "Checking for VPC called '{{ environment_name }}'"
username: "{{ slack.username }}"
icon_url: "{{ slack.icon }}"
link_names: 0
parse: 'full'
创建 VPC 的任务:
- name: ensure that the VPC is present
ec2_vpc_net:
region: "{{ ec2_region }}"
name: "{{ environment_name }}"
state: present
cidr_block: "{{ vpc_cidr_block }}"
resource_tags: { "Name" : "{{ environment_name }}", "Environment" : "{{
environment_name }}" }
register: vpc_info
创建新 VPC 时发送通知:
- name: Send notification message via Slack all options
slack:
token: "{{ slack.token }}"
msg: "VPC called '{{ environment_name }}' created with an ID of '{{
vpc_info.vpc.id }}'"
username: "{{ slack.username }}"
icon_url: "{{ slack.icon }}"
link_names: 0
parse: 'full'
when: vpc_info.changed
发现现有 VPC 时发送通知:
- name: Send notification message via Slack all options
slack:
token: "{{ slack.token }}"
msg: "Found a VPC called '{{ environment_name }}' which has an ID of
'{{ vpc_info.vpc.id }}'"
username: "{{ slack.username }}"
icon_url: "{{ slack.icon }}"
link_names: 0
parse: 'full'
when: vpc_info.changed == false and vpc_info.failed == false
运行剧本 :
$ export AWS_ACCESS_KEY=AKIAI5KECPOTNTTVM3EDA
$ export AWS_SECRET_KEY=Y4B7FFiSWl0Am3VIFc07lgnc/TAtK5+RpxzIGTr
$ ansible-playbook -i production site.yml
2.2 其他服务集成
| 服务名称 | 描述 | 示例代码 |
|---|---|---|
| Campfire | 内置于 Basecamp 的聊天服务 | yaml - name: Send a message to Campfire campfire: subscription: "my_subscription" token: "my_subscription" room: "Demo" notify: "loggins" msg: "The task has completed and all is well" |
| Cisco Webex Teams (Cisco Spark) | 思科的协作服务,提供虚拟会议空间、消息和视频通话 | yaml - name: Send a message to Cisco Spark cisco_spark: recipient_type: "roomId" recipient_id: "{{ spark.room_id }}" message_type: "markdown" personal_token: "{{ spark.token }}" message: "The task has **completed** and all is well" |
| CA Flowdock | 专为与开发人员相关的服务集成而设计的消息服务 | yaml - name: Send a message to a Flowdock inbox flowdock: type: "inbox" token: "{{ flowdock.token }}" from_address: "{{ flowdock.email }}" source: "{{ flowdock.source }}" msg: "The task has completed and all is well" subject: "Task Success" |
| Hipchat | Atlassian 提供的群组消息服务 | yaml - name: Send a message to a Hipchat room hipchat: api: "https://api.hipchat.com/v2/" token: "{{ hipchat.token }}" room: "{{ hipchat.room }}" msg: "The task has completed and all is well" |
| 可配置 Ansible 通过各种配置发送电子邮件 | yaml - name: Send an email using external mail servers mail: host: "{{ mail.smtp_host }}" port: "{{ mail.smtp_port }}" username: "{{ mail.smtp_username }}" password: "{{ mail.smtp_password }}" to: "Russ McKendrick <russ@mckendrick.io>" subject: "Task Success" body: "The task has completed and all is well" delegate_to: localhost | |
| Mattermost | 开源的替代服务 | yaml - name: Send a message to a Mattermost channel mattermost: url: "{{ mattermost.url }}" api_key: "{{ mattermost.api_key }}" text: "The task has completed and all is well" channel: "{{ mattermost.channel }}" username: "{{ mattermost.username }}" icon_url: "{{ mattermost.icon_url }}" |
| Say | 利用现代计算机内置的语音合成功能,让 Ansible 口头通知剧本运行状态 | yaml - name: Say a message on your Ansible host say: msg: "The task has completed and all is well" voice: "Daniel" delegate_to: localhost |
| ServiceNow | 企业级 IT 服务管理软件即服务产品 | yaml - name: Create an incident in ServiceNow snow_record: username: "{{ snow.username }}" password: "{{ snow.password }}" instance: "{{ snow.instance }}" state: "present" data: short_description: "The task has completed and all is well" severity: "3" priority: "3" register: snow_incident |
| Syslog | 将剧本运行结果发送到主机的系统日志,以便传输到中央日志服务 | yaml - name: Send a message to the hosts syslog syslogger: msg: "The task has completed and all is well" priority: "info" facility: "daemon" log_pid: "true" |
| Twilio | 使用 Twilio 账户直接从 Ansible 剧本发送 SMS 消息 | yaml - name: Send an SMS message using Twilio twilio: msg: "The task has completed and all is well" account_sid: "{{ twilio.account }}" auth_token: "{{ twilio.auth }}" from_number: "{{ twilio.from_mumber }}" to_number: "+44 7911 123456" delegate_to: localhost |
以下是第三方服务集成的流程图:
graph LR
A[Ansible] -->|集成| B[Slack]
A -->|集成| C[Campfire]
A -->|集成| D[Cisco Webex Teams]
A -->|集成| E[CA Flowdock]
A -->|集成| F[Hipchat]
A -->|集成| G[Mail]
A -->|集成| H[Mattermost]
A -->|集成| I[Say]
A -->|集成| J[ServiceNow]
A -->|集成| K[Syslog]
A -->|集成| L[Twilio]
3. Ansible 剧本调试器
Ansible 内置了调试器,下面通过一个带有错误的简单剧本示例来介绍如何使用调试器。
示例剧本 :
---
- hosts: localhost
gather_facts: false
debugger: "on_failed"
vars:
message: "The task has completed and all is well"
voice: "Daniel"
tasks:
- name: Say a message on your Ansible host
say:
msg: "{{ massage }}"
voice: "{{ voice }}"
调试过程 :
1. 运行剧本:
$ ansible-playbook playbook.yml
- 由于未传递主机清单文件,会出现警告,但这并不影响,因为我们只想在 Ansible 控制器上运行
say模块。 - Ansible 运行剧本时会出现致命错误,因为任务中使用了未定义的变量
massage。 - 由于我们指示 Ansible 在任务失败时进入交互式调试器,会看到如下提示:
[localhost] TASK: Say a message on your Ansible host (debug)>
- 可以通过以下命令查看错误信息:
p result._result
- 查看任务中使用的变量:
p task.args
- 查看任务可用的变量:
p task_vars
- 发现问题是传递给
msg参数的变量拼写错误,可通过以下命令进行修改:
task.args['msg'] = '{{ message }}'
- 重新运行任务:
redo
通过以上步骤,可以在调试器中实时修改错误并重新运行任务,确保剧本正常执行。
Ansible 与日常工作流集成:第三方服务与调试技巧
4. 第三方服务集成总结
Ansible 与第三方服务的集成能将自动化提升到新高度,不仅可记录结果,还能在剧本运行期间自动执行一些清理工作,并自动通知用户。
例如,在部署新服务器配置时,服务台在 ServiceNow 中发起变更请求。剧本可在执行变更前,使用 fetch 模块将配置文件复制到 Ansible 控制器,然后使用 snow_record 模块将现有配置文件副本附加到变更请求,接着进行更改,并自动更新变更请求结果。
各第三方服务的详细信息可参考以下链接:
- Slack: https://slack.com/
- Campfire: https://basecamp.com/
- Cisco Webex Teams (Cisco Spark): https://www.webex.com/products/teams/
- CA Flowdock: https://www.flowdock.com/
- Mattermost: https://mattermost.com/
- ServiceNow: https://www.servicenow.com/
- Twilio: https://twilio.com/
5. 调试技巧总结
Ansible 的调试器在处理剧本错误时非常有用。以下是调试过程的详细总结表格:
| 步骤 | 操作 | 说明 |
|---|---|---|
| 1 | 运行剧本 | 使用 ansible-playbook playbook.yml 运行剧本 |
| 2 | 处理警告 | 若未传递主机清单文件,会出现警告,但不影响在 Ansible 控制器上运行特定模块 |
| 3 | 捕获错误 | Ansible 运行剧本时,若出现任务失败,会因 debugger: "on_failed" 设置进入交互式调试器 |
| 4 | 查看提示 | 进入交互式调试器后,会看到 [localhost] TASK: ... (debug)> 提示 |
| 5 | 查看错误信息 | 使用 p result._result 查看失败任务的错误信息 |
| 6 | 查看任务变量 | 使用 p task.args 查看任务中使用的变量 |
| 7 | 查看可用变量 | 使用 p task_vars 查看任务可用的变量 |
| 8 | 修改变量 | 发现变量拼写错误等问题后,使用 task.args['msg'] = '{{ message }}' 等命令修改变量 |
| 9 | 重新运行任务 | 使用 redo 命令重新运行任务,验证修改是否生效 |
以下是调试过程的 mermaid 流程图:
graph TD
A[运行剧本] --> B{是否有警告}
B -- 是 --> C[忽略警告,继续执行]
B -- 否 --> C
C --> D{是否有任务失败}
D -- 是 --> E[进入交互式调试器]
D -- 否 --> F[剧本正常执行结束]
E --> G[查看错误信息 p result._result]
G --> H[查看任务变量 p task.args]
H --> I[查看可用变量 p task_vars]
I --> J{是否发现问题}
J -- 是 --> K[修改变量 task.args['msg'] = '{{ message }}']
J -- 否 --> G
K --> L[重新运行任务 redo]
L --> D
6. 实际应用建议
- 第三方服务集成 :根据团队的实际需求选择合适的第三方服务进行集成。例如,若团队主要使用 Slack 进行沟通,可优先集成 Slack 以实时通知剧本运行结果;若涉及企业级 IT 服务管理,可重点关注 ServiceNow 的集成。
- 调试技巧 :在开发剧本时,养成使用调试器的习惯。在剧本中设置
debugger: "on_failed",这样在遇到问题时能快速进入调试模式,定位并解决问题。同时,在调试过程中,仔细查看错误信息和变量,确保修改的准确性。
通过合理运用 Ansible 与第三方服务的集成以及调试技巧,能提高工作效率,减少人为错误,让自动化流程更加稳定可靠。
超级会员免费看
1078

被折叠的 条评论
为什么被折叠?



