Как вытащить записи изменений из ServiceNow для конкретной системы? - PullRequest
0 голосов
/ 11 апреля 2019

Я пытаюсь автоматизировать исправления и мне нужно найти способ извлечь записи изменений из ServiceNow для конкретных серверов и выяснить, открыто ли окно изменений для этого сервера.

Я пытался сделать это в Ansible, но пока мне не повезло.Мне интересно, есть ли лучший способ сделать это?Может быть, через Python или просто что-то простое с использованием curl и bash?Я слышал, что некоторым людям везет с API остальных, но я очень мало знаю об этом.

Вот пример моей книги с использованием модуля snow_record:

 - hosts: localhost
  connection: local
  gather_facts: no
  ignore_errors: True
  tasks:
  - name: Grab a user record
    snow_record:
      username: testuser
      password: somepass
      instance: myinstance
      state: present
      number: CHG9999
      table: change_request
      lookup_field: cmdb_ci.name=someservername

Вывод ошибки:

  The full traceback is:
    Traceback (most recent call last):
      File "/root/.ansible/tmp/ansible-tmp-1553017980.16-56687342300902/AnsiballZ_snow_record.py", line 113, in <module>
        _ansiballz_main()
      File "/root/.ansible/tmp/ansible-tmp-1553017980.16-56687342300902/AnsiballZ_snow_record.py", line 105, in _ansiballz_main
        invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)
      File "/root/.ansible/tmp/ansible-tmp-1553017980.16-56687342300902/AnsiballZ_snow_record.py", line 48, in invoke_module
        imp.load_module('__main__', mod, module, MOD_DESC)
      File "/tmp/ansible_snow_record_payload_0p5jn8/__main__.py", line 332, in <module>
      File "/tmp/ansible_snow_record_payload_0p5jn8/__main__.py", line 328, in main
      File "/tmp/ansible_snow_record_payload_0p5jn8/__main__.py", line 317, in run_module
    AttributeError: 'module' object has no attribute 'UnexpectedResponse'

    fatal: [localhost]: FAILED! => {
        "changed": false, 
        "module_stderr": "Traceback (most recent call last):\n  File \"/root/.ansible/tmp/ansible-tmp-1553017980.16-56687342300902/AnsiballZ_snow_record.py\", line 113, in <module>\n    _ansiballz_main()\n  File \"/root/.ansible/tmp/ansible-tmp-1553017980.16-56687342300902/AnsiballZ_snow_record.py\", line 105, in _ansiballz_main\n    invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)\n  File \"/root/.ansible/tmp/ansible-tmp-1553017980.16-56687342300902/AnsiballZ_snow_record.py\", line 48, in invoke_module\n    imp.load_module('__main__', mod, module, MOD_DESC)\n  File \"/tmp/ansible_snow_record_payload_0p5jn8/__main__.py\", line 332, in <module>\n  File \"/tmp/ansible_snow_record_payload_0p5jn8/__main__.py\", line 328, in main\n  File \"/tmp/ansible_snow_record_payload_0p5jn8/__main__.py\", line 317, in run_module\nAttributeError: 'module' object has no attribute 'UnexpectedResponse'\n", 
        "module_stdout": "", 
        "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", 
        "rc": 1

Я попробовал snow_record_find.Модуль, который я нашел здесь .

Playbook:

- hosts: mytest
  tasks:
  - name: Grab a user record
    snow_record_find:
      username: testuser
      password: somepass
      instance: someinstance
      #state: present
      #number: null??
      table: change_request
      query:
        AND:
          equals:
            active: "True"
            type: "standard"
            u_change_stage: "80"
          contains:
            u_template: "MY-Template"

Ошибка вывода из этого:

fatal: []: FAILED! => {
    "changed": false, 
    "module_stderr": "Shared connection to  closed.\r\n", 
    "module_stdout": "Traceback (most recent call last):\r\n  File \"/root/.ansible/tmp/ansible-tmp-1553019300.21-10858374496170/AnsiballZ_snow_record_find.py\", line 113, in <module>\r\n    _ansiballz_main()\r\n  File \"/root/.ansible/tmp/ansible-tmp-1553019300.21-10858374496170/AnsiballZ_snow_record_find.py\", line 105, in _ansiballz_main\r\n    invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)\r\n  File \"/root/.ansible/tmp/ansible-tmp-1553019300.21-10858374496170/AnsiballZ_snow_record_find.py\", line 48, in invoke_module\r\n    imp.load_module('__main__', mod, module, MOD_DESC)\r\n  File \"/tmp/ansible_snow_record_find_payload_j9P62r/__main__.py\", line 260, in <module>\r\n  File \"/tmp/ansible_snow_record_find_payload_j9P62r/__main__.py\", line 257, in main\r\n  File \"/tmp/ansible_snow_record_find_payload_j9P62r/__main__.py\", line 249, in run_module\r\n  File \"/usr/lib/python2.7/site-packages/pysnow/legacy_request.py\", line 91, in _all_inner\r\n    yield self._get_content(response)\r\n  File \"/usr/lib/python2.7/site-packages/pysnow/legacy_request.py\", line 332, in _get_content\r\n    server_error['summary'], server_error['details']\r\npysnow.legacy_exceptions.UnexpectedResponse: Unexpected HTTP GET response code. Expected 200, got 401\r\n", 
    "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", 

1 Ответ

2 голосов
/ 12 апреля 2019

К сожалению, то, что вы пытаетесь сделать, нелегко.В ServiceNow отсутствует API, который будет возвращать следующее доступное окно обслуживания для данного элемента конфигурации (CI / Server).

Вы можете выполнить реинжиниринг функциональности График обслуживания и создать собственный API-интерфейс со сценариями на платформе ServiceNow, но это, вероятно, не стоит затраченных усилий.

Только к вашему сведению, вы можете использовать REST API Explorer в ServiceNow для получения фрагментов кода для различных языков, включая Python.

И, наконец, есть некоторые хорошие Учебные пособия по веб-сервису REST доступны в рамках программы разработчика ServiceNow, с помощью которой вы также можете получить бесплатный выделенный экземпляр ServiceNow для игры.

...