{"id":24168573,"url":"https://github.com/dlotterman/metal_springald","last_synced_at":"2026-04-17T01:02:40.074Z","repository":{"id":82123700,"uuid":"574709299","full_name":"dlotterman/metal_springald","owner":"dlotterman","description":"A worker provisioning and orchestration harness intended for Benchmarking environments on Equinix Metal","archived":false,"fork":false,"pushed_at":"2022-12-06T21:03:58.000Z","size":28,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-07-19T17:48:39.873Z","etag":null,"topics":["ansible","benchmarking","equinix-metal","python"],"latest_commit_sha":null,"homepage":"","language":"Jinja","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"unlicense","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dlotterman.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2022-12-05T22:51:03.000Z","updated_at":"2024-08-31T21:20:25.000Z","dependencies_parsed_at":null,"dependency_job_id":"f9262c72-1e75-4a4c-9710-cc3a9686ac79","html_url":"https://github.com/dlotterman/metal_springald","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/dlotterman/metal_springald","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dlotterman%2Fmetal_springald","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dlotterman%2Fmetal_springald/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dlotterman%2Fmetal_springald/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dlotterman%2Fmetal_springald/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dlotterman","download_url":"https://codeload.github.com/dlotterman/metal_springald/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dlotterman%2Fmetal_springald/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31910584,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-16T18:22:33.417Z","status":"ssl_error","status_checked_at":"2026-04-16T18:21:47.142Z","response_time":69,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ansible","benchmarking","equinix-metal","python"],"created_at":"2025-01-12T22:15:27.486Z","updated_at":"2026-04-17T01:02:40.034Z","avatar_url":"https://github.com/dlotterman.png","language":"Jinja","funding_links":[],"categories":[],"sub_categories":[],"readme":"# metal_springald\n\n`metal_springald` is intended to be used as a host / worker harness for benchmarking / load generation activities inside of Equinix Metal.\n\nCurrently under active development, `metal_springald` is intended to:\n\n- Provision Equinix Metal instances with a base Linux OS (Ubuntu, CentOS etc), where those instances are intended to be used as load generation hosts.\n- Configure those hosts appropriately, including both Equinix Metal platform and the host OS itself, so that worker instances can join and participate in the correct network namespaces\n- Monitor those load generation (and other) worker hosts with [prometheus](https://prometheus.io/docs/introduction/first_steps/) + [node_exporter](https://prometheus.io/docs/guides/node-exporter/) + [grafana](https://grafana.com/docs/grafana/latest/setup-grafana/installation/debian/)\n\n![](https://s3.us-east-1.wasabisys.com/metalstaticassets/springald.PNG)\n\n## Setup\n\n### Getting Started\n\nBefore beginning, it is strongly recomemended that an operator complete the [Equinix Metal Getting Started](https://metal.equinix.com/developers/docs/) guide before proceeding with anything referenced here. The getting started documentation will make sure the account is correctly setup and walk the operator through the basics of operating Metal.\n\n### Required Accounts and Credentials:\n\n- [Equinix Metal Read / Write Token](https://github.com/openshift/assisted-installer)\n- [Equinix Metal Project ID](https://metal.equinix.com/developers/docs/accounts/projects/)\n\n#### Environment Setup\n\n- Clone this repository\n  - `git clone https://github.com/dlotterman/metal_springald`\n- Create Python [virtualenv](https://docs.python.org/3/library/venv.html) (Python 3.9 or newer is expected)\n  - `python3 -m venv metal_springald`\n- Change directory into the repository\n  - `cd metal_springald`\n- Source the [virtualenv](https://docs.python.org/3/library/venv.html#how-venvs-work) environment setup / activate\n  - `source bin/activate`\n- Update pip\n  - `pip install --upgrade pip`\n- Install Python packages required\n  - `pip install -r requirements.txt`\n- Install Equinix Metal Ansible Galaxy Collection\n  - `ansible-galaxy collection install equinix.metal`\n- Export correct environment variables:\n  - `export METAL_API_TOKEN=$YOUR_METAL_API_KEY_HERE`\n  - `export METAL_PROJ_ID=YOUR_METAL_PROJECT_ID_HERE`\n  \n#### Configuration Editing\n\nThe only **required** edit is to add your Metal Project ID to the Ansible [Inventory Plugin file](https://github.com/dlotterman/metal_springald/blob/d8336544d88e47430b7f3a29fcd3a81574f7e713/equinix_metal.yaml#L15).\n\nOtherwise the majority of the availaible configuration should be in the [all.yaml](https://github.com/dlotterman/metal_springald/blob/main/group_vars/all.yaml) file in the `group_vars` directory.\n\nNote that the environment variable exports from the end of the Environment Setup and the sourcing of the `bin/activate` venv file **MUST** be performend with every bash / user session. I.E if you logout and log back into your shell, you must re-export and activate those environment settings.\n\n#### Installing node_exporter and configuring prometheus\n\nApplying the tag `metal_springald` to an instance, including one node provisioned by this harness, will trigger this harness to try to install `node_exporter` as a `systemd` service to that host.\n\nAny host with the `metal_springald` tag will also be added to the Prometheus configuration that will be instantiated on the first client host.\n\n#### Configuring Grafana\n\nGrafana (+Prometheus) gets setup without any configuration on the first client (also called worker) on port `3000`. Once the Ansible `metal_springald_provision.yaml` is run, Grafana should be available at: `http://client01-IP:3000`, where the initial user + password will be `admin` + `admin`. \n\nOnce logged in: \n- The Prometheus datasource can be added with the default host string of `http://localhost:9090`\n- A pre-built `node_exporter` dashboard can be imported, an example one [here](https://grafana.com/grafana/dashboards/1860-node-exporter-full/), whose Grafana ID is `1860`\n\n#### Confirmation\n\nIf everything is setup correctly, you should be able to run `ansible-inventory -i equinix_metal.yaml --list` and the command will return **empty** but *without errors*.\n\nWith errors:\n```\n$ ansible-inventory -i equinix_metal.yaml --list\n[WARNING]:  * Failed to parse /home/adminuser/code/metal_assisted_openshift/equinix_metal.yaml with auto plugin: Failed\nto query devices from Equinix Metal API. Error 404: Not found\n[WARNING]:  * Failed to parse /home/adminuser/code/metal_assisted_openshift/equinix_metal.yaml with yaml plugin: Plugin\nconfiguration YAML file, not YAML inventory\n[WARNING]:  * Failed to parse /home/adminuser/code/metal_assisted_openshift/equinix_metal.yaml with ini plugin: Invalid\nhost pattern '---' supplied, '---' is normally a sign this is a YAML file.\n[WARNING]: Unable to parse /home/adminuser/code/metal_assisted_openshift/equinix_metal.yaml as an inventory source\n[WARNING]: No inventory was parsed, only implicit localhost is available\n{\n    \"_meta\": {\n        \"hostvars\": {}\n    },\n    \"all\": {\n        \"children\": [\n            \"ungrouped\"\n        ]\n    }\n}\n```\n\n*Without* errors:\n```\n$ ansible-inventory -i equinix_metal.yaml --list\n{\n    \"_meta\": {\n        \"hostvars\": {}\n    },\n    \"all\": {\n        \"children\": [\n            \"equinix_metal\",\n            \"ungrouped\"\n        ]\n    }\n}\n```\n#### iperf3 as an example workload / orchestration\n\nThe orchestration of the provisioned workers is managed through Ansible. Ansible's `free` [strategy](https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_strategies.html) is what will trigger the workload generation across all hosts at the same time. The invocation of that can be seen [here](https://github.com/dlotterman/metal_springald/blob/d8336544d88e47430b7f3a29fcd3a81574f7e713/metal_springald_siege.yaml#L5), where the `free` strategy means that all tasks in the `play_siege.yaml` playbook will be executed in parralel.\n\n`iperf3` is used as the example in this repository, where the configuration of the `iperf3` server is run on an instance configured outside of this repo, but the configuration of the test of that endpoint can be orchestrated as seen in the [all.yaml](https://github.com/dlotterman/metal_springald/blob/d8336544d88e47430b7f3a29fcd3a81574f7e713/group_vars/all.yaml#L26) file.\n\n### Provisioning the environment\n\nThis is the fun part:\n\n- `ANSIBLE_HOST_KEY_CHECKING=False ansible-playbook -i equinix_metal.yaml -u root metal_springald_provision.yaml` will provision the environment as configured (and auto accept the Metal hosts SSH keys)\n- `ansible-playbook -i equinix_metal.yaml -u root metal_springald_siege.yaml` will perform the `siege`","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdlotterman%2Fmetal_springald","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdlotterman%2Fmetal_springald","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdlotterman%2Fmetal_springald/lists"}