Базовый сценарий#

Приведенный здесь пример демонстрирует базовые операции с использованием API:

  1. Получение токена доступа.

  2. Создание и синхронизация проекта на основе публичного репозитория Git.

  3. Получение идентификаторов свода правил, среды принятия решений и типа полномочий для потока событий.

  4. Создание полномочия и потока событий.

  5. Создание активации свода правил.

  6. Отправка тестового события {"ping":"pong"}.

  7. Проверка результата через журналы активации, поток событий и аудит правил.

Предварительные требования#

Перед выполнением сценария произведите следующие действия:

  1. Установите на узле, с которого будут выполняться запросы, утилиты curl и jq:

    sudo apt install --yes curl jq
    
  2. Проверьте доступность репозитория с примерами ansible/eda-sample-project.

  3. Получите токен доступа.

Подготовка проекта#

Для подготовки проекта выполните следующие действия:

  1. Создайте проект Event-Driven Automation:

    curl -X POST \
       -H 'Content-Type: application/json' \
       -H 'Authorization: Bearer <your_token>' \
       -d '{
                "name": "<your_project_name>",
                "url": "https://github.com/ansible/eda-sample-project",
                "organization_id": <organization_id>
             }' \
          https://<address>/api/eda/v1/projects/ | jq
    

    Подставьте собственные значения параметров вместо употребленных в примере:

    • <address> – FQDN или IP-адрес шлюза, например 192.168.56.11.

    • <your_token> – токен, полученный при подготовке, например 3wijiG7********VtL2gseJESzjJsD.

    • <your_project_name> – название проекта, например Demo Project.

    • <organization_id> – идентификатор организации, которой будет принадлежать проект, например 1. Пример создания организации с помощью API см. в инструкции.

    Примечание

    При отсутствии удостоверяющего сертификата TLS на рабочей станции добавьте параметр -k в команду curl, например:

    curl -k -X POST ...
    
    Пример вывода
    {
      "name": "Demo Project",
      "description": "",
      "organization_id": 1,
      "eda_credential_id": null,
      "signature_validation_credential_id": null,
      "scm_branch": "",
      "scm_refspec": "",
      "verify_ssl": true,
      "proxy": "",
      "created_by": {
        "id": 1,
        "username": "admin",
        "first_name": "",
        "last_name": ""
      },
      "modified_by": {
        "id": 1,
        "username": "admin",
        "first_name": "",
        "last_name": ""
      },
      "id": 2,
      "url": "https://github.com/ansible/eda-sample-project",
      "scm_type": "git",
      "git_hash": "",
      "import_state": "pending",
      "import_error": null,
      "created_at": "2026-07-03T22:14:37.688303Z",
      "modified_at": "2026-07-03T22:14:37.688318Z"
    }
    
  2. Синхронизируйте проект:

    curl -X POST \
       -H 'Authorization: Bearer <your_token>' \
       https://<address>/api/eda/v1/projects/<project_id>/sync/ | jq
    

    Здесь <project_id> – идентификатор проекта, созданного на предыдущем шаге, например 2.

    Пример вывода
    {
      "name": "Demo Project",
      "description": "",
      "organization_id": 1,
      "eda_credential_id": null,
      "signature_validation_credential_id": null,
      "scm_branch": "",
      "scm_refspec": "",
      "verify_ssl": true,
      "proxy": "",
      "created_by": {
        "id": 1,
        "username": "admin",
        "first_name": "",
        "last_name": ""
      },
      "modified_by": {
        "id": 1,
        "username": "admin",
        "first_name": "",
        "last_name": ""
      },
      "id": 2,
      "url": "https://github.com/ansible/eda-sample-project",
      "scm_type": "git",
      "git_hash": "b40b3d27161fa74654dc517a0f8dc5469bbf265f",
      "import_state": "pending",
      "import_error": null,
      "created_at": "2026-07-03T22:14:37.688303Z",
      "modified_at": "2026-07-03T22:14:54.859646Z"
    }
    

После успешной синхронизации платформа обнаружит своды правил, находящиеся в каталоге extensions/eda/rulebooks.

Получение идентификаторов#

Для выполнения сценария необходимо узнать идентификаторы свода правил, среды принятия решений и типа полномочий. Для этого выполните следующие действия:

  1. Получите список сводов правил:

    curl \
       -H 'Authorization: Bearer <your_token>' \
       https://<address>/api/eda/v1/rulebooks/?project_id=<project_id> | jq
    
    Пример вывода
    {
      "count": 45,
      "next": "/api/eda/v1/rulebooks/?page=2&project_id=2",
      "previous": null,
      "page_size": 20,
      "page": 1,
      "results": [
        {
          "id": 46,
          "name": "multi_event_multi_action.yml",
          "description": "",
          "rulesets": "- name: Multi event and multi action combo\n  hosts: all\n  sources:\n    - ansible.eda.range:\n        limit: 5\n        delay: 0.5\n\n  rules:\n    - name: Multi-match\n      condition:\n        all:\n          - event.i == 1\n          - event.i == 3\n      actions:\n        - print_event:\n        - debug:\n            msg: \"Good night\"\n\n",
          "project_id": 2,
          "organization_id": 1,
          "created_at": "2026-07-03T22:14:41.946220Z",
          "modified_at": "2026-07-03T22:14:41.946302Z"
        },
        {
          "id": 47,
          "name": "basic_workflow_template.yml",
          "description": "",
          "rulesets": "---\n- name: Test run workflow templates\n  hosts: all\n  sources:\n    - ansible.eda.range:\n        limit: 5\n        delay: 10\n  rules:\n    - name: \"Run workflow template\"\n      condition: event.i == 0\n      action:\n        run_workflow_template:\n          name: \"{{ override_workflow_basic | default('workflow_basic') }}\"\n          job_args:\n            extra_vars:\n              fake_execution_time: \"2\"\n          retries: 1\n          delay: 10\n          organization: Default\n",
          "project_id": 2,
          "organization_id": 1,
          "created_at": "2026-07-03T22:14:41.962115Z",
          "modified_at": "2026-07-03T22:14:41.962130Z"
        },
        {
          "id": 48,
          "name": "kafka_feedback.yml",
          "description": "",
          "rulesets": "---\n- name: kafka feedback\n  hosts: all\n  sources:\n    - name: kafka_test\n      ansible.eda.kafka:\n        host: \"{{ host | default('localhost') }}\"\n        port: \"{{ port | default('9092') }}\"\n        cafile: \"{{ eda.filename.cafile | default(None) }}\"\n        certfile: \"{{ eda.filename.certfile | default(None) }}\"\n        keyfile:  \"{{ eda.filename.keyfile | default(None) }}\"\n        encoding: \"{{ encoding | default('utf-8') }}\"\n        topic: \"{{ topic | default('demo') }}\"\n        group_id: \"{{ group_id | default(None) }}\"\n        offset: \"{{ offset | default('latest') }}\"\n        security_protocol: \"{{ security_protocol | default('PLAINTEXT') }}\"\n        sasl_mechanism: \"{{ sasl_mechanism | default('PLAIN') }}\"\n        sasl_plain_username: \"{{ sasl_plain_username | default(None) }}\"\n        sasl_plain_password: \"{{ sasl_plain_password | default(None) }}\"\n        check_hostname: \"{{ check_hostname | default(None) }}\"\n        verify_mode: \"{{ verify_mode | default('CERT_NONE') }}\"\n        feedback: true\n  rules:\n    - name: multi condition\n      condition:\n        all:\n          - event.body.id == 1\n          - event.body.id == 7\n          - event.body.id == 9\n      action:\n        debug:\n",
          "project_id": 2,
          "organization_id": 1,
          "created_at": "2026-07-03T22:14:41.969284Z",
          "modified_at": "2026-07-03T22:14:41.969308Z"
        },
        {
          "id": 49,
          "name": "succeed_and_fail.yml",
          "description": "",
          "rulesets": "# rulebook with failed and successful job templates, \n# to be used with https://github.com/Alex-Izquierdo/eda-awx-project-sample\n  - name: Fail and succeed\n    hosts: all\n    sources:\n      - ansible.eda.range:\n          limit: 3\n    rules:\n      - name: Run multiple actions with success and failure\n        condition: event.i == 0\n        actions:\n          - run_job_template:\n              organization: Default\n              name: \"{{ override_run_basic | default('run_basic') }}\"\n              job_args:\n                extra_vars:\n                  fake_execution_time: '1'\n          - run_job_template:\n              organization: Default\n              name: \"{{ override_fail_basic | default('fail_basic') }}\"\n          - run_job_template:\n              organization: Default\n              name: \"{{ override_run_basic | default('run_basic') }}\"\n              job_args:\n                extra_vars:\n                  fake_execution_time: '1'\n",
          "project_id": 2,
          "organization_id": 1,
          "created_at": "2026-07-03T22:14:41.975877Z",
          "modified_at": "2026-07-03T22:14:41.975891Z"
        },
        {
          "id": 50,
          "name": "colons_with_spaces_in_condition.yml",
          "description": "",
          "rulesets": "---\n- name: colon with spaces in condition\n  hosts: all\n  sources:\n    - name: simple source\n      ansible.eda.generic:\n        payload:\n          - a: 'abc : def'\n          - b: 'xyz : 123'\n          - c: 'xyz : 345'\n          - url: http://www.example.com\n  rules:\n    - name: r1\n      condition: 'event.a == \"abc : def\"'\n      action:\n        print_event:\n    - name: r2\n      condition: >\n        event.b == \"xyz : 123\"\n      action:\n        print_event:\n    - name: r3\n      condition: |\n        event.c == \"xyz : 345\"\n      action:\n        print_event:\n    - name: r4\n      condition: event.url == \"http://www.example.com\"\n      action:\n        print_event:\n",
          "project_id": 2,
          "organization_id": 1,
          "created_at": "2026-07-03T22:14:41.983784Z",
          "modified_at": "2026-07-03T22:14:41.983796Z"
        },
        {
          "id": 51,
          "name": "data_center_label.yml",
          "description": "",
          "rulesets": "---\n- name: Test run job templates with labels\n  hosts: all\n  sources:\n    - ansible.eda.generic:\n        payload:\n           - name: \"{{ event_name }}\"\n             error: 678\n        shutdown_after: 45\n  rules:\n    - name: \"Run job template\"\n      condition: event.error >= 303\n      action:\n        run_job_template:\n          name: \"{{ job_template_name }}\"\n          organization: \"{{ organization }}\"\n          job_args:\n            extra_vars:\n              hello: Fred\n          labels: \n            - \"{{ event.name }}\"\n            - I am label\n            - \"{{ user_label }}\"\n",
          "project_id": 2,
          "organization_id": 1,
          "created_at": "2026-07-03T22:14:41.991625Z",
          "modified_at": "2026-07-03T22:14:41.991635Z"
        },
        {
          "id": 52,
          "name": "range_long_running.yml",
          "description": "",
          "rulesets": "---\n- name: Long Running Range\n  hosts: all\n  sources:\n    - ansible.eda.range:\n        limit: 63072000 # 2 years\n        delay: 1\n  rules:\n    - name: Say Hello long running\n      # Gap increases exponentially the first day\n      # then increases linearly after that\n      # one time per day the first month\n      # after one time per month. \n      condition: >-\n        event.i in [5, 30, 90, 300, 3600, 9000, 18000, 36000]\n        or event.i in [86400,\n                       172800,\n                       259200,\n                       345600,\n                       432000,\n                       518400,\n                       604800,\n                       691200,\n                       777600,\n                       864000,\n                       950400,\n                       1036800,\n                       1123200,\n                       1209600,\n                       1296000,\n                       1382400,\n                       1468800,\n                       1555200,\n                       1641600,\n                       1728000,\n                       1814400,\n                       1900800,\n                       1987200,\n                       2073600,\n                       2160000,\n                       2246400,\n                       2332800,\n                       2419200,\n                       2505600]\n        or event.i in [2591999,\n                       5183999,\n                       7775999,\n                       10367999,\n                       12959999,\n                       15551999,\n                       18143999,\n                       20735999,\n                       23327999,\n                       25919999,\n                       28511999,\n                       31103999,\n                       33695999,\n                       36287999,\n                       38879999,\n                       41471999,\n                       44063999,\n                       46655999,\n                       49247999,\n                       51839999,\n                       54431999,\n                       57023999,\n                       59615999,\n                       62207999]\n      action:\n        debug:\n          msg: \"Hello World!, event.i = {{ event.i }}\"\n",
          "project_id": 2,
          "organization_id": 1,
          "created_at": "2026-07-03T22:14:41.997432Z",
          "modified_at": "2026-07-03T22:14:41.997445Z"
        },
        {
          "id": 53,
          "name": "compare_with_saved_event.yml",
          "description": "",
          "rulesets": "---\n- name: list checks with saved events\n  hosts: all\n  sources:\n    - name: my source\n      ansible.eda.generic:\n        payload:\n           - plu: 4132\n             apples:\n               - gala large apple\n               - gala small apple\n           - fruit: gala large apple\n           - plu: 4284\n             grapefruits:\n               - Ray Ruby\n               - Ruby Red\n           - fruit: Ruby Red\n           - fruit:\n              name: Braeburn\n              plu: 4101\n           - favorite_apple_plus:\n              - 4101\n              - 4103\n              - 4132\n              - 4133\n           - fruit:\n              name: Kent\n              plu: 3488\n           - favorite_mango_plus:\n              - 3488\n              - 4959\n              - 4051\n              - 4312\n  rules:\n    - name: Gala rules\n      condition:\n        all:\n          - events.match << event.plu == 4132\n          - event.fruit in events.match.apples\n      action:\n        print_event:\n          pretty: true\n    - name: Ruby Red rules\n      condition:\n        all:\n          - events.match << event.plu == 4284\n          - events.match.grapefruits contains event.fruit\n      action:\n        print_event:\n          pretty: true\n    - name: Braeburn rules\n      condition:\n        all:\n          - events.apple << event.fruit.name == \"Braeburn\"\n          - events.apple.fruit.plu in event.favorite_apple_plus\n      action:\n        print_event:\n          pretty: true\n    - name: Kent mango rules\n      condition:\n        all:\n          - events.mango << event.fruit.name == \"Kent\"\n          - event.favorite_mango_plus contains events.mango.fruit.plu\n      action:\n        print_event:\n          pretty: true\n",
          "project_id": 2,
          "organization_id": 1,
          "created_at": "2026-07-03T22:14:42.006312Z",
          "modified_at": "2026-07-03T22:14:42.006323Z"
        },
        {
          "id": 54,
          "name": "hello_echo.yml",
          "description": "",
          "rulesets": "---\n- name: Hello World\n  hosts: all\n  sources:\n    - ansible.eda.range:\n        limit: 5\n  rules:\n    - name: Say Hello\n      condition: event.i == 1\n      action:\n        debug:\n          msg: \"Hello World!\"\n",
          "project_id": 2,
          "organization_id": 1,
          "created_at": "2026-07-03T22:14:42.011225Z",
          "modified_at": "2026-07-03T22:14:42.011235Z"
        },
        {
          "id": 55,
          "name": "basic_short.yml",
          "description": "",
          "rulesets": "---\n# Basic rulebook with job template, \n# to be used with https://github.com/Alex-Izquierdo/eda-awx-project-sample\n- name: Basic short\n  hosts: all\n  sources:\n    - ansible.eda.range:\n        limit: 10\n        delay: 0.5\n  rules:\n    - name: Run JT at 8\n      condition: event.i == 8\n      actions:\n        - run_job_template:\n            organization: Default\n            name: \"{{ override_run_basic | default('run_basic') }}\"\n            job_args:\n              extra_vars:\n                fake_execution_time: \"5\"\n\n        - debug:\n            msg: \"Basic short rulebook, event {{ event.i }}\"\n",
          "project_id": 2,
          "organization_id": 1,
          "created_at": "2026-07-03T22:14:42.016452Z",
          "modified_at": "2026-07-03T22:14:42.016463Z"
        },
        {
          "id": 56,
          "name": "basic_workflow_template_failed.yml",
          "description": "",
          "rulesets": "---\n- name: Test run workflow templates with failure\n  hosts: all\n  sources:\n    - ansible.eda.range:\n        limit: 5\n        delay: 10\n  rules:\n    - name: \"Run workflow template\"\n      condition: event.i == 0\n      action:\n        run_workflow_template:\n          name: \"{{ override_workflow_basic_fail | default('workflow_basic_fail') }}\"\n          job_args:\n            extra_vars:\n              fake_execution_time: \"2\"\n          retries: 1\n          delay: 10\n          organization: Default\n",
          "project_id": 2,
          "organization_id": 1,
          "created_at": "2026-07-03T22:14:42.021990Z",
          "modified_at": "2026-07-03T22:14:42.022000Z"
        },
        {
          "id": 57,
          "name": "webhook_defaults.yml",
          "description": "",
          "rulesets": "---\n- name: Run a webhook listener service\n  hosts: all\n  sources:\n    - ansible.eda.webhook:\n  rules:\n    - name: Webhook event\n      condition: event.payload.ping == \"pong\"\n      action:\n        debug:\n          msg: \"Webhook triggered!\"\n\n    - name: Shutdown\n      condition: event.payload.shutdown is defined\n      action:\n        shutdown:\n",
          "project_id": 2,
          "organization_id": 1,
          "created_at": "2026-07-03T22:14:42.027894Z",
          "modified_at": "2026-07-03T22:14:42.027905Z"
        },
        {
          "id": 58,
          "name": "multi_action_delayed.yml",
          "description": "",
          "rulesets": "- name: Multi action with delay\n  hosts: all\n  sources:\n    - ansible.eda.range:\n        limit: 15\n        delay: 1\n\n  rules:\n    - name: Greetings with delay\n      condition: event.i == 1\n      actions:\n        - debug:\n            msg: \"Good morning\"\n        - run_job_template:\n            organization: Default\n            name: \"{{ override_run_basic | default('run_basic') }}\"\n            job_args:\n              extra_vars:\n                fake_execution_time: \"3\"\n        - debug:\n            msg: \"Good night\"\n        - run_job_template:\n            organization: Default\n            name: \"{{ override_run_basic | default('run_basic') }}\"\n            job_args:\n              extra_vars:\n                fake_execution_time: \"2\"\n",
          "project_id": 2,
          "organization_id": 1,
          "created_at": "2026-07-03T22:14:42.034350Z",
          "modified_at": "2026-07-03T22:14:42.034361Z"
        },
        {
          "id": 59,
          "name": "webhook_with_vars.yml",
          "description": "",
          "rulesets": "---\n- name: Test webhook with extra vars\n  hosts: all\n  sources:\n    - name: webhook\n      ansible.eda.webhook:\n        host: 0.0.0.0\n        port: 5555\n  rules:\n    - name: rule1\n      condition: event.payload.username == vars.username\n      action:\n        debug:\n          msg: \"Expected user is here\"\n    - name: Shutdown\n      condition: event.payload.shutdown is defined\n      action:\n        shutdown:\n          \n\n",
          "project_id": 2,
          "organization_id": 1,
          "created_at": "2026-07-03T22:14:42.044064Z",
          "modified_at": "2026-07-03T22:14:42.044075Z"
        },
        {
          "id": 60,
          "name": "multiple_rules_single_fact.yml",
          "description": "",
          "rulesets": "---\n- name: Mutliple rules fired for single fact\n  hosts: all\n  sources:\n    - ansible.eda.range:\n        limit: 5\n  rules:\n    - name: Say Hello\n      condition: event.i == 0\n      action:\n        set_fact:\n          fact:\n             j: 42 \n    - name: fact_rule1\n      condition: fact.j == 42 \n      action:\n        print_event:\n    - name: fact_rule2\n      condition: fact.j == 42 \n      action:\n        debug:\n",
          "project_id": 2,
          "organization_id": 1,
          "created_at": "2026-07-03T22:14:42.049620Z",
          "modified_at": "2026-07-03T22:14:42.049631Z"
        },
        {
          "id": 61,
          "name": "awx_storm.yml",
          "description": "",
          "rulesets": "---\n- name: \"Launch storm of JT's\"\n  hosts: all\n  sources:\n    - ansible.eda.generic:\n        shutdown_after: 3600\n        repeat_count: 100\n        create_index: \"index\"\n        payload:\n          - state: \"down\"\n\n\n  rules:\n    - name: \"Run job template - storm mode\"\n      condition: event.state == \"down\"\n      actions:\n        - debug:\n            msg: \"JT launched for #{{ event.index }}\"\n\n        - run_job_template:\n            name: \"{{ override_run_basic | default('run_basic') }}\"\n            organization: Default\n            job_args:\n              extra_vars:\n                fake_execution_time: \"10\"\n\n        - debug:\n            msg: \"JT executed for #{{ event.index }}\"\n            \n",
          "project_id": 2,
          "organization_id": 1,
          "created_at": "2026-07-03T22:14:42.056826Z",
          "modified_at": "2026-07-03T22:14:42.056837Z"
        },
        {
          "id": 62,
          "name": "one_minute_of_events.yml",
          "description": "",
          "rulesets": "---\n- name: \"One minute of events\"\n  hosts: all\n  sources:\n    - ansible.eda.range:\n        limit: 60\n        delay: 1  # 60 seconds\n  rules:\n    - name: One minute of events rule\n      condition: >-\n        event.i in [\n          0, 10, 20, 30, 40, 50, 59\n        ]\n      action:\n        debug:\n          msg: \"Event {{ event.i }} triggered\"\n",
          "project_id": 2,
          "organization_id": 1,
          "created_at": "2026-07-03T22:14:42.065301Z",
          "modified_at": "2026-07-03T22:14:42.065312Z"
        },
        {
          "id": 63,
          "name": "awx_long_running.yml",
          "description": "",
          "rulesets": "---\n- name: Long Running with Awx JT\n  hosts: all\n  sources:\n    - ansible.eda.generic:\n        loop_count: \"{{ total_loops | default(63072000) | int }}\" # default two years\n        loop_delay: 1\n        event_delay: 5\n        create_index: iteration\n        payload:\n          - user: \"Rick\"\n            universe: C-137\n\n          - user: \"Morty\"\n            universe: C-137\n\n          - user: \"Rick\"\n            universe: C-132\n\n          - user: \"Rick\"\n            universe: J-19-Zeta-1\n\n          - user: \"Beth\"\n            universe: K-22\n\n          - user: \"Jerry\"\n            universe: C-137\n\n  rules:\n    - name: Awx long running rule\n      condition: event.user == \"Rick\" and event.universe == \"C-137\"\n      actions:\n        - run_job_template:\n            organization: Default\n            name: \"{{ override_run_basic | default('run_basic') }}\"\n\n        - debug:\n            msg: \"Awx long running rulebook, event {{ event.iteration }}\"\n",
          "project_id": 2,
          "organization_id": 1,
          "created_at": "2026-07-03T22:14:42.071607Z",
          "modified_at": "2026-07-03T22:14:42.071617Z"
        },
        {
          "id": 64,
          "name": "hello_echo_multiaction_multirule_shutdown.yml",
          "description": "",
          "rulesets": "---\n- name: Hello World with multiaction, multirule and shutdown\n  hosts: all\n  sources:\n    - ansible.eda.range:\n        limit: 10\n        delay: \"{{ delay_seconds | default(2) | int }}\"\n  rules:\n    - name: Set event\n      condition: event.i == 1\n      actions:\n        - debug:\n            msg: \"One has come, delay seconds is {{ delay_seconds | default(2) | int }}\"\n        - print_event:\n            pretty: true\n        - post_event:\n            event:\n              say_hello: true\n\n    - name: Say Hello to everyone\n      condition: event.say_hello == true\n      actions:\n        - debug:\n            msg: \"Hello everyone\"\n        - print_event:\n            pretty: true\n        - shutdown:\n            message: \"Bye bye\"\n\n",
          "project_id": 2,
          "organization_id": 1,
          "created_at": "2026-07-03T22:14:42.078617Z",
          "modified_at": "2026-07-03T22:14:42.078627Z"
        },
        {
          "id": 65,
          "name": "non_alpha_numeric_keys.yml",
          "description": "",
          "rulesets": "---\n- name: non alpha numeric keys\n  hosts: all\n  sources:\n    - ansible.eda.generic:\n        payload:\n          - \"http://www.example.com\": \"down\"\n          - urls:\n              \"http://www.example.com\": \"up\"\n          - नाम: മധു\n\n  rules:\n    - name: r1\n      condition: event[\"http://www.example.com\"] == \"down\"\n      action:\n        debug:\n          msg: \"First check worked\"\n    - name: r2\n      condition: event.urls[\"http://www.example.com\"] == \"up\"\n      action:\n        debug:\n          msg: \"Second check worked\"\n    - name: r3\n      condition: event[\"नाम\"] is search(\"മധു\", ignorecase=true) \n      action:\n        print_event:\n",
          "project_id": 2,
          "organization_id": 1,
          "created_at": "2026-07-03T22:14:42.084446Z",
          "modified_at": "2026-07-03T22:14:42.084456Z"
        }
      ]
    }
    
  2. Найдите в ответе свод правил с названием webhook_defaults.yml и сохраните его идентификатор.

  3. Получите список доступных сред принятия решений:

    curl \
       -H 'Authorization: Bearer <your_token>' \
       https://<address>/api/eda/v1/decision-environments/ | jq
    
    Пример вывода
    {
      "count": 1,
      "next": null,
      "previous": null,
      "page_size": 20,
      "page": 1,
      "results": [
        {
          "name": "Default Decision Environment",
          "description": "",
          "image_url": "hub.astra-automation.ru/aa-2.0/aa-full-de:latest",
          "organization_id": 1,
          "eda_credential_id": null,
          "created_by": {
            "id": 1,
            "username": "admin",
            "first_name": "",
            "last_name": ""
          },
          "modified_by": {
            "id": 1,
            "username": "admin",
            "first_name": "",
            "last_name": ""
          },
          "id": 2,
          "created_at": "2026-07-03T22:14:37.546810Z",
          "modified_at": "2026-07-03T22:14:37.546824Z"
        }
      ]
    }
    
  4. Найдите в ответе среду принятия решений с названием Default Decision Environment и сохраните ее идентификатор.

  5. Получите список типов полномочий:

    curl \
       -H 'Authorization: Bearer <your_token>' \
       https://<address>/api/eda/v1/credential-types/?page_size=100 | jq
    
    Пример вывода
    {
      "count": 16,
      "next": null,
      "previous": null,
      "page_size": 100,
      "page": 1,
      "results": [
        {
          "name": "Astra Automation Platform",
          "namespace": "controller",
          "kind": "cloud",
          "description": "",
          "inputs": {
            "fields": [
              {
                "id": "host",
                "type": "string",
                "label": "Astra Automation Platform",
                "help_text": "Astra Automation Platform base URL to authenticate with."
              },
              {
                "id": "username",
                "type": "string",
                "label": "Username",
                "help_text": "Astra Automation Platform username id to authenticate as.This should not be set if an OAuth token is being used."
              },
              {
                "id": "password",
                "type": "string",
                "label": "Password",
                "secret": true
              },
              {
                "id": "oauth_token",
                "type": "string",
                "label": "OAuth Token",
                "secret": true,
                "help_text": "An OAuth token to use to authenticate with.This should not be set if username/password are being used."
              },
              {
                "id": "verify_ssl",
                "type": "boolean",
                "label": "Verify SSL",
                "secret": false
              },
              {
                "id": "request_timeout",
                "type": "string",
                "label": "Request Timeout",
                "secret": false,
                "default": "10",
                "help_text": "Specify the timeout Ansible should use in requests tothe host. Defaults to 10s"
              }
            ],
            "required": ["host"]
          },
          "injectors": {
            "env": {
              "AAP_TOKEN": "{{oauth_token}}",
              "TOWER_HOST": "{{host}}",
              "AAP_HOSTNAME": "{{host}}",
              "AAP_PASSWORD": "{{password}}",
              "AAP_USERNAME": "{{username}}",
              "AAP_VERIFY_SSL": "{{verify_ssl}}",
              "TOWER_PASSWORD": "{{password}}",
              "TOWER_USERNAME": "{{username}}",
              "CONTROLLER_HOST": "{{host}}",
              "TOWER_VERIFY_SSL": "{{verify_ssl}}",
              "TOWER_OAUTH_TOKEN": "{{oauth_token}}",
              "AAP_REQUEST_TIMEOUT": "{{request_timeout}}",
              "CONTROLLER_PASSWORD": "{{password}}",
              "CONTROLLER_USERNAME": "{{username}}",
              "CONTROLLER_VERIFY_SSL": "{{verify_ssl}}",
              "CONTROLLER_OAUTH_TOKEN": "{{oauth_token}}",
              "CONTROLLER_REQUEST_TIMEOUT": "{{request_timeout}}"
            },
            "extra_vars": {
              "aap_token": "{{oauth_token}}",
              "aap_hostname": "{{host}}",
              "aap_password": "{{password}}",
              "aap_username": "{{username}}",
              "aap_verify_ssl": "{{verify_ssl}}",
              "aap_request_timeout": "{{request_timeout}}"
            }
          },
          "id": 4,
          "created_at": "2026-07-03T03:33:44.241049Z",
          "modified_at": "2026-07-03T03:33:44.241060Z",
          "managed": true
        },
        {
          "name": "Basic Event Stream",
          "namespace": "event_stream",
          "kind": "basic",
          "description": "Credential for EventStreams that use Basic Authentication. It requires a username and password",
          "inputs": {
            "fields": [
              {
                "id": "auth_type",
                "type": "string",
                "label": "Event Stream Authentication Type",
                "hidden": true,
                "default": "basic"
              },
              {
                "id": "username",
                "type": "string",
                "label": "Username",
                "help_text": "The username used to authenticate the incoming event stream"
              },
              {
                "id": "password",
                "type": "string",
                "label": "Password",
                "secret": true,
                "help_text": "The password used to authenticate the incoming event stream"
              },
              {
                "id": "http_header_key",
                "type": "string",
                "label": "HTTP Header Key",
                "hidden": true,
                "default": "Authorization"
              }
            ],
            "required": ["auth_type", "password", "username", "http_header_key"]
          },
          "injectors": {},
          "id": 7,
          "created_at": "2026-07-03T03:33:44.249386Z",
          "modified_at": "2026-07-03T03:33:44.249397Z",
          "managed": true
        }
      ]
    }
    
  6. Найдите в ответе тип полномочий Basic Event Stream и сохраните его идентификатор.

