diff --git a/README.md b/README.md new file mode 100644 index 0000000..46ca3e6 --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +Test rulebooks collection repository +It contains samples diff --git a/playbooks/set_stats_example.yml b/playbooks/set_stats_example.yml new file mode 100644 index 0000000..a020544 --- /dev/null +++ b/playbooks/set_stats_example.yml @@ -0,0 +1,25 @@ +--- +# This playbook prints a simple debug message and set_stats +- name: Echo Hello, world! + hosts: localhost + gather_facts: yes + tasks: + - debug: msg="Hello, world!" + - set_stats: + data: + my_date: "{{ ansible_date_time.date }}" + my_time: "{{ ansible_date_time.time }}" + my_var: 1 + expose_to_cloud_redhat_com_friend: 'Barney Rubble' + expose_to_cloud_redhat_com_person: + name: 'Fred Flintstone' + age: 45 + city: 'Bedrock' + catchphrase: 'Yabba Dabba Doo' + expose_to_cloud_redhat_com_ips: + - 1.1.1.94 + - 1.1.1.93 + - 1.1.1.97 + original_event: "{{ ansible_eda.event }}" + original_ruleset: "{{ ansible_eda.ruleset }}" + original_rule: "{{ ansible_eda.rule }}" diff --git a/rulebooks/100_million_events.yml b/rulebooks/100_million_events.yml new file mode 100644 index 0000000..582c5af --- /dev/null +++ b/rulebooks/100_million_events.yml @@ -0,0 +1,12 @@ +--- +- name: "Create 100 milliom events" + hosts: all + sources: + - name: range + ansible.eda.range: + limit: 100000000 + rules: + - name: Rule + condition: event.i is defined + action: + none: diff --git a/rulebooks/10_job_template.yml b/rulebooks/10_job_template.yml new file mode 100644 index 0000000..b117e0e --- /dev/null +++ b/rulebooks/10_job_template.yml @@ -0,0 +1,18 @@ +--- +- name: Test run job templates + hosts: all + sources: + - ansible.eda.range: + limit: 10 + rules: + - name: "1 job template" + condition: event.i >= 0 + action: + run_job_template: + name: Demo Job Template + organization: Default + job_args: + extra_vars: + hello: Fred + retries: 1 + delay: 10 diff --git a/rulebooks/10_million_events.yml b/rulebooks/10_million_events.yml new file mode 100644 index 0000000..4fffa53 --- /dev/null +++ b/rulebooks/10_million_events.yml @@ -0,0 +1,12 @@ +--- +- name: "Create 10 milliom events" + hosts: all + sources: + - name: range + ansible.eda.range: + limit: 10000000 + rules: + - name: Rule + condition: event.i is defined + action: + none: diff --git a/rulebooks/10_minute.yml b/rulebooks/10_minute.yml new file mode 100644 index 0000000..78903f2 --- /dev/null +++ b/rulebooks/10_minute.yml @@ -0,0 +1,15 @@ +--- +- name: Runs for 10 minutes + hosts: all + sources: + - name: my test source + ansible.eda.range: + limit: 21 + delay: 30 + rules: + - name: rule with 1 action + condition: event.i > 0 + actions: + - print_event: + pretty: true + - debug: diff --git a/rulebooks/46_job_template.yml b/rulebooks/46_job_template.yml new file mode 100644 index 0000000..58f9ca4 --- /dev/null +++ b/rulebooks/46_job_template.yml @@ -0,0 +1,19 @@ +--- +- name: Test run job templates + hosts: all + sources: + - ansible.eda.range: + limit: "{{ limit | default(3) }}" + delay: 30 + rules: + - name: "Run job template" + condition: event.i >= 0 + action: + run_job_template: + name: Demo Job Template + organization: Default + job_args: + extra_vars: + hello: Fred + retries: 1 + delay: 10 diff --git a/rulebooks/52_once_within.yml b/rulebooks/52_once_within.yml new file mode 100644 index 0000000..03ee680 --- /dev/null +++ b/rulebooks/52_once_within.yml @@ -0,0 +1,28 @@ +--- +- name: 52 once within + hosts: all + sources: + - ansible.eda.generic: + loop_count: "{{ loop_count | default(10) }}" + blob_size: "{{ blob_size | default(64) }}" + payload: + - alert: + level: warning + message: Low disk space + meta: + hosts: HostA + - alert: + level: error + message: Disk failure + meta: + hosts: HostA + rules: + - name: r1 + condition: event.alert.level == "warning" or event.alert.level == "error" + action: + debug: + throttle: + once_within: 30 minutes + group_by_attributes: + - event.meta.hosts + - event.alert.level diff --git a/rulebooks/80_match_multiple_rules.yml b/rulebooks/80_match_multiple_rules.yml new file mode 100644 index 0000000..22b00b6 --- /dev/null +++ b/rulebooks/80_match_multiple_rules.yml @@ -0,0 +1,17 @@ +--- +- name: match multiple rules + hosts: all + match_multiple_rules: true + sources: + - name: range + ansible.eda.range: + limit: 5 + rules: + - name: rule1 + condition: event.i == 1 + action: + debug: + - name: rule2 + condition: event.i == 1 + action: + print_event: diff --git a/rulebooks/alertmanager_with_splitter.yml b/rulebooks/alertmanager_with_splitter.yml new file mode 100644 index 0000000..4e62707 --- /dev/null +++ b/rulebooks/alertmanager_with_splitter.yml @@ -0,0 +1,16 @@ +--- +- name: AlertManager with splitter + hosts: all + sources: + - name: my_alertmanager + ansible.eda.alertmanager: + port: 5555 + host: 0.0.0.0 + filters: + - eda.builtin.event_splitter: + splitter_key: "{{ splitter_key | default('alerts') }}" + rules: + - name: Alert manager event + condition: event.labels.severity == "critical" and event.labels.alertname == "HostUp" + action: + debug: diff --git a/rulebooks/array_of_array.yml b/rulebooks/array_of_array.yml new file mode 100644 index 0000000..9f6ff22 --- /dev/null +++ b/rulebooks/array_of_array.yml @@ -0,0 +1,78 @@ +--- +- name: Test ruleset + hosts: localhost + sources: + - ansible.eda.generic: + payload: + - incident: + id: 671561b1831671506180bea5 + active: false + alerts: + - id: 67156085c048f04e514bdd4d + tags: + - name: alertname + value: MariadbDown + - name: state + value: active + - name: instance + value: adam-db1 + - name: severity + value: critical + - name: summary + value: Endpoint adam-db1 down + - name: alert_type + value: service + - name: host_name + value: adam-db1 + - name: job + value: node-exporter + - name: hostname + value: adam-db1 + - name: name + value: mariadb.service + status: Ok + description: 'Service Down: adam-db1 of job node-exporter has been down for more than 1 minutes.' + sourceSystem: prometheus.amack_prometheus + primaryProperty: instance + secondaryProperty: alertname + - id: 671561b1831671506180bea5 + tags: + - name: bp_secondary_property + value: adam-web1 + - name: summary + value: Endpoint adam-web1 down + - name: fstype + value: xfs + - name: severity + value: critical + - name: instance + value: adam-web1 + - name: host_name + value: adam-web1 + - name: alert_type + value: disk_usage + - name: alert_updates + value: 2 + - name: bp_primary_property + value: disk + - name: mountpoint + value: "/" + - name: job + value: node-exporter + - name: device + value: "/dev/mapper/rhel-root" + - name: hostname + value: adam-web1 + - name: alertname + value: DiskUsage + status: Ok + description: 'Disk Usage: adam-web1 of job node-exporter has a disk usage past the threshold.' + sourceSystem: prometheus.amack_prometheus + primaryProperty: instance + secondaryProperty: alertname + rules: + - name: r1 + condition: event.incident.alerts.tags is selectattr('value', '==', 'DiskUsage') + action: + debug: + msg: Found a match with alerts diff --git a/rulebooks/artifacts_job_template.yml b/rulebooks/artifacts_job_template.yml index e63be96..3f15b55 100644 --- a/rulebooks/artifacts_job_template.yml +++ b/rulebooks/artifacts_job_template.yml @@ -4,19 +4,19 @@ sources: - name: my test source ansible.eda.range: - limit: 10 - delay: 30 + limit: "{{number_of_events |default('10') }}" + delay: "{{delay | default('30') }}" rules: - name: Run job template - condition: event.i == 1 + condition: event.i == 0 action: run_job_template: - name: artifacts example + name: "{{ job_template_name | default('Demo Job Template') }}" organization: Default job_args: extra_vars: hello: Fred - set_facts: True + post_events: True - name: Reacting to output from job condition: event.expose_to_cloud_redhat_com_person.name == "Fred Flintstone" action: diff --git a/rulebooks/artifacts_workflow.yml b/rulebooks/artifacts_workflow.yml new file mode 100644 index 0000000..2dbf84f --- /dev/null +++ b/rulebooks/artifacts_workflow.yml @@ -0,0 +1,23 @@ +--- +- name: Get artifacts from workflow + hosts: all + sources: + - name: my test source + ansible.eda.range: + limit: "{{number_of_events |default('10') }}" + delay: "{{delay | default('30') }}" + rules: + - name: Run workflow + condition: event.i == 0 + action: + run_workflow_template: + name: "{{ workflow_template_name }}" + organization: Default + job_args: + extra_vars: + hello: Fred + post_events: True + - name: Reacting to output from job + condition: event.expose_to_cloud_redhat_com_person.name == "Fred Flintstone" + action: + debug: diff --git a/rulebooks/basic_job_template.yml b/rulebooks/basic_job_template.yml index 9206e9e..113da01 100644 --- a/rulebooks/basic_job_template.yml +++ b/rulebooks/basic_job_template.yml @@ -10,7 +10,7 @@ condition: event.i == 1 action: run_job_template: - name: Hello World + name: Demo Job Template organization: Default job_args: extra_vars: diff --git a/rulebooks/blob_generator.yml b/rulebooks/blob_generator.yml new file mode 100644 index 0000000..f4df097 --- /dev/null +++ b/rulebooks/blob_generator.yml @@ -0,0 +1,23 @@ +--- +- name: Post events with large blobs + hosts: all + sources: + - ansible.eda.generic: + create_index: sequence + blob_size: "{{ BLOB_SIZE }}" + loop_count: "{{ NUMBER_OF_EVENTS }}" + final_payload: + payload: + shutdown: true + payload: + - payload: + ping: pong + manufacturer: Joola + rules: + - name: Generic event + condition: "true == true" + action: + pg_notify: + dsn: "{{ EDA_NOTIFY_DSN }}" + channel: "{{ EDA_NOTIFY_CHANNEL }}" + event: "{{ event }}" diff --git a/rulebooks/demo_controller_multiple.yml b/rulebooks/demo_controller_multiple.yml new file mode 100644 index 0000000..a78174f --- /dev/null +++ b/rulebooks/demo_controller_multiple.yml @@ -0,0 +1,26 @@ +--- +- name: Controller Demo + hosts: all + sources: + - ansible.eda.generic: + event_delay: 5 + loop_delay: 10 + loop_count: "{{ times | default(10) | int }}" + payload: + - i: 1 + - j: 1 + + rules: + - name: Controller Rule + condition: event.i == 1 + action: + run_job_template: + name: Demo Job Template + organization: Default + - name: Missing Job Template Rule + condition: event.j == 1 + action: + run_job_template: + name: Demo Template + organization: Default +... diff --git a/rulebooks/demo_job_template.yml b/rulebooks/demo_job_template.yml new file mode 100644 index 0000000..d698156 --- /dev/null +++ b/rulebooks/demo_job_template.yml @@ -0,0 +1,19 @@ +--- +- name: Demo Job Template + hosts: all + execution_strategy: parallel + sources: + - ansible.eda.generic: + loop_count: "{{ loop_count | default(5) }}" + blob_size: "{{ blob_size | default(2700) }}" + create_index: j + payload: + - name: Fred + + rules: + - name: "Run workflow template" + condition: event.j >= 0 + action: + run_job_template: + name: Demo Job Template + organization: Default diff --git a/rulebooks/demo_jt_wjt_webhook.yml b/rulebooks/demo_jt_wjt_webhook.yml new file mode 100644 index 0000000..4184166 --- /dev/null +++ b/rulebooks/demo_jt_wjt_webhook.yml @@ -0,0 +1,23 @@ +--- +- name: Controller Demo with Parallel Strategy + hosts: all + execution_strategy: parallel + sources: + - ansible.eda.webhook: + port: 5555 + host: 127.0.0.1 + + rules: + - name: Run JT + condition: event.payload.type == "job_template" + action: + run_job_template: + name: "{{ job_template | default('Demo Job Template') }}" + organization: "{{ organization | default('Default') }}" + - name: Run WJT + condition: event.payload.type == "workflow" + action: + run_workflow_template: + name: "{{ workflow | default('Demo Workflow Template') }}" + organization: "{{ organization | default('Default') }}" +... diff --git a/rulebooks/demo_webhook_debug_action.yml b/rulebooks/demo_webhook_debug_action.yml new file mode 100644 index 0000000..05e3b16 --- /dev/null +++ b/rulebooks/demo_webhook_debug_action.yml @@ -0,0 +1,23 @@ +--- +# This rulebook is for demo purposes only +# This webhook listens on port 5555 by default, +# you can override it by passing in an extravar +# called port. If you have other webhook sources +# running on the default port 5555 you might see +# port conflicts. +# It logs every event received so it should work +# with any vendors payload. +# It doesn't use authentication to keep things simple +# +- name: Webhook demo prints all incoming events + hosts: all + sources: + - ansible.eda.webhook: + port: "{{ port | default(5555) }}" + host: 0.0.0.0 + rules: + - name: Webhook rule + condition: true + action: + debug: +... diff --git a/rulebooks/demo_webhook_jt.yml b/rulebooks/demo_webhook_jt.yml new file mode 100644 index 0000000..69beab0 --- /dev/null +++ b/rulebooks/demo_webhook_jt.yml @@ -0,0 +1,28 @@ +--- +# This rulebook is for demo purposes only +# This webhook listens on port 5555 by default, +# you can override it by passing in an extravar +# called port. If you have other webhook sources +# running on the default port 5555 you might see +# port conflicts. +# It logs every event received so it should work +# with any vendors payload. +# It doesn't use authentication to keep things simple +# +- name: Webhook demo prints all incoming events + hosts: all + sources: + - ansible.eda.webhook: + port: "{{ port | default(5555) }}" + host: 0.0.0.0 + rules: + - name: Webhook JT rule + condition: true + action: + run_job_template: + name: "{{ jt_name | default('Demo Job Template') }}" + organization: "{{ organization | default('Default') }}" + job_args: + extra_vars: + sleep: "{{ sleep_seconds | default('5') }}" +... diff --git a/rulebooks/demo_webhook_jt_parallel.yml b/rulebooks/demo_webhook_jt_parallel.yml new file mode 100644 index 0000000..4b4d500 --- /dev/null +++ b/rulebooks/demo_webhook_jt_parallel.yml @@ -0,0 +1,29 @@ +--- +# This rulebook is for demo purposes only +# This webhook listens on port 5555 by default, +# you can override it by passing in an extravar +# called port. If you have other webhook sources +# running on the default port 5555 you might see +# port conflicts. +# It logs every event received so it should work +# with any vendors payload. +# It doesn't use authentication to keep things simple +# +- name: Webhook demo prints all incoming events + hosts: all + execution_strategy: parallel + sources: + - ansible.eda.webhook: + port: "{{ port | default(5555) }}" + host: 0.0.0.0 + rules: + - name: Webhook JT rule parallel + condition: true + action: + run_job_template: + name: "{{ jt_name | default('Demo Job Template') }}" + organization: "{{ organization | default('Default') }}" + job_args: + extra_vars: + sleep: "{{ sleep_seconds | default('5') }}" +... diff --git a/rulebooks/demo_webhook_none_action.yml b/rulebooks/demo_webhook_none_action.yml new file mode 100644 index 0000000..2c89b09 --- /dev/null +++ b/rulebooks/demo_webhook_none_action.yml @@ -0,0 +1,23 @@ +--- +# This rulebook is for demo purposes only +# This webhook listens on port 5555 by default, +# you can override it by passing in an extravar +# called port. If you have other webhook sources +# running on the default port 5555 you might see +# port conflicts. +# It logs every event received so it should work +# with any vendors payload. +# It doesn't use authentication to keep things simple +# +- name: Webhook demo prints all incoming events + hosts: all + sources: + - ansible.eda.webhook: + port: "{{ port | default(5555) }}" + host: 0.0.0.0 + rules: + - name: Webhook rule + condition: true + action: + none: +... diff --git a/rulebooks/demo_webhook_pr_tracker.yml b/rulebooks/demo_webhook_pr_tracker.yml new file mode 100644 index 0000000..58d5f2b --- /dev/null +++ b/rulebooks/demo_webhook_pr_tracker.yml @@ -0,0 +1,23 @@ +--- +- name: GitHub Webhook demo tracks PR opening and closing + hosts: all + sources: + - ansible.eda.webhook: + port: "{{ port | default(5555) }}" + host: 0.0.0.0 + rules: + - name: Track PR opening and closing + condition: + all: + - events.pr_opened << event.payload.pull_request.state == 'open' + - > + events.pr_closed << event.payload.pull_request.state == 'closed' and + event.payload.pull_request.merged and + events.pr_opened.payload.pull_request.id == event.payload.pull_request.id + action: + debug: + msg: + - "Opened {{ events.pr_opened.payload.pull_request.created_at }}" + - "Closed {{ events.pr_closed.payload.pull_request.closed_at }}" + - "PR Number {{ events.pr_closed.payload.number }}" +... diff --git a/rulebooks/demo_webhook_rulebook.yml b/rulebooks/demo_webhook_rulebook.yml new file mode 100644 index 0000000..3e75486 --- /dev/null +++ b/rulebooks/demo_webhook_rulebook.yml @@ -0,0 +1,23 @@ +--- +# This rulebook is for demo purposes only +# This webhook listens on port 5555 by default, +# you can override it by passing in an extravar +# called port. If you have other webhook sources +# running on the default port 5555 you might see +# port conflicts. +# It logs every event received so it should work +# with any vendors payload. +# It doesn't use authentication to keep things simple +# +- name: Webhook demo prints all incoming events + hosts: all + sources: + - ansible.eda.webhook: + port: "{{ port | default(5555) }}" + host: 0.0.0.0 + rules: + - name: Webhook rule + condition: true + action: + print_event: +... diff --git a/rulebooks/demo_workflow_template.yml b/rulebooks/demo_workflow_template.yml new file mode 100644 index 0000000..53a2893 --- /dev/null +++ b/rulebooks/demo_workflow_template.yml @@ -0,0 +1,19 @@ +--- +- name: Test run workflow templates + hosts: all + sources: + - ansible.eda.range: + limit: 5 + rules: + - name: "Run workflow template" + condition: event.i == 1 + action: + run_workflow_template: + name: Demo Workflow Template + job_args: + extra_vars: + hello: Fred + retries: 1 + delay: 10 + set_facts: True + organization: Default diff --git a/rulebooks/duplicate_names.yml b/rulebooks/duplicate_names.yml new file mode 100644 index 0000000..af80df2 --- /dev/null +++ b/rulebooks/duplicate_names.yml @@ -0,0 +1,42 @@ +--- +- name: Rulebook with duplicate names + hosts: all + sources: + - name: my_source + ansible.eda.webhook: + port: 5555 + host: 0.0.0.0 + filters: + - ansible.eda.json_filter: + include_keys: + - payload + - approval + - sys_class_name + - sys_created_by + - category + - urgency + exclude_keys: + - '*' + - name: my_source + ansible.eda.webhook: + port: 5556 + host: 0.0.0.0 + filters: + - ansible.eda.json_filter: + include_keys: + - payload + - repository + - name + - full_name + - url + - sender + - login + - login + - zen + exclude_keys: + - '*' + rules: + - name: Webhook event + condition: true + action: + debug: diff --git a/rulebooks/env_vars.yml b/rulebooks/env_vars.yml new file mode 100644 index 0000000..2555231 --- /dev/null +++ b/rulebooks/env_vars.yml @@ -0,0 +1,27 @@ +--- +- name: Check env vars before generating events + hosts: all + sources: + - ansible.eda.generic: + loop_count: 1 + timestamp: true + create_index: i + check_env_vars: + MY_ENV1: abc + MY_ENV2: xyz + payload: + - message: + name: Fred + - message: + name: Barney + rules: + - name: English comparison using dot notation + condition: event.message.name == "Fred" + action: + print_event: + pretty: True + - name: English comparison using square bracket accessor + condition: event.message["name"] == "Barney" + action: + print_event: + pretty: True diff --git a/rulebooks/generic_webhook_listener.yml b/rulebooks/generic_webhook_listener.yml new file mode 100644 index 0000000..a247d0d --- /dev/null +++ b/rulebooks/generic_webhook_listener.yml @@ -0,0 +1,13 @@ +--- +- name: Generic webhook listener + hosts: all + sources: + - name: my_pg_listener + ansible.eda.pg_listener: + dsn: "{{ EDA_PG_NOTIFY_DSN }}" + channels: "{{ EDA_WEBHOOK_CHANNELS }}" + rules: + - name: webhook data + condition: true + action: + print_event: diff --git a/rulebooks/gitea.yml b/rulebooks/gitea.yml new file mode 100644 index 0000000..2bee1a1 --- /dev/null +++ b/rulebooks/gitea.yml @@ -0,0 +1,125 @@ +--- +- name: Listen for events from Gitea on a webhook + hosts: all + + sources: + - ansible.eda.webhook: + host: 0.0.0.0 + port: 5099 + + rules: + - name: Start the Configure AAP Job Template + condition: | + event.payload.repository.name == "aap_config" + throttle: + once_within: 10 minutes + group_by_attributes: + - event.payload.head_commit.id + action: + run_job_template: + name: "Configure AAP" + organization: "ThuisNet" + + - name: Start the Configure EDA Job Template for eda_config + condition: | + event.payload.repository.name == "eda_config" + action: + run_job_template: + name: "Configure EDA" + organization: "ThuisNet" + + - name: Start the Configure EDA Job Template for eda_rules + condition: | + event.payload.repository.name == "eda_rules" + action: + run_job_template: + name: "Update EDA Activations" + organization: "ThuisNet" + + - name: Start the Configure Hub Job Template + condition: | + event.payload.repository.name == "hub_config" + action: + run_job_template: + name: "Configure Hub" + organization: "ThuisNet" + + - name: Start the Alloy Job Template + condition: | + event.payload.repository.name == "ansible_berries" and + event.payload.commits is selectattr('modified', 'search', 'alloy.yml') + action: + run_job_template: + name: "Alloy Configuration" + organization: "ThuisNet" + + - name: Start the Caddy Job Template + condition: | + event.payload.repository.name == "ansible_berries" and + event.payload.commits is selectattr('modified', 'search', 'caddy.yml') + action: + run_job_template: + name: "Configure Caddy" + organization: "ThuisNet" + + - name: Start the Cockpit Job Template + condition: | + event.payload.repository.name == "ansible_berries" and + event.payload.commits is selectattr('modified', 'search', 'cockpit.yml') + action: + run_job_template: + name: "Configure Cockpit" + organization: "ThuisNet" + + - name: Start the packages Job Template + condition: | + event.payload.repository.name == "ansible_berries" and + event.payload.commits is selectattr('modified', 'search', 'packages') + action: + run_job_template: + name: "Install Packages" + organization: "ThuisNet" + + - name: Start the PostgreSQL Job Template + condition: | + event.payload.repository.name == "ansible_berries" and + event.payload.commits is selectattr('modified', 'search', 'postgresql') + action: + run_job_template: + name: "PostgreSQL 15 Configuration" + organization: "ThuisNet" + + - name: Start the Sudo Job Template + condition: | + event.payload.repository.name == "ansible_berries" and + event.payload.commits is selectattr('modified', 'search', 'sudo.yml') + action: + run_job_template: + name: "Sudo" + organization: "ThuisNet" + + - name: Start the User Management Job Template + condition: | + event.payload.repository.name == "ansible_berries" and + event.payload.commits is selectattr('modified', 'search', 'user_management.yml') + action: + run_job_template: + name: "User Management" + organization: "ThuisNet" + + - name: Start the Time and Timezone Job Template + condition: | + event.payload.repository.name == "ansible_berries" and + event.payload.commits is selectattr('modified', 'search', 'time.yml') + action: + run_job_template: + name: "Time and Timezone" + organization: "ThuisNet" + + - name: Event missed everything + condition: true + action: + debug: + msg: + - "Missed everthing" + - "{{ event }}" diff --git a/rulebooks/githb_webhook.yml b/rulebooks/githb_webhook.yml new file mode 100644 index 0000000..a53fff9 --- /dev/null +++ b/rulebooks/githb_webhook.yml @@ -0,0 +1,13 @@ +--- +- name: GitHub Webhook Example + hosts: all + sources: + - name: my_github + ansible.eda.webhook: + port: 5555 + host: 0.0.0.0 + rules: + - name: Active Webhook event + condition: event.payload.ref == 'refs/heads/main' or event.payload.sender.url == 'https://api.github.com/users/mkanoor' + action: + debug: diff --git a/rulebooks/hackathon.yml b/rulebooks/hackathon.yml new file mode 100644 index 0000000..55080a8 --- /dev/null +++ b/rulebooks/hackathon.yml @@ -0,0 +1,18 @@ +--- +- name: EDA Hackathon Rulebook + hosts: localhost + sources: + - name: listen for alerts + ansible.eda.alertmanager: + host: 0.0.0.0 + port: 5000 + rules: + - name: server down + condition: event.payload.alerts[0].labels.job == "kube-state-metrics" and event.payload.alerts[0].status == "firing" + action: + run_job_template: + organization: Default + name: "{{ job_template_name }}" + job_args: + extra_vars: + job_template_name: "{{ job_template_name }}" diff --git a/rulebooks/kafka_all.yml b/rulebooks/kafka_all.yml new file mode 100644 index 0000000..1b7cedd --- /dev/null +++ b/rulebooks/kafka_all.yml @@ -0,0 +1,22 @@ +--- +- name: kafka feedback + hosts: all + sources: + - name: my_kafka + ansible.eda.kafka: + host: "{{ host | default('localhost') }}" + port: "{{ port | default('9092') }}" + encoding: "{{ encoding | default('utf-8') }}" + topic: "{{ topic | default('demo') }}" + group_id: "{{ group_id | default(None) }}" + offset: "{{ offset | default('latest') }}" + security_protocol: "{{ security_protocol | default('PLAINTEXT') }}" + sasl_mechanism: "{{ sasl_mechanism | default('PLAIN') }}" + sasl_plain_username: "{{ sasl_plain_username | default(None) }}" + sasl_plain_password: "{{ sasl_plain_password | default(None) }}" + feedback: true + rules: + - name: match all + condition: true + action: + debug: diff --git a/rulebooks/kafka_event_router.yml b/rulebooks/kafka_event_router.yml new file mode 100644 index 0000000..c5a6200 --- /dev/null +++ b/rulebooks/kafka_event_router.yml @@ -0,0 +1,68 @@ +--- +- name: Write events to different channels based on color + hosts: all + sources: + - ansible.eda.generic: + create_index: sequence + blob_size: "{{ BLOB_SIZE | default(32) }}" + loop_count: "{{ NUMBER_OF_EVENTS | default(8) }}" + final_payload: + payload: + shutdown: true + payload: + - payload: + ping: pong + manufacturer: Joola + color: red + - payload: + ping: pong + manufacturer: Kettler + color: blue + - payload: + ping: pong + manufacturer: Stiga + color: green + + rules: + - name: Red Event + condition: event.payload.color == "red" + action: + kafka_notify: + topic: "{{ MY_KAFKA_RED_TOPIC | default('red') }}" + event: "{{ event }}" + connection: + bootstrap_servers: "{{ MY_KAFKA_HOST | default('localhost') }}" + - name: Blue Event + condition: event.payload.color == "blue" + action: + kafka_notify: + topic: "{{ MY_KAFKA_BLUE_TOPIC | default('blue') }}" + event: "{{ event }}" + connection: + bootstrap_servers: "{{ MY_KAFKA_HOST | default('localhost') }}" + - name: Green Event + condition: event.payload.color == "green" + action: + kafka_notify: + topic: "{{ MY_KAFKA_GREEN_TOPIC | default('green') }}" + event: "{{ event }}" + connection: + bootstrap_servers: "{{ MY_KAFKA_HOST | default('localhost') }}" + - name: Shutdown Event + condition: event.payload.shutdown + actions: + - kafka_notify: + topic: "{{ MY_KAFKA_RED_TOPIC | default('red') }}" + event: "{{ event }}" + connection: + bootstrap_servers: "{{ MY_KAFKA_HOST | default('localhost') }}" + - kafka_notify: + topic: "{{ MY_KAFKA_BLUE_TOPIC | default('blue') }}" + event: "{{ event }}" + connection: + bootstrap_servers: "{{ MY_KAFKA_HOST | default('localhost') }}" + - kafka_notify: + topic: "{{ MY_KAFKA_GREEN_TOPIC | default('green') }}" + event: "{{ event }}" + connection: + bootstrap_servers: "{{ MY_KAFKA_HOST | default('localhost') }}" diff --git a/rulebooks/kafka_feedback.yml b/rulebooks/kafka_feedback.yml new file mode 100644 index 0000000..7a4b407 --- /dev/null +++ b/rulebooks/kafka_feedback.yml @@ -0,0 +1,26 @@ +--- +- name: kafka feedback + hosts: all + sources: + - name: my_kafka + ansible.eda.kafka: + host: "{{ host | default('localhost') }}" + port: "{{ port | default('9092') }}" + encoding: "{{ encoding | default('utf-8') }}" + topic: "{{ topic | default('demo') }}" + group_id: "{{ group_id | default(None) }}" + offset: "{{ offset | default('latest') }}" + security_protocol: "{{ security_protocol | default('PLAINTEXT') }}" + sasl_mechanism: "{{ sasl_mechanism | default('PLAIN') }}" + sasl_plain_username: "{{ sasl_plain_username | default(None) }}" + sasl_plain_password: "{{ sasl_plain_password | default(None) }}" + feedback: true + rules: + - name: multi condition + condition: + all: + - event.body.id == 1 + - event.body.id == 7 + - event.body.id == 9 + action: + debug: diff --git a/rulebooks/kafka_generator.yml b/rulebooks/kafka_generator.yml new file mode 100644 index 0000000..9ba0ee8 --- /dev/null +++ b/rulebooks/kafka_generator.yml @@ -0,0 +1,24 @@ +--- +- name: Post events with large blobs into Kafka + hosts: all + sources: + - ansible.eda.generic: + create_index: sequence + blob_size: "{{ BLOB_SIZE | default(32) }}" + loop_count: "{{ NUMBER_OF_EVENTS | default(8) }}" + final_payload: + payload: + shutdown: true + payload: + - payload: + ping: pong + manufacturer: Joola + rules: + - name: Generic event + condition: true + action: + kafka_notify: + topic: "{{ MY_KAFKA_TOPIC | default('demo') }}" + event: "{{ event }}" + connection: + bootstrap_servers: "{{ MY_KAFKA_HOST | default('localhost') }}" diff --git a/rulebooks/kafka_gssapi.yml b/rulebooks/kafka_gssapi.yml new file mode 100644 index 0000000..41fa107 --- /dev/null +++ b/rulebooks/kafka_gssapi.yml @@ -0,0 +1,21 @@ +--- +- name: kafka listener + hosts: all + sources: + - name: my_gssapi_kafka + ansible.eda.kafka: + host: "{{ host | default('localhost') }}" + port: "{{ port | default('9092') }}" + encoding: "{{ encoding | default('utf-8') }}" + topic: "{{ topic | default('demo') }}" + group_id: "{{ group_id | default(None) }}" + offset: "{{ offset | default('latest') }}" + security_protocol: "{{ security_protocol | default('PLAINTEXT') }}" + sasl_mechanism: "{{ sasl_mechanism | default('PLAIN') }}" + sasl_kerberos_service_name: "{{ sasl_kerberos_service_name | default(None) }}" + sasl_kerberos_domain_name: "{{ sasl_kerberos_domain_name | default(None) }}" + rules: + - name: log all + condition: true + action: + debug: diff --git a/rulebooks/kafka_listener.yml b/rulebooks/kafka_listener.yml new file mode 100644 index 0000000..20e38d5 --- /dev/null +++ b/rulebooks/kafka_listener.yml @@ -0,0 +1,19 @@ +--- +- name: kafka listener + hosts: all + sources: + - name: my_kafka_listener + ansible.eda.kafka: + host: "{{ MY_KAFKA_HOST | default('localhost') }}" + topic: "{{ MY_KAFKA_TOPIC | default('demo') }}" + port: 9092 + offset: latest + rules: + - name: listener ping + condition: event.body.payload.ping == "pong" + action: + none: + - name: listener shutdown + condition: event.body.payload.shutdown is defined + action: + shutdown: diff --git a/rulebooks/kafka_mtls.yml b/rulebooks/kafka_mtls.yml new file mode 100644 index 0000000..f7176ca --- /dev/null +++ b/rulebooks/kafka_mtls.yml @@ -0,0 +1,27 @@ +--- +- name: kafka listener + hosts: all + sources: + - name: my_kafka_listener + ansible.eda.kafka: + host: "{{ host | default('localhost') }}" + port: "{{ port | default('9092') }}" + cafile: "{{ eda.filename.cafile | default(None) }}" + certfile: "{{ eda.filename.certfile | default(None) }}" + keyfile: "{{ eda.filename.keyfile | default(None) }}" + password: "{{ key_password | default(None) }}" + check_hostname: "{{ check_hostname | default(true) }}" + verify_mode: "{{ verify_mode | default('CERT_REQUIRED') }}" + encoding: "{{ encoding | default('utf-8') }}" + topic: "{{ topic | default('demo') }}" + group_id: "{{ group_id | default(None) }}" + offset: "{{ offset | default('latest') }}" + security_protocol: "{{ security_protocol | default('PLAINTEXT') }}" + sasl_mechanism: "{{ sasl_mechanism | default('PLAIN') }}" + sasl_plain_username: "{{ sasl_plain_username | default(None) }}" + sasl_plain_password: "{{ sasl_plain_password | default(None) }}" + rules: + - name: log all + condition: true + action: + debug: diff --git a/rulebooks/kafka_no_feedback.yml b/rulebooks/kafka_no_feedback.yml new file mode 100644 index 0000000..b33563c --- /dev/null +++ b/rulebooks/kafka_no_feedback.yml @@ -0,0 +1,25 @@ +--- +- name: kafka feedback + hosts: all + sources: + - name: my_kafka + ansible.eda.kafka: + host: "{{ host | default('localhost') }}" + port: "{{ port | default('9092') }}" + encoding: "{{ encoding | default('utf-8') }}" + topic: "{{ topic | default('demo') }}" + group_id: "{{ group_id | default(None) }}" + offset: "{{ offset | default('latest') }}" + security_protocol: "{{ security_protocol | default('PLAINTEXT') }}" + sasl_mechanism: "{{ sasl_mechanism | default('PLAIN') }}" + sasl_plain_username: "{{ sasl_plain_username | default(None) }}" + sasl_plain_password: "{{ sasl_plain_password | default(None) }}" + rules: + - name: multi condition + condition: + all: + - event.body.id == 1 + - event.body.id == 7 + - event.body.id == 9 + action: + debug: diff --git a/rulebooks/kafka_oauthbearer.yml b/rulebooks/kafka_oauthbearer.yml new file mode 100644 index 0000000..f4e3493 --- /dev/null +++ b/rulebooks/kafka_oauthbearer.yml @@ -0,0 +1,33 @@ +--- +- name: kafka listener + hosts: all + sources: + - name: my_kafka_listener + ansible.eda.kafka: + host: "{{ host | default('localhost') }}" + port: "{{ port | default('9092') }}" + cafile: "{{ eda.filename.cafile | default(None) }}" + certfile: "{{ eda.filename.certfile | default(None) }}" + keyfile: "{{ eda.filename.keyfile | default(None) }}" + password: "{{ key_password | default(None) }}" + check_hostname: "{{ check_hostname | default(true) }}" + verify_mode: "{{ verify_mode | default('CERT_REQUIRED') }}" + encoding: "{{ encoding | default('utf-8') }}" + topic: "{{ topic | default('demo') }}" + group_id: "{{ group_id | default(None) }}" + offset: "{{ offset | default('latest') }}" + security_protocol: "{{ security_protocol | default('PLAINTEXT') }}" + sasl_mechanism: "{{ sasl_mechanism | default('PLAIN') }}" + sasl_plain_username: "{{ sasl_plain_username | default(None) }}" + sasl_plain_password: "{{ sasl_plain_password | default(None) }}" + sasl_oauth_token_endpoint: "{{ sasl_oauth_token_endpoint | default(None) }}" + sasl_oauth_client_id: "{{ sasl_oauth_client_id | default(None) }}" + sasl_oauth_client_secret: "{{ sasl_oauth_client_secret | default(None) }}" + sasl_oauth_audience: "{{ sasl_oauth_audience | default(None) }}" + sasl_oauth_method: "{{ sasl_oauth_method | default('client_secret_post') }}" + sasl_oauth_scope: "{{ sasl_oauth_scope | default(None) }}" + rules: + - name: log all + condition: true + action: + debug: diff --git a/rulebooks/kafka_sce.yml b/rulebooks/kafka_sce.yml new file mode 100644 index 0000000..9a858b7 --- /dev/null +++ b/rulebooks/kafka_sce.yml @@ -0,0 +1,21 @@ +--- +- name: kafka feedback + hosts: all + sources: + - name: my_kafka + ansible.eda.kafka: + host: "{{ host | default('localhost') }}" + port: "{{ port | default('9092') }}" + encoding: "{{ encoding | default('utf-8') }}" + topic: "{{ topic | default('demo') }}" + group_id: "{{ group_id | default(None) }}" + offset: "{{ offset | default('latest') }}" + security_protocol: "{{ security_protocol | default('PLAINTEXT') }}" + sasl_mechanism: "{{ sasl_mechanism | default('PLAIN') }}" + sasl_plain_username: "{{ sasl_plain_username | default(None) }}" + sasl_plain_password: "{{ sasl_plain_password | default(None) }}" + rules: + - name: single event condition + condition: event.body.id == 1 + action: + debug: diff --git a/rulebooks/kafka_with_avro.yml b/rulebooks/kafka_with_avro.yml new file mode 100644 index 0000000..def8997 --- /dev/null +++ b/rulebooks/kafka_with_avro.yml @@ -0,0 +1,24 @@ +--- +- name: kafka with avro dynamic schema + hosts: all + sources: + - name: my_avro_kafka + ansible.eda.kafka: + host: "{{ host | default('localhost') }}" + port: "{{ port | default('9092') }}" + encoding: "{{ encoding | default('utf-8') }}" + topic: "{{ topic | default('demo') }}" + group_id: "{{ group_id | default(None) }}" + offset: "{{ offset | default('latest') }}" + security_protocol: "{{ security_protocol | default('PLAINTEXT') }}" + sasl_mechanism: "{{ sasl_mechanism | default('PLAIN') }}" + sasl_plain_username: "{{ sasl_plain_username | default(None) }}" + sasl_plain_password: "{{ sasl_plain_password | default(None) }}" + message_format: "{{ message_format | default('json') }}" + avro_schema_file: "{{ eda.filename.avro_schema_file | default(None) }}" + schema_registry_url: "{{ schema_registry_url | default(None) }}" + rules: + - name: match all avro + condition: true + action: + debug: diff --git a/rulebooks/listener.yml b/rulebooks/listener.yml new file mode 100644 index 0000000..9d15aa9 --- /dev/null +++ b/rulebooks/listener.yml @@ -0,0 +1,17 @@ +--- +- name: listener + hosts: all + sources: + - name: my_pg_listener + ansible.eda.pg_listener: + dsn: "{{ EDA_NOTIFY_DSN }}" + channel: "{{ EDA_NOTIFY_CHANNEL }}" + rules: + - name: listener ping + condition: event.payload.ping == "pong" + action: + none: + - name: listener shutdown + condition: event.payload.shutdown is defined + action: + shutdown: diff --git a/rulebooks/listener_no_shutdown.yml b/rulebooks/listener_no_shutdown.yml new file mode 100644 index 0000000..a667460 --- /dev/null +++ b/rulebooks/listener_no_shutdown.yml @@ -0,0 +1,13 @@ +--- +- name: listener + hosts: all + sources: + - name: my_pg_listener + ansible.eda.pg_listener: + dsn: "{{ EDA_NOTIFY_DSN }}" + channel: "{{ EDA_NOTIFY_CHANNEL }}" + rules: + - name: listener ping + condition: event.payload.ping == "pong" + action: + print_event: diff --git a/rulebooks/million_events.yml b/rulebooks/million_events.yml new file mode 100644 index 0000000..75c27c5 --- /dev/null +++ b/rulebooks/million_events.yml @@ -0,0 +1,18 @@ +--- +- name: "Create 1 milliom events" + hosts: all + execution_strategy: parallel + sources: + - name: generic + ansible.eda.generic: + loop_count: "{{ max_events | default('1000000') }}" + shutdown_after: "{{ max_wait | default('3600') }}" + create_index: i + blob_size : "{{ blob_size | default('256') }}" + payload: + - name: fred + rules: + - name: Rule + condition: event.i is defined + action: + none: diff --git a/rulebooks/missing_source.yml b/rulebooks/missing_source.yml new file mode 100644 index 0000000..40ea542 --- /dev/null +++ b/rulebooks/missing_source.yml @@ -0,0 +1,12 @@ +--- +- name: Missing Source + hosts: all + sources: + - name: my test source + ansible.eda.missing: + limit: 5 + rules: + - name: Debug + condition: event.i == 1 + action: + debug: diff --git a/rulebooks/multiple_conditions_job_template.yml b/rulebooks/multiple_conditions_job_template.yml index 72234b5..b75fcad 100644 --- a/rulebooks/multiple_conditions_job_template.yml +++ b/rulebooks/multiple_conditions_job_template.yml @@ -1,12 +1,13 @@ --- -- name: Test run job templates +- name: Simple rulebook hosts: all sources: - name: my test source ansible.eda.range: limit: 10 + delay: 3 rules: - - name: Run job template + - name: Multiple actions rule condition: event.i == 1 actions: - run_job_template: @@ -21,11 +22,11 @@ - debug message 2 - print_event: pretty: true - - name: Debug + - name: rule1 condition: event.i == 2 action: debug: - - name: print_event + - name: rule2 condition: all: - event.i == 3 @@ -33,13 +34,13 @@ action: print_event: pretty: true - - name: set_fact + - name: rule3 condition: event.i == 4 action: set_fact: fact: name: fred - - name: retract_fact + - name: rule4 condition: event.message == "Hello, world!" action: retract_fact: diff --git a/rulebooks/multiple_rules_with_sleep.yml b/rulebooks/multiple_rules_with_sleep.yml new file mode 100644 index 0000000..b8d719f --- /dev/null +++ b/rulebooks/multiple_rules_with_sleep.yml @@ -0,0 +1,17 @@ +--- +- name: Test rule multiple firing + hosts: all + sources: + - name: my test source + ansible.eda.generic: + payload: + - i : 10 + loop_count: 30 + loop_delay: 1 + rules: + - name: myrule1 + condition: event.i > 0 + actions: + - debug: + msg: Simple debug message + - print_event: diff --git a/rulebooks/new_pg_notify_template.yml b/rulebooks/new_pg_notify_template.yml new file mode 100644 index 0000000..6ae2269 --- /dev/null +++ b/rulebooks/new_pg_notify_template.yml @@ -0,0 +1,27 @@ +--- +- name: PG Notify Template Event Stream + hosts: all + sources: + - name: my_range + ansible.eda.range: + limit: 5 + complementary_source: + type: ansible.eda.pg_listener + name: Postgres Listener + args: + dsn: "{{ EDA_PG_NOTIFY_DSN }}" + channels: + - "{{ EDA_PG_NOTIFY_CHANNEL }}" + extra_vars: + EDA_PG_NOTIFY_DSN: "{{ settings.PG_NOTIFY_DSN }}" + EDA_PG_NOTIFY_CHANNEL: "{{ event_stream.channel_name }}" + encrypt_vars: + - EDA_PG_NOTIFY_DSN + rules: + - name: Post event + condition: true + action: + pg_notify: + dsn: "{{ EDA_PG_NOTIFY_DSN }}" + channel: "{{ EDA_PG_NOTIFY_CHANNEL }}" + event: "{{ event }}" diff --git a/rulebooks/no_name.yml b/rulebooks/no_name.yml new file mode 100644 index 0000000..a61c275 --- /dev/null +++ b/rulebooks/no_name.yml @@ -0,0 +1,26 @@ +--- +- name: Where the source have no names + hosts: all + sources: + - ansible.eda.webhook: + port: 5555 + host: 0.0.0.0 + filters: + - ansible.eda.json_filter: + include_keys: + - payload + - repository + - name + - full_name + - url + - sender + - login + - login + - zen + exclude_keys: + - '*' + rules: + - name: Webhook event + condition: true + action: + debug: diff --git a/rulebooks/no_names.yml b/rulebooks/no_names.yml new file mode 100644 index 0000000..21a11d5 --- /dev/null +++ b/rulebooks/no_names.yml @@ -0,0 +1,39 @@ +--- +- name: Where the sources have no names + hosts: all + sources: + - ansible.eda.webhook: + port: 5555 + host: 0.0.0.0 + filters: + - ansible.eda.json_filter: + include_keys: + - payload + - approval + - sys_class_name + - sys_created_by + - category + - urgency + exclude_keys: + - '*' + - ansible.eda.webhook: + port: 5556 + host: 0.0.0.0 + filters: + - ansible.eda.json_filter: + include_keys: + - payload + - repository + - name + - full_name + - url + - sender + - login + - zen + exclude_keys: + - '*' + rules: + - name: Webhook event + condition: true + action: + debug: diff --git a/rulebooks/pg_notify_template.yml b/rulebooks/pg_notify_template.yml new file mode 100644 index 0000000..67a419a --- /dev/null +++ b/rulebooks/pg_notify_template.yml @@ -0,0 +1,14 @@ +--- +- name: PG Notify Template + hosts: all + sources: + - ansible.eda.range: + limit: 10 + rules: + - name: Post event + condition: true + action: + pg_notify: + dsn: "{{ EDA_PG_NOTIFY_DSN }}" + channel: "{{ EDA_PG_NOTIFY_CHANNEL }}" + event: "{{ event }}" diff --git a/rulebooks/pgnotify_with_configurable_blob.yml b/rulebooks/pgnotify_with_configurable_blob.yml new file mode 100644 index 0000000..8ebc362 --- /dev/null +++ b/rulebooks/pgnotify_with_configurable_blob.yml @@ -0,0 +1,24 @@ +--- +- name: Generate a blob and send to Postgres + hosts: all + sources: + - name: Large Hadron Source + ansible.eda.generic: + payload: + - payload: + ping: pong + truth: true + loop_count: "{{ NUMBER_OF_EVENTS }}" + blob_size: "{{ BLOB_SIZE }}" + create_index: sequence + final_payload: + payload: + shutdown: true + rules: + - name: send to postgres + condition: "true == true" + action: + pg_notify: + dsn: "{{ EDA_NOTIFY_DSN }}" + channel: "{{ EDA_NOTIFY_CHANNEL }}" + event: "{{ event }}" diff --git a/rulebooks/print_rulebook_events.yml b/rulebooks/print_rulebook_events.yml new file mode 100644 index 0000000..8167abb --- /dev/null +++ b/rulebooks/print_rulebook_events.yml @@ -0,0 +1,17 @@ +--- +- name: Print Events in job templates + hosts: all + sources: + - name: my test source + ansible.eda.range: + limit: 6 + rules: + - name: Run job template + condition: event.i == 1 + action: + run_job_template: + name: PrintEvent + organization: Default + job_args: + extra_vars: + hello: Fred diff --git a/rulebooks/proxy_env_vars.yml b/rulebooks/proxy_env_vars.yml new file mode 100644 index 0000000..76fb8fc --- /dev/null +++ b/rulebooks/proxy_env_vars.yml @@ -0,0 +1,28 @@ +--- +- name: Check proxy env vars before generating events + hosts: all + sources: + - ansible.eda.generic: + loop_count: 1 + timestamp: true + create_index: i + check_env_vars: + HTTP_PROXY: "{{ var1 }}" + HTTPS_PROXY: "{{ var2 }}" + NO_PROXY: "{{ var3 }}" + payload: + - message: + name: Fred + - message: + name: Barney + rules: + - name: English comparison using dot notation + condition: event.message.name == "Fred" + action: + print_event: + pretty: True + - name: English comparison using square bracket accessor + condition: event.message["name"] == "Barney" + action: + print_event: + pretty: True diff --git a/rulebooks/repeater.yml b/rulebooks/repeater.yml new file mode 100644 index 0000000..79c90ea --- /dev/null +++ b/rulebooks/repeater.yml @@ -0,0 +1,15 @@ +--- +- name: repeater + hosts: all + sources: + - name: range + ansible.eda.range: + limit: 5 + rules: + - name: r1 + condition: "true == true" + action: + pg_notify: + dsn: "{{ EDA_NOTIFY_DSN }}" + channel: "{{ EDA_NOTIFY_CHANNEL }}" + event: "{{ event }}" diff --git a/rulebooks/rule_with_pipe.yml b/rulebooks/rule_with_pipe.yml new file mode 100644 index 0000000..2d499ec --- /dev/null +++ b/rulebooks/rule_with_pipe.yml @@ -0,0 +1,17 @@ +--- +- name: Job Template with Pipe Charachter + hosts: all + sources: + - name: my test source + ansible.eda.range: + limit: 2 + rules: + - name: myrule1 + condition: event.i > 0 + actions: + - run_job_template: + name: Storage+Monitor | Reme/diate + organization: Default + job_args: + extra_vars: + hello: Fred diff --git a/rulebooks/rulebook_with_configurable_blob.yml b/rulebooks/rulebook_with_configurable_blob.yml new file mode 100644 index 0000000..2df1bca --- /dev/null +++ b/rulebooks/rulebook_with_configurable_blob.yml @@ -0,0 +1,18 @@ +--- +- name: Generate a blob + hosts: all + sources: + - name: Large Hadron Collider + ansible.eda.generic: + payload: + ping: pong + truth: true + loop_count: "{{ NUMBER_OF_EVENTS | default(1000) }}" + blob_size: "{{ BLOB_SIZE | default(1024) }}" + loop_delay: "{{ DELAY | default(5) }}" + create_index: sequence + rules: + - name: r1 + condition: event.ping == "pong" + action: + none: diff --git a/rulebooks/rules_every_minute.yml b/rulebooks/rules_every_minute.yml new file mode 100644 index 0000000..0e35877 --- /dev/null +++ b/rulebooks/rules_every_minute.yml @@ -0,0 +1,14 @@ +--- +- name: Rules every minute + hosts: all + sources: + - name: my test source + ansible.eda.range: + limit: 200000 + delay: 60 + rules: + - name: Minute rule + condition: event.i >= 0 + actions: + - print_event: + pretty: True diff --git a/rulebooks/rules_in_flux.yml b/rulebooks/rules_in_flux.yml new file mode 100644 index 0000000..bfcec79 --- /dev/null +++ b/rulebooks/rules_in_flux.yml @@ -0,0 +1,13 @@ +--- +- name: Rules in flux + hosts: all + sources: + - name: my test source + ansible.eda.range: + limit: 2 + rules: + - name: mynew_rule3 + condition: event.i == 0 + actions: + - print_event: + pretty: True diff --git a/rulebooks/rules_with_facts.yml b/rulebooks/rules_with_facts.yml new file mode 100644 index 0000000..4e4fa66 --- /dev/null +++ b/rulebooks/rules_with_facts.yml @@ -0,0 +1,27 @@ +--- +- name: Test facts firing multiple rules + hosts: all + sources: + - name: my test source + ansible.eda.generic: + payload: + - i : 1 + shutdown_after: 2 + rules: + - name: myrule1 + condition: event.i == 1 + actions: + - set_fact: + fact: + msg: Hello from facts + - print_event: + - name: fact_rule1 + condition: fact.msg == "Hello from facts" + actions: + - debug: + msg: "Fact rule1 fired" + - name: fact_rule2 + condition: fact.msg == "Hello from facts" + actions: + - debug: + msg: "Fact rule2 fired" diff --git a/rulebooks/same_rule_names1.yml b/rulebooks/same_rule_names1.yml new file mode 100644 index 0000000..796f93e --- /dev/null +++ b/rulebooks/same_rule_names1.yml @@ -0,0 +1,13 @@ +--- +- name: ruleset1 + hosts: all + sources: + - name: sourceA + ansible.eda.range: + limit: 6 + delay: 5 + rules: + - name: rule1 + condition: event.i == 2 + action: + debug: diff --git a/rulebooks/same_rule_names2.yml b/rulebooks/same_rule_names2.yml new file mode 100644 index 0000000..42291c8 --- /dev/null +++ b/rulebooks/same_rule_names2.yml @@ -0,0 +1,18 @@ +--- +- name: ruleset1 + hosts: all + sources: + - name: sourceA + ansible.eda.range: + limit: 6 + delay: 5 + rules: + - name: rule1 + condition: event.i == 1 + action: + run_job_template: + name: Hello World + organization: Default + job_args: + extra_vars: + hello: Fred diff --git a/rulebooks/same_rule_names3.yml b/rulebooks/same_rule_names3.yml new file mode 100644 index 0000000..814ed72 --- /dev/null +++ b/rulebooks/same_rule_names3.yml @@ -0,0 +1,17 @@ +--- +- name: ruleset1 + hosts: all + sources: + - name: my test source + ansible.eda.range: + limit: 6 + rules: + - name: rule1 + condition: event.i == 1 + action: + run_job_template: + name: Hello, New World + organization: Default + job_args: + extra_vars: + hello: Fred diff --git a/rulebooks/should_fail_import.yml b/rulebooks/should_fail_import.yml new file mode 100644 index 0000000..1720889 --- /dev/null +++ b/rulebooks/should_fail_import.yml @@ -0,0 +1,13 @@ +--- +- name: Should fail during import + hosts: all + soruces: + - name: generic + generic: + payload: + - b: test + rules: + - name: Test + condition: event.b == "test" + action: + print_event: diff --git a/rulebooks/single_rule.yml b/rulebooks/single_rule.yml new file mode 100644 index 0000000..025657c --- /dev/null +++ b/rulebooks/single_rule.yml @@ -0,0 +1,15 @@ +--- +- name: Test rule firing + hosts: all + sources: + - name: my test source + ansible.eda.range: + limit: 10 + delay: 20 + rules: + - name: myrule1 + condition: event.i > 0 + actions: + - debug: + msg: Simple debug message + - print_event: diff --git a/rulebooks/single_rule_jinja.yml b/rulebooks/single_rule_jinja.yml new file mode 100644 index 0000000..a44dcd9 --- /dev/null +++ b/rulebooks/single_rule_jinja.yml @@ -0,0 +1,15 @@ +--- +- name: Test rule firing + hosts: all + sources: + - name: my test source + ansible.eda.range: + limit: "{{ enc_limit }}" + delay: 20 + rules: + - name: myrule1 + condition: event.i > 0 + actions: + - debug: + msg: Simple debug message + - print_event: diff --git a/rulebooks/single_rule_with_vaulted_strings.yml b/rulebooks/single_rule_with_vaulted_strings.yml new file mode 100644 index 0000000..47914ab --- /dev/null +++ b/rulebooks/single_rule_with_vaulted_strings.yml @@ -0,0 +1,23 @@ +--- +- name: Test rule firing with embedded vaulted string + hosts: all + sources: + - name: my test source + ansible.eda.range: + # vault password: secret + # the value of limit is 5 + limit: !vault | + $ANSIBLE_VAULT;1.1;AES256 + 61343164616161376234396238376130303138323439643734386230666130343431623330383935 + 3634353366323030303733373865376638376563633738380a643066353034633639363162666631 + 65643365363632313662353861343761633464666431626235643761666436613239386231353164 + 3733363137646362630a653735346638643131653263663333356164343135633933653362646138 + 6131 + delay: 1 + rules: + - name: myrule1 + condition: event.i > 0 + actions: + - debug: + msg: Simple debug message + - print_event: diff --git a/rulebooks/sqs_action_demo.yml b/rulebooks/sqs_action_demo.yml new file mode 100644 index 0000000..48027b4 --- /dev/null +++ b/rulebooks/sqs_action_demo.yml @@ -0,0 +1,32 @@ +--- +- name: EC2 SQS Rulebook with Actions + hosts: all + sources: + - ansible.eda.aws_sqs_queue: + name: "{{ queue_name }}" + url: "{{ queue_url }}" + delay_seconds: 10 + access_key: "{{ access_key }}" + secret_key: "{{ secret_key }}" + region: "{{ region }}" + rules: + - name: Debug Action from SQS + condition: event.body.action == "debug" + action: + debug: + - name: Print Action from SQS + condition: event.body.action == "print_event" + action: + print_event: + - name: Job Template Action from SQS + condition: event.body.action == "run_job_template" + action: + run_job_template: + name: Demo Job Template + organization: Default + job_args: + extra_vars: + hello: Fred + retries: 1 + delay: 10 + set_facts: True diff --git a/rulebooks/sqs_feedback.yml b/rulebooks/sqs_feedback.yml new file mode 100644 index 0000000..08a913d --- /dev/null +++ b/rulebooks/sqs_feedback.yml @@ -0,0 +1,22 @@ +--- +- name: SQS feedback + hosts: all + sources: + - name: my_sqs + amazon.aws.aws_sqs_queue: + name: "{{ queue_name }}" + url: "{{ queue_url }}" + delay_seconds: 10 + region: "{{ region }}" + feedback: "{{ feedback }}" + access_key: "{{ access_key }}" + secret_key: "{{ secret_key }}" + rules: + - name: multi condition + condition: + all: + - event.body.id == 1 + - event.body.id == 7 + - event.body.id == 9 + action: + debug: diff --git a/rulebooks/sqs_log_all.yml b/rulebooks/sqs_log_all.yml new file mode 100644 index 0000000..b937a2c --- /dev/null +++ b/rulebooks/sqs_log_all.yml @@ -0,0 +1,16 @@ +--- +- name: Amazon SQS Rulebook + hosts: all + sources: + - ansible.eda.aws_sqs_queue: + name: "{{ queue_name }}" + url: "{{ queue_url }}" + delay_seconds: 10 + access_key: "{{ access_key }}" + secret_key: "{{ secret_key }}" + region: "{{ region }}" + rules: + - name: SQS event + condition: true + action: + debug: diff --git a/rulebooks/test_accumulate_within.yml b/rulebooks/test_accumulate_within.yml new file mode 100644 index 0000000..f047fa9 --- /dev/null +++ b/rulebooks/test_accumulate_within.yml @@ -0,0 +1,31 @@ +--- +- name: Test accumulate within + hosts: localhost + sources: + - name: Test + ansible.eda.generic: + payload: + - name: alert1 + level: error + code: 205 + - name: alert2 + level: warning + code: 207 + - name: alert3 + level: error + code: 205 + - name: alert4 + level: error + code: 205 + shutdown_delay: 75 + rules: + - name: r1 + condition: event.level == 'error' + throttle: + accumulate_within: 1 minutes + threshold: 3 + group_by_attributes: + - event.level + - event.code + action: + debug: diff --git a/rulebooks/test_azure_service_bus.yml b/rulebooks/test_azure_service_bus.yml new file mode 100644 index 0000000..5d201ae --- /dev/null +++ b/rulebooks/test_azure_service_bus.yml @@ -0,0 +1,14 @@ +--- +- name: Get Events from Azure Service Bus + hosts: all + gather_facts: true + sources: + - name: AZ Bus + ansible.eda.azure_service_bus: + conn_str: "{{ conn_str }}" + queue_name: "{{ queue_name }}" + rules: + - name: r1 + condition: event.body.name == "Fred Flintstone" + action: + print_event: diff --git a/rulebooks/test_block_payload.yml b/rulebooks/test_block_payload.yml new file mode 100644 index 0000000..42efa80 --- /dev/null +++ b/rulebooks/test_block_payload.yml @@ -0,0 +1,12 @@ +--- +- name: Allow for users to debug file contents + hosts: all + sources: + - ansible.eda.generic: + payload_file: "{{ eda.filename.test_payload_file }}" + shutdown_after: "{{ shutdown_after | default('500') | int }}" + rules: + - name: test + condition: true + action: + debug: diff --git a/rulebooks/test_extra_var.yml b/rulebooks/test_extra_var.yml new file mode 100644 index 0000000..f667f58 --- /dev/null +++ b/rulebooks/test_extra_var.yml @@ -0,0 +1,26 @@ +--- +- name: Hello with var + hosts: all + sources: + - ansible.eda.range: + limit: 5 + rules: + - name: Say Hello + condition: event.i == 1 + action: + debug: + # qe_test_pass + msg: !vault | + $ANSIBLE_VAULT;1.1;AES256 + 65643038633630663435396331633432343530333834623066373563346533396130356435376535 + 6265653636653932366161643133303961323631633635610a616230363433353063356163333562 + 65363361646632643634396336373065313364393862313135383036353966366632363332343137 + 3965643532356136630a663165616463616463303130623133643436373762363933323736373866 + 35383331663266633134303238373666313864656565383938653633383461653639666234646264 + 3266356436373236623537643266396263626666653265303132 + + - name: Say Hello again + condition: event.i == 2 + action: + debug: + msg: "Hello again {{ my_extra_msg }}" diff --git a/rulebooks/test_job_template_with_lock.yml b/rulebooks/test_job_template_with_lock.yml new file mode 100644 index 0000000..21ef522 --- /dev/null +++ b/rulebooks/test_job_template_with_lock.yml @@ -0,0 +1,39 @@ +--- +- name: Test run job templates with lock + hosts: all + execution_strategy: parallel + sources: + - ansible.eda.generic: + payload: + - name: Fred + age: 50 + index: 1 + sleep: 30 + - name: Barney + age: 50 + index: 2 + sleep: 20 + - name: Wilma + age: 35 + index: 3 + sleep: 10 + loop_count: 3 + shutdown_after: 60 + rules: + - name: "Run job template" + condition: event.index >= 1 + action: + run_job_template: + name: "{{ 'Demo Job Template mk' ~ event.index }}" + organization: Default + job_args: + extra_vars: + hello: Fred + sleep: "{{ event.sleep }}" + labels: + - 1 + - 2 + retries: 1 + lock: "{{ 'Demo Job Template mk' ~ event.index }}" + delay: 10 + set_facts: True diff --git a/rulebooks/test_job_template_with_tags.yml b/rulebooks/test_job_template_with_tags.yml new file mode 100644 index 0000000..cceeb0b --- /dev/null +++ b/rulebooks/test_job_template_with_tags.yml @@ -0,0 +1,37 @@ +--- +- name: Test run job templates with lock + hosts: all + execution_strategy: parallel + sources: + - ansible.eda.generic: + payload: + - name: Fred + age: 50 + index: 1 + sleep: 30 + - name: Barney + age: 50 + index: 2 + sleep: 20 + - name: Wilma + age: 35 + index: 3 + sleep: 10 + loop_count: 3 + shutdown_after: 60 + rules: + - name: "Run job template" + condition: event.index >= 1 + action: + run_job_template: + name: "{{ 'Demo Job Template mk' ~ event.index }}" + organization: Default + job_args: + extra_vars: + hello: Fred + sleep: "{{ event.sleep }}" + skip_tags: tag1, tag2 + retries: 1 + lock: "{{ 'Demo Job Template mk' ~ event.index }}" + delay: 10 + set_facts: True diff --git a/rulebooks/test_payload_file.yml b/rulebooks/test_payload_file.yml new file mode 100644 index 0000000..a996a81 --- /dev/null +++ b/rulebooks/test_payload_file.yml @@ -0,0 +1,19 @@ +--- +- name: Use payload file to check events + hosts: all + sources: + - ansible.eda.generic: + payload_file: "{{ eda.filename.test_payload_file }}" + rules: + - name: Rule1 + condition: event.name == vars.friend1 + action: + debug: + - name: Rule2 + condition: event.name == vars.friend2 + action: + debug: + - name: Rule3 + condition: event.name == vars.friend3 + action: + debug: diff --git a/rulebooks/test_source_stacktrace.yml b/rulebooks/test_source_stacktrace.yml new file mode 100644 index 0000000..0f9b50c --- /dev/null +++ b/rulebooks/test_source_stacktrace.yml @@ -0,0 +1,13 @@ +--- +- name: Raise exception midst processing + hosts: localhost + sources: + - name: Raise Exception + ansible.eda.fail_after: + limit: "{{ LIMIT | default(10) }}" + after: "{{ FAIL_AFTER | default(4) }}" + rules: + - name: Simple Rule + condition: true + action: + debug: diff --git a/rulebooks/test_webhook.yml b/rulebooks/test_webhook.yml new file mode 100644 index 0000000..491fe0b --- /dev/null +++ b/rulebooks/test_webhook.yml @@ -0,0 +1,12 @@ +--- +- name: Run a webhook source + hosts: all + sources: + - ansible.eda.webhook: + port: 5555 + host: 0.0.0.0 + rules: + - name: Webhook event + condition: "true == true" + action: + print_event: diff --git a/rulebooks/test_webhook_6666.yml b/rulebooks/test_webhook_6666.yml new file mode 100644 index 0000000..9cd27f6 --- /dev/null +++ b/rulebooks/test_webhook_6666.yml @@ -0,0 +1,12 @@ +--- +- name: Run a webhook source + hosts: all + sources: + - ansible.eda.webhook: + port: 6666 + host: 0.0.0.0 + rules: + - name: Webhook event + condition: "true == true" + action: + print_event: diff --git a/rulebooks/test_webhook_with_var.yml b/rulebooks/test_webhook_with_var.yml new file mode 100644 index 0000000..03bd575 --- /dev/null +++ b/rulebooks/test_webhook_with_var.yml @@ -0,0 +1,12 @@ +--- +- name: Run a webhook source + hosts: all + sources: + - ansible.eda.webhook: + port: "{{ WEBHOOK_PORT }}" + host: 0.0.0.0 + rules: + - name: Webhook event + condition: "true == true" + action: + print_event: diff --git a/rulebooks/test_with_colon.yml b/rulebooks/test_with_colon.yml new file mode 100644 index 0000000..70a10f2 --- /dev/null +++ b/rulebooks/test_with_colon.yml @@ -0,0 +1,21 @@ +--- +- name: colon in condition + hosts: localhost + sources: + - ansible.eda.generic: + payload: + - name: 'Fred: Flintstone' + age: 50 + profession: Crane Operator + - name: Barney Rubble + age: 45 + rules: + - name: r1 + condition: > + event.name == 'Fred: Flintstone' and event.profession == "Crane Operator" + action: + debug: + - name: r2 + condition: event.name == "Barney Rubble" + action: + debug: diff --git a/rulebooks/threshold.yml b/rulebooks/threshold.yml new file mode 100644 index 0000000..0840c6e --- /dev/null +++ b/rulebooks/threshold.yml @@ -0,0 +1,33 @@ +--- +- name: accumulate within + hosts: localhost + sources: + - name: Test + ansible.eda.generic: + payload: + - name: alert1 + level: error + code: 205 + - name: alert2 + level: warning + code: 207 + - name: alert4 + level: error + code: 209 + loop_count: 100 + create_index: index + timestamp: true + shutdown_delay: 60 + rules: + - name: r1 + condition: event.level == 'error' + throttle: + accumulate_within: 1 minutes + threshold: 100 + group_by_attributes: + - event.level + - event.code + action: + run_job_template: + name: Demo Job Template + organization: Default diff --git a/rulebooks/timed_test.yml b/rulebooks/timed_test.yml new file mode 100644 index 0000000..d0684f1 --- /dev/null +++ b/rulebooks/timed_test.yml @@ -0,0 +1,23 @@ +--- +- name: Runs for some preset minutes + hosts: all + sources: + - name: my test source + ansible.eda.generic: + loop_count: "{{ loop_count | default('20') }}" + loop_delay: "{{ loop_delay | default('30') }}" + startup_delay: "{{ startup_delay | default('0') }}" + create_index: i + blob_size: "{{ blob_size | default('10') }}" + payload: + - name: Fred + rules: + - name: rule with 1 action + condition: event.i > 0 + actions: + - debug: + msg: + - debug message 1 + - debug message 2 + - print_event: + pretty: true diff --git a/rulebooks/utf_key.yml b/rulebooks/utf_key.yml new file mode 100644 index 0000000..480fdbf --- /dev/null +++ b/rulebooks/utf_key.yml @@ -0,0 +1,31 @@ +--- +- name: Key with non alphanumeric characters in conditions + hosts: all + sources: + - ansible.eda.generic: + loop_count: 1 + timestamp: true + create_index: i + payload: + - message: + name: Fred + - message: + name: Barney + - message: + नाम: മധു + rules: + - name: "Square accessor" + condition: event.message["नाम"] == "മധു" + action: + print_event: + pretty: True + - name: English comparison using dot notation + condition: event.message.name == "Fred" + action: + print_event: + pretty: True + - name: English comparison using square bracket accessor + condition: event.message["name"] == "Barney" + action: + print_event: + pretty: True diff --git a/rulebooks/utf_key_with_gather_facts.yml b/rulebooks/utf_key_with_gather_facts.yml new file mode 100644 index 0000000..b2225ac --- /dev/null +++ b/rulebooks/utf_key_with_gather_facts.yml @@ -0,0 +1,32 @@ +--- +- name: Key with non alphanumeric characters in conditions + hosts: all + gather_facts: true + sources: + - ansible.eda.generic: + loop_count: 1 + timestamp: true + create_index: i + payload: + - message: + name: Fred + - message: + name: Barney + - message: + नाम: മധു + rules: + - name: "Square accessor" + condition: event.message["नाम"] == "മധു" + action: + print_event: + pretty: True + - name: English comparison using dot notation + condition: event.message.name == "Fred" + action: + print_event: + pretty: True + - name: English comparison using square bracket accessor + condition: event.message["name"] == "Barney" + action: + print_event: + pretty: True diff --git a/rulebooks/vault_demo1.yml b/rulebooks/vault_demo1.yml new file mode 100644 index 0000000..a7790c7 --- /dev/null +++ b/rulebooks/vault_demo1.yml @@ -0,0 +1,15 @@ +--- +- name: Vault Demo + hosts: all + sources: + - ansible.eda.generic: + payload: + - connect: + host: "{{ db_host }}" + password: "{{ db_password }}" + rules: + - name: Check DB Host and password + condition: event.connect.host == "localhost" and event.connect.password == "password" + action: + debug: + msg: "Password and host match" diff --git a/rulebooks/webhook_check.yml b/rulebooks/webhook_check.yml new file mode 100644 index 0000000..c4d0077 --- /dev/null +++ b/rulebooks/webhook_check.yml @@ -0,0 +1,13 @@ +--- +- name: Webhook rulebook + hosts: all + sources: + - name: my_github + ansible.eda.webhook: + port: 5555 + host: 0.0.0.0 + rules: + - name: Active Webhook event + condition: event.payload.ref == 'refs/heads/main' + action: + debug: diff --git a/rulebooks/webhook_fail_all.yml b/rulebooks/webhook_fail_all.yml new file mode 100644 index 0000000..6a3db82 --- /dev/null +++ b/rulebooks/webhook_fail_all.yml @@ -0,0 +1,13 @@ +--- +- name: Match ado about nothing + hosts: all + sources: + - name: my_source + ansible.eda.webhook: + port: 5555 + host: 0.0.0.0 + rules: + - name: Webhook event + condition: false + action: + debug: diff --git a/rulebooks/webhook_github.yml b/rulebooks/webhook_github.yml new file mode 100644 index 0000000..2369d24 --- /dev/null +++ b/rulebooks/webhook_github.yml @@ -0,0 +1,13 @@ +--- +- name: Webhook with github + hosts: all + sources: + - name: my_github + ansible.eda.webhook: + port: 5556 + host: 0.0.0.0 + rules: + - name: Webhook event + condition: true + action: + print_event: diff --git a/rulebooks/webhook_github_snow.yml b/rulebooks/webhook_github_snow.yml new file mode 100644 index 0000000..1df61e5 --- /dev/null +++ b/rulebooks/webhook_github_snow.yml @@ -0,0 +1,42 @@ +--- +- name: Webhook rulebook with names + hosts: all + sources: + - name: my_snow + ansible.eda.webhook: + port: 5555 + host: 0.0.0.0 + filters: + - ansible.eda.json_filter: + include_keys: + - payload + - approval + - sys_class_name + - sys_created_by + - category + - urgency + exclude_keys: + - '*' + - name: my_github + ansible.eda.webhook: + port: 5556 + host: 0.0.0.0 + filters: + - ansible.eda.json_filter: + include_keys: + - payload + - repository + - name + - full_name + - url + - sender + - login + - login + - zen + exclude_keys: + - '*' + rules: + - name: Webhook event + condition: true + action: + debug: diff --git a/rulebooks/webhook_github_snow_multi_ruleset.yml b/rulebooks/webhook_github_snow_multi_ruleset.yml new file mode 100644 index 0000000..af5e90e --- /dev/null +++ b/rulebooks/webhook_github_snow_multi_ruleset.yml @@ -0,0 +1,51 @@ +--- +- name: Github Webhook Ruleset + hosts: all + sources: + - name: my_github + ansible.eda.webhook: + port: 5555 + host: 0.0.0.0 + filters: + - ansible.eda.json_filter: + include_keys: + - payload + - repository + - name + - full_name + - url + - sender + - login + - login + - zen + exclude_keys: + - '*' + rules: + - name: Webhook event + condition: true + action: + debug: + +- name: SNOW Webhook Ruleset + hosts: all + sources: + - name: my_snow + ansible.eda.webhook: + port: 5556 + host: 0.0.0.0 + filters: + - ansible.eda.json_filter: + include_keys: + - payload + - approval + - sys_class_name + - sys_created_by + - category + - urgency + exclude_keys: + - '*' + rules: + - name: Snow webhook event + condition: true + action: + debug: diff --git a/rulebooks/webhook_log_all.yml b/rulebooks/webhook_log_all.yml new file mode 100644 index 0000000..8b90433 --- /dev/null +++ b/rulebooks/webhook_log_all.yml @@ -0,0 +1,26 @@ +--- +- name: Webhook rulebook + hosts: all + sources: + - name: my_github + ansible.eda.webhook: + port: 5555 + host: 0.0.0.0 + filters: + - ansible.eda.json_filter: + include_keys: + - repository + - name + - full_name + - url + - sender + - login + - login + - zen + exclude_keys: + - '*' + rules: + - name: Webhook event + condition: true + action: + debug: diff --git a/rulebooks/webhook_log_all_filter2.yml b/rulebooks/webhook_log_all_filter2.yml new file mode 100644 index 0000000..dad810f --- /dev/null +++ b/rulebooks/webhook_log_all_filter2.yml @@ -0,0 +1,24 @@ +--- +- name: Webhook rulebook with different filter + hosts: all + sources: + - name: my_github + ansible.eda.webhook: + port: 5555 + host: 0.0.0.0 + filters: + - ansible.eda.json_filter: + include_keys: + - payload + - sender + - login + - id + - node_id + - site_admin + exclude_keys: + - '*' + rules: + - name: Webhook event + condition: true + action: + debug: diff --git a/rulebooks/webhook_log_all_no_filter.yml b/rulebooks/webhook_log_all_no_filter.yml new file mode 100644 index 0000000..aebd160 --- /dev/null +++ b/rulebooks/webhook_log_all_no_filter.yml @@ -0,0 +1,13 @@ +--- +- name: Webhook rulebook + hosts: all + sources: + - name: my_github + ansible.eda.webhook: + port: 5555 + host: 0.0.0.0 + rules: + - name: Webhook event + condition: true + action: + debug: diff --git a/rulebooks/webhook_mtls.yml b/rulebooks/webhook_mtls.yml new file mode 100644 index 0000000..651ebe7 --- /dev/null +++ b/rulebooks/webhook_mtls.yml @@ -0,0 +1,19 @@ +--- +- name: Webhook rulebook with mTLS + hosts: all + sources: + - ansible.eda.webhook: + port: "{{ port | default('5555') }}" + certfile: "{{ eda.filename.certfile | default(None) }}" + keyfile: "{{ eda.filename.keyfile | default(None) }}" + password: "{{ key_password | default(None) }}" + cafile: "{{ eda.filename.cafile | default(None) }}" + rules: + - name: Check if the name is Fred + condition: event.payload.name == "Fred" + action: + print_event: + - name: Check if the event contains shutdown + condition: event.payload.shutdown + action: + shutdown: diff --git a/rulebooks/webhook_repeater.yml b/rulebooks/webhook_repeater.yml new file mode 100644 index 0000000..f79afa4 --- /dev/null +++ b/rulebooks/webhook_repeater.yml @@ -0,0 +1,24 @@ +--- +- name: Run a webhook listener service + hosts: all + match_multiple_rules: false + sources: + - ansible.eda.webhook: + port: 5555 + host: 0.0.0.0 + rules: + - name: Shutdown + condition: event.payload.shutdown is defined + actions: + - pg_notify: + dsn: "{{ EDA_NOTIFY_DSN }}" + channel: "{{ EDA_NOTIFY_CHANNEL }}" + event: "{{ event }}" + - shutdown: + - name: Webhook event + condition: "true == true" + action: + pg_notify: + dsn: "{{ EDA_NOTIFY_DSN }}" + channel: "{{ EDA_NOTIFY_CHANNEL }}" + event: "{{ event }}" diff --git a/rulebooks/webhook_repeater_no_shutdown.yml b/rulebooks/webhook_repeater_no_shutdown.yml new file mode 100644 index 0000000..160c3ba --- /dev/null +++ b/rulebooks/webhook_repeater_no_shutdown.yml @@ -0,0 +1,16 @@ +--- +- name: Run a webhook listener service + hosts: all + match_multiple_rules: true + sources: + - ansible.eda.webhook: + port: 5555 + host: 0.0.0.0 + rules: + - name: Webhook event + condition: "true == true" + action: + pg_notify: + dsn: "{{ EDA_NOTIFY_DSN }}" + channel: "{{ EDA_NOTIFY_CHANNEL }}" + event: "{{ event }}" diff --git a/rulebooks/webhook_rulebook_barney.yml b/rulebooks/webhook_rulebook_barney.yml new file mode 100644 index 0000000..aa27686 --- /dev/null +++ b/rulebooks/webhook_rulebook_barney.yml @@ -0,0 +1,23 @@ +--- +- name: Barneys webhook rulebook + hosts: all + match_multiple_rules: true + sources: + - ansible.eda.webhook: + port: 6666 + host: 0.0.0.0 + rules: + - name: Barneys's rule + condition: event.payload.name == "Barney" + action: + print_event: + - name: Broadcast + condition: event.payload.broadcast + action: + debug: + msg: "PSA ({ event.payload.message }}" + - name: Shutdown + condition: event.payload.shutdown and event.payload.name == "Barney" + action: + shutdown: + message: "Shutting down activation Barneys" diff --git a/rulebooks/webhook_rulebook_fred.yml b/rulebooks/webhook_rulebook_fred.yml new file mode 100644 index 0000000..e2894df --- /dev/null +++ b/rulebooks/webhook_rulebook_fred.yml @@ -0,0 +1,23 @@ +--- +- name: Freds webhook rulebook + hosts: all + match_multiple_rules: true + sources: + - ansible.eda.webhook: + port: 4444 + host: 0.0.0.0 + rules: + - name: Fred's rule + condition: event.payload.name == "Fred" + action: + print_event: + - name: Broadcast + condition: event.payload.broadcast + action: + debug: + msg: "PSA ({ event.payload.message }}" + - name: Shutdown + condition: event.payload.shutdown and event.payload.name == "Fred" + action: + shutdown: + message: "Shutting down Fred's activation" diff --git a/rulebooks/webhook_rulebook_wilma.yml b/rulebooks/webhook_rulebook_wilma.yml new file mode 100644 index 0000000..5261dcc --- /dev/null +++ b/rulebooks/webhook_rulebook_wilma.yml @@ -0,0 +1,23 @@ +--- +- name: Wilmas webhook rulebook + hosts: all + match_multiple_rules: true + sources: + - ansible.eda.webhook: + port: 5555 + host: 0.0.0.0 + rules: + - name: Wilma's rule + condition: event.payload.name == "Wilma" + action: + print_event: + - name: Broadcast in wilmas rulebook + condition: event.payload.broadcast + action: + debug: + msg: "PSA ({ event.payload.message }}" + - name: Shutdown + condition: event.payload.shutdown and event.payload.name == "Wilma" + action: + shutdown: + message: "Shutting down Wilma's activation" diff --git a/rulebooks/webhook_timeout.yml b/rulebooks/webhook_timeout.yml new file mode 100644 index 0000000..919e0ad --- /dev/null +++ b/rulebooks/webhook_timeout.yml @@ -0,0 +1,17 @@ +--- +- name: Webhook rulebook will restart after retry interval + hosts: all + sources: + - name: my_github + ansible.eda.webhook: + port: 5555 + host: 0.0.0.0 + - name: workaround + ansible.eda.range: + limit: 2 + delay: "{{ retry_after | default(30) }}" + rules: + - name: Active Webhook event + condition: event.payload.ref == 'refs/heads/main' + action: + debug: diff --git a/rulebooks/webhook_with_filter.yml b/rulebooks/webhook_with_filter.yml new file mode 100644 index 0000000..7e5028f --- /dev/null +++ b/rulebooks/webhook_with_filter.yml @@ -0,0 +1,56 @@ +--- +- name: Webhook rulebook with HMAC and other sources + hosts: all + sources: + - ansible.eda.generic: + event_delay: 60 + payload: + - i : 1 + - i : 2 + - i : 3 + - ansible.eda.webhook: + port: 6666 + host: 0.0.0.0 + hmac_secret: "{{ hmac_secret }}" + hmac_algo: "{{ hmac_algo | default('sha256') }}" + hmac_header: "{{ hmac_header | default('x-hub-signature-256') }}" + hmac_format: "{{ hmac_format | default('hex') }}" + filters: + - ansible.eda.json_filter: + include_keys: + - payload + - name + - shutdown + - sequence + exclude_keys: + - '*' + - ansible.eda.generic: + event_delay: 90 + payload: + - name : Fred + - name : Barney + + rules: + - name: Shutdown + condition: event.payload.shutdown + action: + shutdown: + message: "Shutting down activation" + delay: 1 + - name: Fred's rule + condition: event.name == 'Fred' + action: + debug: + - name: Check i is 1 + condition: event.i == 1 + action: + print_event: + - name: Wilma's rule + condition: event.payload.name == "Wilma" + action: + none: + - name: Broadcast + condition: event.payload.broadcast + action: + debug: + msg: "PSA ({ event.payload.message }}" diff --git a/rulebooks/webhook_with_hmac.yml b/rulebooks/webhook_with_hmac.yml new file mode 100644 index 0000000..c8bf1a2 --- /dev/null +++ b/rulebooks/webhook_with_hmac.yml @@ -0,0 +1,26 @@ +--- +- name: Wilmas webhook rulebook with HMAC + hosts: all + sources: + - ansible.eda.webhook: + port: 6666 + host: 0.0.0.0 + hmac_secret: "{{ hmac_secret }}" + hmac_algo: "{{ hmac_algo | default('sha256') }}" + hmac_header: "{{ hmac_header | default('x-hub-signature-256') }}" + hmac_format: "{{ hmac_format | default('hex') }}" + rules: + - name: Shutdown + condition: event.payload.shutdown + action: + shutdown: + message: "Shutting down activation" + - name: Wilma's rule + condition: event.payload.name == "Wilma" + action: + none: + - name: Broadcast in wilmas rulebook + condition: event.payload.broadcast + action: + debug: + msg: "PSA ({ event.payload.message }}" diff --git a/rulebooks/webhook_with_no_filters.yml b/rulebooks/webhook_with_no_filters.yml new file mode 100644 index 0000000..d068918 --- /dev/null +++ b/rulebooks/webhook_with_no_filters.yml @@ -0,0 +1,47 @@ +--- +- name: Webhook rulebook with HMAC and other sources no filters + hosts: all + sources: + - ansible.eda.generic: + event_delay: 60 + payload: + - i : 1 + - i : 2 + - i : 3 + - ansible.eda.webhook: + port: 6666 + host: 0.0.0.0 + hmac_secret: "{{ hmac_secret }}" + hmac_algo: "{{ hmac_algo | default('sha256') }}" + hmac_header: "{{ hmac_header | default('x-hub-signature-256') }}" + hmac_format: "{{ hmac_format | default('hex') }}" + - ansible.eda.generic: + event_delay: 90 + payload: + - name : Fred + - name : Barney + + rules: + - name: Shutdown + condition: event.payload.shutdown + action: + shutdown: + message: "Shutting down activation" + delay: 1 + - name: Fred's rule + condition: event.name == 'Fred' + action: + debug: + - name: Check i is 1 + condition: event.i == 1 + action: + print_event: + - name: Wilma's rule + condition: event.payload.name == "Wilma" + action: + none: + - name: Broadcast + condition: event.payload.broadcast + action: + debug: + msg: "PSA ({ event.payload.message }}" diff --git a/rulebooks/webhook_with_shutdown.yml b/rulebooks/webhook_with_shutdown.yml new file mode 100644 index 0000000..c032422 --- /dev/null +++ b/rulebooks/webhook_with_shutdown.yml @@ -0,0 +1,22 @@ +--- +- name: Webhook rulebook with Shutdown + hosts: all + sources: + - ansible.eda.webhook: + port: 5555 + host: 0.0.0.0 + rules: + - name: Shutdown + condition: event.payload.shutdown + action: + shutdown: + message: "Shutting down activation" + - name: Wilma's rule + condition: event.payload.name == "Wilma" + action: + none: + - name: Broadcast in wilmas rulebook + condition: event.payload.broadcast + action: + debug: + msg: "PSA ({ event.payload.message }}" diff --git a/rulebooks/webhook_with_token.yml b/rulebooks/webhook_with_token.yml new file mode 100644 index 0000000..3b2d86a --- /dev/null +++ b/rulebooks/webhook_with_token.yml @@ -0,0 +1,23 @@ +--- +- name: Wilmas webhook rulebook with Token + hosts: all + sources: + - ansible.eda.webhook: + port: 5555 + host: 0.0.0.0 + token: "{{ webhook_token }}" + rules: + - name: Shutdown + condition: event.payload.shutdown + action: + shutdown: + message: "Shutting down activation" + - name: Wilma's rule + condition: event.payload.name == "Wilma" + action: + none: + - name: Broadcast in wilmas rulebook + condition: event.payload.broadcast + action: + debug: + msg: "PSA ({ event.payload.message }}" diff --git a/rulebooks/with_names.yml b/rulebooks/with_names.yml new file mode 100644 index 0000000..7e5e7a3 --- /dev/null +++ b/rulebooks/with_names.yml @@ -0,0 +1,42 @@ +--- +- name: Webhook rulebook with distinct name + hosts: all + sources: + - name: my_snow + ansible.eda.webhook: + port: 5555 + host: 0.0.0.0 + filters: + - ansible.eda.json_filter: + include_keys: + - payload + - approval + - sys_class_name + - sys_created_by + - category + - urgency + exclude_keys: + - '*' + - name: my_github + ansible.eda.webhook: + port: 5556 + host: 0.0.0.0 + filters: + - ansible.eda.json_filter: + include_keys: + - payload + - repository + - name + - full_name + - url + - sender + - login + - login + - zen + exclude_keys: + - '*' + rules: + - name: Webhook event + condition: true + action: + debug: