Package: automaton-engine
Automaton EngineSimple, Event-driven Automation in PythonAutomaton Engine makes use of Elasticsearch as a general data aggregation layer. You feed your Automaton(s) queries
via environment variables (formatted in JSON). Based on the query result, you can chain actions together which
Automaton Engine will act on, passing query metadata off to action handlers and generally having a good time.Basically Automaton Engine isallabout the following:Query Elasticsearch on a defined scheduleUpon receiving a query response, execute defined actions and wait for a defined backoff periodReturn to querying???Profit!Current Actionsnotify- Send a Rocket Chat webhook.awx- Calls an Ansible AWX API endpoint.InstallationInstall via pip:$ pip install automaton-engineBuild from source:$ git clone https://github.com/jgericke/automaton_engine.git
$ python setup.py installRun tests:$ python setup.py testExample Workflow1. Create an Elasticsearch query to read the number of orders being processed (assuming you have some sort of order system thats sending metrics to Elasticsearch...)
2. Create an Ansible AWX job template to scale up pods running in Kubernetes based (using say, extra_parameters or something)
3. Create an Automaton Engine instance that runs the above query, with an action to call the AWX job template based on query result
4. Good gravy, your pods are scaling on a transactional metric!Automaton FeaturesRuns on python 3.7Fully asynchronous.Extendable (actions are functions created under automaton/actions).Not your Grandad's Automaton Engine.Adding Actions to Automaton EngineCreate a new action file: automaton_engine/actions/my_action.pyActions are defined as a list within yourautomatonenvironment variable, and can be chained, for example the below action fires off a rocket chat webhook (this forms part of your AUTOMATON_ENGINE_CONFIG environment variable):"actions": [
    {
        "name": "notify.rocketchat_webhook",
        "backoff_seconds": 300, 
        "parameters": {
            "rocketchat_webhook": "https://my.rocketchat/hooks/my_webhook_id",
            "rocketchat_message": "@here Things are happening!\nView dashboard: https://my.kibana/goto/my_dashboard_id",
            "rocketchat_timeout": 20
        }
    }
]When adding or extending an action, you need to make Automaton aware of the new action by adding it to automaton/automaton.py within the action_dispatcher (This will be simplified in the future). The below represents the action file and function name foractions/notify.py.action_dispatcher = {
    "notify.rocketchat_webhook": notify.rocketchat_webhook 
}Creating An AutomatonYou can launch Automaton Engine by defining the AUTOMATON_ENGINE_CONFIG environment variable, which has an expected structure as outlined below. When you're good to go, you can execute samples/auto.py which will gather all of the automatons you've defined and run them through the execution chain.Have a look at samples provided (samples/) to get a feel for scaffolding Automatonsexport AUTOMATON_ENGINE_LOGLEVEL='DEBUG'
export AUTOMATON_ENGINE_CONFIG='{ 
    "automatons": [
        {
            "name": "my_neat_automaton",
            "enabled": True,
            "runonce": False,
            "elasticsearch": {
                "url": "https://http://my.elasticsearch:9200",
                "timeout": 10,
                "auth": {
                    "username": "es_user",
                    "password": "es_pass",
                },
            },
            "elasticsearch_query": {
                "query_interval": 5,
                "query_endpoint": "/_search",
                "query_type": "aggregations",
                "query_name": "my_automaton_query",
                "query_payload": {
						"size": 0,
						"query": {
						    "range": {
                                "@timestamp": {
                                    "gte": "now-1m"
                                }
                            }
						},
						"aggregations": {
						    "bad_actors": {
                                "terms": {
                                    "field": "my_automaton_query.keyword",
                                    "min_doc_count": 1000
                                }
						    }
						}
                },
                "query_response_mapping": { 
                        "key": "go_automaton_go", 
                        "doc_count": "hits"
                }
            },
            "actions": [
                {
                    "name": "notify.rocketchat_webhook",
                    "backoff_seconds": 60,
                    "parameters": {
                        "rocketchat_webhook": "https://my.rocketchat/hooks/my_webhook_id",
                        "rocketchat_message": "@here Things are happening, Imma do stuff!",
                        "rocketchat_timeout": 10
                    }
                },
                {
                    "name": "awx.api_call",
                    "backoff_seconds": 60,
                    "parameters": {
                        "awx_url": "https://my.awx.url",
                        "awx_context": "/api/v2/job_templates/1/launch/",
                        "awx_timeout": 20,
                        "awx_auth": {
                            "username": "YXV0b21hdG9u",
                            "password": "ZDY5VG5vZUdZYjdU"
                        }
                    }
                }
            ]
        }
    ]
}'Elasticsearch AuthenticationAutomaton now supports basic authentication for elasticsearch, to configure it add an "auth" section to your automaton configuration as per below:"elasticsearch": {
                "url": "https://http://my.elasticsearch:9200",
                "timeout": 10,
                "auth": {
                    "username": "es_user",
                    "password": "es_pass",
                },
            },No elasticsearch authentication? No problem! Simply remove the auth stanza:"elasticsearch": {
                "url": "https://http://my.elasticsearch:9200",
                "timeout": 10,
            },Original Author(s)Julian Gericke(c) LSDjulian@lsd.co.zaCheckout LSD, your friendly OSS DevOps company!ContributorsMaybe you?!