Подготовка потока событий#

Для подготовки потока событий выполните следующие действия:

  1. Создайте полномочие типа Basic Event Stream:

    curl -X POST \
       -H 'Authorization: Bearer <your_token>' \
       -H 'Content-Type: application/json' \
       -d '{
                "name": "<credential_name>",
                "organization_id": <organization_id>,
                "credential_type_id": <credential_type_id>,
                "inputs": {
                   "username": "<username>",
                   "password": "<password>"
                }
             }' \
       https://<address>/api/eda/v1/eda-credentials/ | jq
    

    Подставьте собственные значения параметров вместо употребленных в примере:

    • <credential_name> – название создаваемого полномочия, например basic-event-stream-credential;

    • <credential_type_id> – идентификатор типа полномочий, полученный ранее, например 7;

    • <username> – название учетной записи, используемой для авторизации;

    • <password> – пароль.

    Пример вывода
    {
      "id": 4,
      "name": "basic-event-stream-credential",
      "description": "",
      "managed": false,
      "inputs": {
        "auth_type": "basic",
        "http_header_key": "Authorization",
        "password": "$encrypted$",
        "username": "admin"
      },
      "credential_type": {
        "id": 7,
        "name": "Basic Event Stream",
        "namespace": "event_stream",
        "kind": "basic"
      },
      "organization": {
        "id": 1,
        "name": "Default",
        "description": "The default organization for Astra Automation"
      },
      "references": null,
      "created_at": "2026-07-03T22:15:36.585187Z",
      "modified_at": "2026-07-03T22:15:36.585202Z",
      "created_by": {
        "id": 1,
        "username": "admin",
        "first_name": "",
        "last_name": ""
      },
      "modified_by": {
        "id": 1,
        "username": "admin",
        "first_name": "",
        "last_name": ""
      }
    }
    
  2. Создайте поток событий:

    curl -X POST \
       -H 'Authorization: Bearer <your_token>' \
       -H 'Content-Type: application/json' \
       -d '{
                "name": "<event_stream_name>",
                "organization_id": <organization_id>,
                "eda_credential_id": <eda_credential_id>
            }' \
       https://<address>/api/eda/v1/event-streams/ | jq
    

    Подставьте собственные значения параметров вместо употребленных в примере:

    • <event_stream_name> – название создаваемого потока событий, например basic-auth-stream;

    • <eda_credential_id> – идентификатор полномочия, созданного ранее, например 4.

    Пример вывода
    {
      "name": "basic-auth-stream",
      "test_mode": false,
      "additional_data_headers": "",
      "organization": {
        "id": 1,
        "name": "Default",
        "description": "The default organization for Astra Automation"
      },
      "eda_credential": {
        "id": 4,
        "name": "basic-event-stream-credential",
        "description": "",
        "inputs": {
          "auth_type": "basic",
          "http_header_key": "Authorization",
          "password": "$encrypted$",
          "username": "admin"
        },
        "managed": false,
        "credential_type_id": 7,
        "organization_id": 1
      },
      "event_stream_type": "basic",
      "created_by": {
        "id": 1,
        "username": "admin",
        "first_name": "",
        "last_name": ""
      },
      "modified_by": {
        "id": 1,
        "username": "admin",
        "first_name": "",
        "last_name": ""
      },
      "id": 2,
      "owner": "admin",
      "url": "https://<address>/eda-event-streams/api/eda/v1/external_event_stream/dcbf3ff3-5cf5-4176-9d7a-d3cd2e5c6518/post/",
      "created_at": "2026-07-03T22:15:36.751677Z",
      "modified_at": "2026-07-03T22:15:36.751691Z",
      "test_content_type": "",
      "test_content": "",
      "test_error_message": "",
      "test_headers": "",
      "events_received": 0,
      "last_event_received_at": null
    }
    

    В ответе найдите поля id и url и сохраните их значения. Это URL приема событий, он понадобится для отправки тестового события в контроллер Event-Driven Automation. Этот URL может отличаться по префиксу от URI ресурсов /api/eda/v1/, так как входящий прием событий обслуживается отдельной службой.

