我们希望听到您的声音!帮助我们深入了解 Ansible 生态系统的现状。
参与 2024 年 Ansible 项目调查

Ansible 和 ServiceNow 第 1 部分,创建和关闭工单

Ansible 和 ServiceNow 第 1 部分,创建和关闭工单

作为一名网络工程师,我讨厌填写工单。无论何时路由器重启或远程站点发生停电,随之而来的工单生成几乎占据了我一天中的 50%。如果有一种方法可以自动化工单创建,我就能节省大量时间。唯一需要提供的东西就是特定于案例的评论部分,需要提供有关问题的更多信息。

虽然工单创建是一项重要的活动,但在当时自动化并不是一个选项。这令人惊讶,因为我的管理层总是要求我在工单中包含更多信息。工单通常会在几个月后才会被审查,有时根本没有创建或包含的信息不相关。

快进到今天,公司现在从工单中进行数据挖掘,使用从工单创建期间直接从设备提取的一组标准事实,例如网络平台、软件版本、正常运行时间等。网络运营 (NetOps) 团队现在使用海量的工单数据来做出预算决策。

例如,如果由于电源问题导致 400 次网络中断,那么 NetOps 就可以提出一个理由,花费 40,000 美元用于电池备份,因为这已经证明可以每年防止大约 400 次中断。能够访问这些指标对于做出明智的业务决策非常有价值。

本系列中的第一个博客介绍了 Ansible 如何自动化来自 ServiceNow(一个流行的基于云的 SaaS 提供商)的变更请求。为了方便起见,ServiceNow 为开发人员提供了一个测试实例来使用 Ansible Playbook,这将用于本博客文章和以后的博客文章。您可以在 ServiceNow 开发人员门户网站上注册您自己的免费开发人员实例。

创建 ServiceNow 工单

Ansible 发行版包含snow_record 模块,该模块使打开和关闭 ServiceNow 工单变得容易。首先需要安装 pysnow Python 库才能使用此模块。

下一个要求是获取用于向您最近创建的基于云的 ServiceNow 开发人员实例进行身份验证的 usernamepasswordinstance

注意:实例应类似于以下格式:dev99999,而不是完整的 URL

instance:_http://dev99999.service-now.com,如下面的 change_request_vars.yml 中所示

---
#snow_record variables

sn_username: admin
sn_password: my_password
sn_instance: dev99999

#data variables

sn_severity: 2
sn_priority: 2

以下是创建 ServiceNow 工单的 Ansible Playbook

---
- name: Create ticket with notes
  hosts: localhost
  gather_facts: no
  connection: local

  tasks:
  - name: include vars
    include_vars: change_request_vars.yml

  - name: Create a change request
    snow_record:
      state: present
      table: change_request
      username: "{{ sn_username }}"
      password: "{{ sn_password }}"
      instance: "{{ sn_instance }}"
      data:
        severity: "{{ sn_severity }}"
        priority: "{{ sn_priority }}"
        short_description: "This is a test opened by Ansible"
    register: new_incident

  - debug:
      var: new_incident.record

利用 ServiceNow API

table 参数决定将打开哪种类型的工单。确定可用其他参数的一个好方法是查看 ServiceNow API 在您创建工单后发回的 JSON 字典。我正在使用 register 为该字典指定一个变量名称,然后使用 debug 在终端中查看它。出于简洁起见,以下是完整字典的一部分

blog_leverage-servicenow-api

这在详细说明您可以在任务的 data 部分添加的参数方面非常方便。如果您只想查看字典的一个参数,例如工单号,您可以简单地修改您的调试使其如下所示

- debug: var=new_incident.record.number

此变量 (var) 定义为从存储的寄存器 new_change_request 中提取,然后显示名为 record 的字典和该字典中名为 number 的参数。

blog_leverage-servicenow-api-2

您可以对记录字典的任何参数执行相同的操作,例如 close_codestatecomments 等。

在 ServiceNow Web 门户中验证更改

接下来,登录到您的 ServiceNow 开发人员实例,并在左侧菜单栏中查看“更改 -> 全部”部分。您应该在列表中看到您的变更请求。

blog_servicenow-screen

请注意,简短描述已由我们的 Ansible Playbook 任务填写:这是一个由 Ansible 打开的测试,以及优先级 2 - 高

blog_servicenow-screen-2

关闭 ServiceNow 工单

既然我们已经演示了如何打开 ServiceNow 工单,我们也应该演示如何关闭或解决工单。这可以通过在另一个 Ansible 任务中指定 state 参数来完成。这里可能会变得棘手,因为 state 既是记录字典的参数,也是 snow_record 模块的参数。请注意 Ansible 中使用的此多用途参数。

以下是我们在创建工单时从 record 字典中提取的片段

blog_closing-servicenow-ticket

请注意,原始 state-5。下面的 Ansible 任务将其更改为 -3,这会导致工单状态从“新建”更改为“授权”。

---
  - name: Modify a change request
    snow_record:
      state: present
      table: change_request
      username: "{{ sn_username }}"
      password: "{{ sn_password }}"
      instance: "{{ sn_instance }}"
      number: CHG0030002
      data:
        state: -3
    register: incident

  - debug: 
      var: incident.record.state

在 ServiceNow 中,change_request 需要经历几个不同的状态才能关闭。不同状态的数字值可以在 ServiceNow 文档中找到。我建议您创建五个独立的 Ansible 任务,每个任务按以下顺序更改状态:-3-2-103。请注意,这些值适用于 ServiceNow Kingston 版本,其他版本可能使用不同的状态编号。您的组织可能还需要其他步骤,但希望本文足以让您入门。此时,您已经学习了如何通过 Ansible Playbook 打开工单和使用特定标签关闭工单。

敬请期待第 2 部分 - 我将描述如何将一组解析后的事实添加到您的工单中。