Подготовка активации свода правил#

Для подготовки активации свода правил выполните следующие действия:

  1. Узнайте хеш свода правил:

    curl \
       -H 'Authorization: Bearer <your_token>' \
       https://<address>/api/eda/v1/rulebooks/<rulebook_id>/sources/ | jq
    

    Здесь <rulebook_id> – идентификатор свода правил webhook_defaults.yml, например 57.

    Пример вывода
    {
      "count": 1,
      "next": null,
      "previous": null,
      "page_size": 20,
      "page": 1,
      "results": [
        {
          "name": "__SOURCE_1",
          "source_info": "ansible.eda.webhook: null\n",
          "rulebook_hash": "739fc83f68da2f69186cc1a8b5db40ced4f0f668d0a39a73ba37f525c3320fa5"
        }
      ]
    }
    
  2. Создайте активацию свода правил:

    curl -X POST \
       -H 'Authorization: Bearer <your_token>' \
       -H 'Content-Type: application/json' \
       -d '{
                "organization_id": <organization_id>,
                "restart_policy": "on-failure",
                "log_level": "error",
                "is_enabled": true,
                "name": "<activation_name>",
                "project_id": <project_id>,
                "rulebook_id": <rulebook_id>,
                "eda_credentials": [],
                "decision_environment_id": <decision_environment_id>,
                "source_mappings": "- source_name: __SOURCE_1\n  event_stream_id: <event_stream_id>\n  event_stream_name: <event_stream_name>\n  rulebook_hash: <rulebook_hash>\n"
                }' \
       https://<address>/api/eda/v1/activations/ | jq
    

    Подставьте собственные значения параметров вместо употребленных в примере:

    • <activation_name> – название активации свода правил, например webhook-activation.

    • <decision_environment_id> – идентификатор среды принятия решений, например 2.

    • <event_stream_id> – идентификатор потока событий, созданного ранее, например 2.

    • <event_stream_name> – название потока событий, созданного ранее, например basic-auth-stream.

    • <rulebook_hash> – хеш свода правил, полученный на предыдущем шаге.

    Пример вывода
    {
      "id": 2,
      "name": "webhook-activation",
      "description": "",
      "is_enabled": true,
      "decision_environment": {
        "id": 2,
        "name": "Default Decision Environment",
        "description": "",
        "image_url": "hub.astra-automation.ru/aa-2.0/aa-full-de:latest",
        "organization_id": 1
      },
      "status": "pending",
      "git_hash": "b40b3d27161fa74654dc517a0f8dc5469bbf265f",
      "project": {
        "id": 2,
        "git_hash": "b40b3d27161fa74654dc517a0f8dc5469bbf265f",
        "url": "https://github.com/ansible/eda-sample-project",
        "scm_type": "git",
        "name": "Demo Project",
        "description": "",
        "organization_id": 1
      },
      "rulebook": {
        "id": 57,
        "name": "webhook_defaults.yml",
        "description": "",
        "organization_id": 1
      },
      "extra_var": "postgres_db_host: <address>\npostgres_db_name: eda\npostgres_db_password: $encrypted$\npostgres_db_port: 5432\npostgres_db_user: eda\npostgres_sslmode: allow\npostgres_sslpassword: null\n",
      "organization": {
        "id": 1,
        "name": "Default",
        "description": "The default organization for Astra Automation"
      },
      "instances": [],
      "restart_policy": "on-failure",
      "restart_count": 0,
      "rulebook_name": "webhook_defaults.yml",
      "current_job_id": null,
      "ruleset_stats": "",
      "rules_count": 0,
      "rules_fired_count": 0,
      "created_at": "2026-07-03T22:15:58.278733Z",
      "modified_at": "2026-07-03T22:15:58.278747Z",
      "edited_at": null,
      "restarted_at": null,
      "status_message": "Wait for a worker to be available to start activation",
      "awx_token_id": null,
      "log_level": "error",
      "eda_credentials": [],
      "k8s_service_name": "webhook-activation",
      "event_streams": [
        {
          "name": "basic-auth-stream",
          "test_mode": false,
          "additional_data_headers": "",
          "organization": {
            "id": 1,
            "name": "Default",
            "description": "The default organization for Astra Automation"
          },
          "eda_credential": {
            "id": 4,
            "name": "basic-event-stream-credential",
            "description": "",
            "inputs": {
              "auth_type": "basic",
              "http_header_key": "Authorization",
              "password": "$encrypted$",
              "username": "admin"
            },
            "managed": false,
            "credential_type_id": 7,
            "organization_id": 1
          },
          "event_stream_type": "basic",
          "created_by": {
            "id": 1,
            "username": "admin",
            "first_name": "",
            "last_name": ""
          },
          "modified_by": {
            "id": 1,
            "username": "admin",
            "first_name": "",
            "last_name": ""
          },
          "id": 2,
          "owner": "admin",
          "url": "https://<address>/eda-event-streams/api/eda/v1/external_event_stream/dcbf3ff3-5cf5-4176-9d7a-d3cd2e5c6518/post/",
          "created_at": "2026-07-03T22:15:36.751677Z",
          "modified_at": "2026-07-03T22:15:36.751691Z",
          "test_content_type": "",
          "test_content": "",
          "test_error_message": "",
          "test_headers": "",
          "events_received": 0,
          "last_event_received_at": null
        }
      ],
      "source_mappings": "- source_name: __SOURCE_1\n  event_stream_id: 2\n  event_stream_name: basic-auth-stream\n  rulebook_hash: 739fc83f68da2f69186cc1a8b5db40ced4f0f668d0a39a73ba37f525c3320fa5",
      "skip_audit_events": false,
      "log_tracking_id": "43c3c090-be5b-4459-afee-792724003420",
      "created_by": {
        "id": 1,
        "username": "admin",
        "first_name": "",
        "last_name": ""
      },
      "modified_by": {
        "id": 1,
        "username": "admin",
        "first_name": "",
        "last_name": ""
      },
      "edited_by": {
        "id": 1,
        "username": "admin",
        "first_name": "",
        "last_name": ""
      }
    }
    

Отправка тестового события#

После запуска активации отправьте сообщение, имитирующее обнаружение события сервисом webhook. Используемый свод правил ожидает событие с условием event.payload.ping == "pong".

Отправьте запрос вида:

curl -X POST \
   -u "<username>:<password>" \
   -H "Content-Type: application/json" \
   -d '{"ping":"pong"}' \
   <event_stream_url>

Здесь <event_stream_url> – URL приема событий, полученный при создании потока событий.

Проверка результата#

Для проверки выполните следующие действия:

  1. Проверьте поток событий:

    curl \
       -H 'Authorization: Bearer <your_token>' \
       https://<address>/api/eda/v1/event-streams/<event_stream_id>/ | jq
    

    Здесь <event_stream_id> – идентификатор потока событий, созданного ранее, например 2.

    Пример вывода
    {
      "name": "basic-auth-stream",
      "test_mode": false,
      "additional_data_headers": "",
      "organization": {
        "id": 1,
        "name": "Default",
        "description": "The default organization for Astra Automation"
      },
      "eda_credential": {
        "id": 4,
        "name": "basic-event-stream-credential",
        "description": "",
        "inputs": {
          "auth_type": "basic",
          "http_header_key": "Authorization",
          "password": "$encrypted$",
          "username": "admin"
        },
        "managed": false,
        "credential_type_id": 7,
        "organization_id": 1
      },
      "event_stream_type": "basic",
      "created_by": {
        "id": 1,
        "username": "admin",
        "first_name": "",
        "last_name": ""
      },
      "modified_by": {
        "id": 1,
        "username": "admin",
        "first_name": "",
        "last_name": ""
      },
      "id": 2,
      "owner": "admin",
      "url": "https://<address>/eda-event-streams/api/eda/v1/external_event_stream/dcbf3ff3-5cf5-4176-9d7a-d3cd2e5c6518/post/",
      "created_at": "2026-07-03T22:15:36.751677Z",
      "modified_at": "2026-07-03T22:15:36.751691Z",
      "test_content_type": "",
      "test_content": "",
      "test_error_message": "",
      "test_headers": "",
      "events_received": 1,
      "last_event_received_at": "2026-07-03T22:16:38.093467Z"
    }
    

    Убедитесь, что в ответе увеличилось количество принятых событий в поле events_received.

  2. Получите список активаций:

    curl \
       -H 'Authorization: Bearer <your_token>' \
       https://<address>/api/eda/v1/activations/ | jq
    
    Пример вывода
    {
      "count": 1,
      "next": null,
      "previous": null,
      "page_size": 20,
      "page": 1,
      "results": [
        {
          "id": 2,
          "name": "webhook-activation",
          "description": "",
          "is_enabled": true,
          "status": "running",
          "decision_environment_id": 2,
          "project_id": 2,
          "rulebook_id": 57,
          "extra_var": "postgres_db_host: <address>\npostgres_db_name: eda\npostgres_db_password: $encrypted$\npostgres_db_port: 5432\npostgres_db_user: eda\npostgres_sslmode: allow\npostgres_sslpassword: null\n",
          "organization_id": 1,
          "restart_policy": "on-failure",
          "restart_count": 0,
          "rulebook_name": "webhook_defaults.yml",
          "current_job_id": null,
          "rules_count": 2,
          "rules_fired_count": 1,
          "created_at": "2026-07-03T22:15:58.278733Z",
          "modified_at": "2026-07-03T22:16:06.289459Z",
          "edited_at": null,
          "status_message": "Container running activation",
          "awx_token_id": null,
          "log_level": "error",
          "eda_credentials": [],
          "k8s_service_name": "webhook-activation",
          "event_streams": [
            {
              "name": "basic-auth-stream",
              "test_mode": false,
              "additional_data_headers": "",
              "organization": {
                "id": 1,
                "name": "Default",
                "description": "The default organization for Astra Automation"
              },
              "eda_credential": {
                "id": 4,
                "name": "basic-event-stream-credential",
                "description": "",
                "inputs": {
                  "auth_type": "basic",
                  "http_header_key": "Authorization",
                  "password": "$encrypted$",
                  "username": "admin"
                },
                "managed": false,
                "credential_type_id": 7,
                "organization_id": 1
              },
              "event_stream_type": "basic",
              "created_by": {
                "id": 1,
                "username": "admin",
                "first_name": "",
                "last_name": ""
              },
              "modified_by": {
                "id": 1,
                "username": "admin",
                "first_name": "",
                "last_name": ""
              },
              "id": 2,
              "owner": "admin",
              "url": "https://<address>/eda-event-streams/api/eda/v1/external_event_stream/dcbf3ff3-5cf5-4176-9d7a-d3cd2e5c6518/post/",
              "created_at": "2026-07-03T22:15:36.751677Z",
              "modified_at": "2026-07-03T22:15:36.751691Z",
              "test_content_type": "",
              "test_content": "",
              "test_error_message": "",
              "test_headers": "",
              "events_received": 1,
              "last_event_received_at": "2026-07-03T22:16:38.093467Z"
            }
          ],
          "source_mappings": "- source_name: __SOURCE_1\n  event_stream_id: 2\n  event_stream_name: basic-auth-stream\n  rulebook_hash: 739fc83f68da2f69186cc1a8b5db40ced4f0f668d0a39a73ba37f525c3320fa5",
          "skip_audit_events": false,
          "log_tracking_id": "43c3c090-be5b-4459-afee-792724003420",
          "created_by": {
            "id": 1,
            "username": "admin",
            "first_name": "",
            "last_name": ""
          },
          "modified_by": {
            "id": 1,
            "username": "admin",
            "first_name": "",
            "last_name": ""
          },
          "edited_by": {
            "username": "",
            "first_name": "",
            "last_name": ""
          }
        }
      ]
    }
    

    Найдите в ответе активацию со значением running в поле status.

  3. Получите список экземпляров активации:

    curl \
       -H 'Authorization: Bearer <your_token>' \
       https://<address>/api/eda/v1/activations/<activation_id>/instances/ | jq
    

    Здесь <activation_id> – идентификатор активации, полученный на предыдущем шаге.

    Пример вывода
    {
      "count": 1,
      "next": null,
      "previous": null,
      "page_size": 20,
      "page": 1,
      "results": [
        {
          "id": 2,
          "name": "webhook-activation",
          "status": "running",
          "git_hash": "b40b3d27161fa74654dc517a0f8dc5469bbf265f",
          "status_message": "Container running activation",
          "activation_id": 2,
          "organization_id": 1,
          "started_at": "2026-07-03T22:16:01.965448Z",
          "ended_at": null,
          "queue_name": "activation"
        }
      ]
    }
    

    Найдите в ответе экземпляр со значением running в поле status.

  4. Получите журнал экземпляра активации:

    curl \
       -H 'Authorization: Bearer <your_token>' \
       https://<address>/api/eda/v1/activation-instances/<instance_id>/logs/ | jq
    

    Здесь <instance_id> – идентификатор экземпляра, полученный на предыдущем шаге.

    Пример вывода
    {
      "count": 9,
      "next": null,
      "previous": null,
      "page_size": 20,
      "page": 1,
      "results": [
        {
          "id": 173,
          "log": "Creating Job",
          "log_timestamp": 1783116960,
          "log_created_at": null,
          "activation_instance": 2
        },
        {
          "id": 174,
          "log": "Log tracking id: 43c3c090-be5b-4459-afee-792724003420",
          "log_timestamp": 1783116960,
          "log_created_at": null,
          "activation_instance": 2
        },
        {
          "id": 175,
          "log": "Image URL is hub.astra-automation.ru/aa-2.0/aa-full-de:latest",
          "log_timestamp": 1783116960,
          "log_created_at": null,
          "activation_instance": 2
        },
        {
          "id": 176,
          "log": "Container command and args ['ansible-rulebook', '--worker', '--websocket-ssl-verify', 'False', '--websocket-url', 'ws://eda-demo-daphne:8001/api/eda/ws/ansible-rulebook', '--websocket-access-token', '******', '--websocket-refresh-token', '******', '--websocket-token-url', 'http://eda-demo-api:8000/api/eda/v1/auth/token/refresh/', '--id', '2', '--heartbeat', '300']",
          "log_timestamp": 1783116960,
          "log_created_at": null,
          "activation_instance": 2
        },
        {
          "id": 177,
          "log": "Job activation-job-2-2 is running",
          "log_timestamp": 1783116961,
          "log_created_at": null,
          "activation_instance": 2
        },
        {
          "id": 190,
          "log": "",
          "log_timestamp": 1783116998,
          "log_created_at": null,
          "activation_instance": 2
        },
        {
          "id": 191,
          "log": "[debug] ******************************************",
          "log_timestamp": 1783116998,
          "log_created_at": "2026-07-03T22:16:38.576823Z",
          "activation_instance": 2
        },
        {
          "id": 192,
          "log": "Webhook triggered!",
          "log_timestamp": 1783116998,
          "log_created_at": null,
          "activation_instance": 2
        },
        {
          "id": 193,
          "log": "********************************************************************************",
          "log_timestamp": 1783116998,
          "log_created_at": null,
          "activation_instance": 2
        }
      ]
    }
    

    Убедитесь, что в выводе присутствует сообщение Webhook triggered!.

  5. Проверьте аудит правил:

    curl \
        -H 'Authorization: Bearer <your_token>' \
        https://<address>/api/eda/v1/audit-rules/?page_size=100 | jq
    
    Пример вывода
    {
      "count": 2,
      "next": null,
      "previous": null,
      "page_size": 100,
      "page": 1,
      "results": [
        {
          "id": 2,
          "name": "Webhook event",
          "status": "successful",
          "activation_instance": {
            "id": 2,
            "name": "webhook-activation"
          },
          "organization": {
            "id": 1,
            "name": "Default",
            "description": "The default organization for Astra Automation"
          },
          "fired_at": "2026-07-03T22:16:38.134768Z"
        }
      ]
    }
    

    Убедитесь, что правило, сработавшее в созданной ранее активации, имеет значение successful в поле status.

Заключение#

В этом сценарии показано, как с помощью API в Event-Driven Automation создать и настроить ресурсы, необходимые для запуска активации свода правил. В результате подготовлена рабочая активация, связанная с потоком событий, и проверена обработка тестового события. Полученный сценарий можно использовать как базовый пример для дальнейшей интеграции Event-Driven Automation с внешними источниками событий через API.