)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"72ca28058bee1af974d80385c4651bb5cadf1429","unresolved":true,"context_lines":[{"line_number":4,"context_line":"Commit:     Michal Nasiadka \u003cmnasiadka@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2026-06-02 17:00:08 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Deploy node_exporter across all managed hosts"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"- Add prometheus-node-exporter role and inventory group"},{"line_number":10,"context_line":"- Run official node exporter image from quay.io"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"ff95fbac_9b4cc5ed","line":7,"range":{"start_line":7,"start_character":28,"end_line":7,"end_character":45},"updated":"2026-06-08 22:43:23.000000000","message":"Nit we reduced the scope to start to only those in the node exporter group. If we push a new patchset maybe update this to say \"Add node_exporter role for stats reporting\"","commit_id":"d80004f6c587ad232675fe625d84efb58b866359"},{"author":{"_account_id":22629,"name":"Michal Nasiadka","email":"mnasiadka@gmail.com","username":"mnasiadka"},"change_message_id":"95ba5acd20fee59e2a5d0b854aa3c72e5ca2bba6","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Michal Nasiadka \u003cmnasiadka@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2026-06-02 17:00:08 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Deploy node_exporter across all managed hosts"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"- Add prometheus-node-exporter role and inventory group"},{"line_number":10,"context_line":"- Run official node exporter image from quay.io"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"6d4683cb_9e22405e","line":7,"range":{"start_line":7,"start_character":28,"end_line":7,"end_character":45},"in_reply_to":"ff95fbac_9b4cc5ed","updated":"2026-06-09 22:12:17.000000000","message":"Done","commit_id":"d80004f6c587ad232675fe625d84efb58b866359"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"72ca28058bee1af974d80385c4651bb5cadf1429","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"0027afaa_c37047c7","updated":"2026-06-08 22:43:23.000000000","message":"As previously discussed these changes don\u0027t currently add deployment jobs. I think we will want a separate deployment job that runs service-node-exporter against the new group similarly to how we manage borg backups. Basically this is a playbook that runs against a subset of hosts that doesn\u0027t configure the primary server on that host but adds useful services alongside the primary service.\n\nThen I think we should add an iptables rule similar to what we add for all hosts and cacti at https://opendev.org/opendev/system-config/src/branch/master/inventory/base/group_vars/all.yaml#L18-L19 but specifically for the new node exporter group so that hosts that are added to that group automatically get the extra iptables rule to allow prometheus to query them.\n\nI\u0027m +2 because I think I\u0027m good with refining this as we go rather than trying to make it perfect on the first pass. But happy for changes to be updated as well and I will rereview.","commit_id":"d80004f6c587ad232675fe625d84efb58b866359"}],"inventory/service/groups.yaml":[{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"72ca28058bee1af974d80385c4651bb5cadf1429","unresolved":true,"context_lines":[{"line_number":119,"context_line":"  prometheus:"},{"line_number":120,"context_line":"    - prometheus[0-9]*.opendev.org"},{"line_number":121,"context_line":"  prometheus-node-exporter:"},{"line_number":122,"context_line":"    - prometheus[0-9]*.opendev.org"},{"line_number":123,"context_line":"  puppet:"},{"line_number":124,"context_line":"    - cacti[0-9]*.open*.org"},{"line_number":125,"context_line":"    - storyboard-dev[0-9]*.opendev.org"}],"source_content_type":"text/x-yaml","patch_set":7,"id":"801d8d62_8c47b310","line":122,"updated":"2026-06-08 22:43:23.000000000","message":"By default only the new prometheus server will export to itself. That seems like a good starting point.","commit_id":"d80004f6c587ad232675fe625d84efb58b866359"}],"playbooks/base.yaml":[{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"7f1e642bba74a8f6aaf7094e03c60a13b2e59cf7","unresolved":true,"context_lines":[{"line_number":8,"context_line":"    - base/unbound"},{"line_number":9,"context_line":"    - base/exim"},{"line_number":10,"context_line":"    - base/snmpd"},{"line_number":11,"context_line":"    - prometheus.prometheus.node_exporter"},{"line_number":12,"context_line":"    - iptables"}],"source_content_type":"text/x-yaml","patch_set":1,"id":"392ae8d2_0eb0ff78","line":11,"updated":"2026-03-18 21:56:55.000000000","message":"I like how simple this appears to make things, but I do have a few concerns/thoughts that should be solvable.\n\nThe first is that the default set of exported data includes some stuff we may not want to include: https://github.com/prometheus/node_exporter#enabled-by-default In particular uname and entropy may not be good to expose by default? I\u0027m happy to be overridden but I think it is worth considering the set of data that we will collect and expose. If we decide to exclude some metrics it looks like this role will take a list of things to disable: https://prometheus-community.github.io/ansible/branch/main/node_exporter_role.html#parameter-main--node_exporter_disabled_collectors\n\nAnother thing that stands out to me is that there doesn\u0027t appear to be a great way to vendor a checksums file so its a bit dubious to me how valuable checking checksums is for security (it is still helpful for partial downloads or bit flips): https://github.com/prometheus-community/ansible/blob/0.28.0/roles/node_exporter/defaults/main.yml shows that they fetch teh checksums and the content from github releases.\n\nI do think that we can grab that file and stash it into our ansible and then stick it on disk and set the url to something like file:///etc/prometheus/release_checksums or similar, but I am probably overthinking this.\n\nFinally, they create a system user and group: https://github.com/prometheus-community/ansible/blob/0.28.0/roles/_common/tasks/install.yml#L22-L47 this should be fine on our systems because we push out our personal users in to the 2k range and have random service uuids for containers in the 10ks range in many cases. The use of the system flag here should get us a three digit uid/gid. But considering we\u0027re deploying this broadly we should probably check some held nodes and double check these assumptions.\n\nAnyway these comments here are meant to solicit feedback not show strong opinions from my part either way. I think the rest of the role seems fine.","commit_id":"96c03923bd66389addec79f51cde781bf6b19b4f"},{"author":{"_account_id":22629,"name":"Michal Nasiadka","email":"mnasiadka@gmail.com","username":"mnasiadka"},"change_message_id":"d881684c9b94176c4c953f837e51642e19d22b00","unresolved":false,"context_lines":[{"line_number":8,"context_line":"    - base/unbound"},{"line_number":9,"context_line":"    - base/exim"},{"line_number":10,"context_line":"    - base/snmpd"},{"line_number":11,"context_line":"    - prometheus.prometheus.node_exporter"},{"line_number":12,"context_line":"    - iptables"}],"source_content_type":"text/x-yaml","patch_set":1,"id":"0fa2c2d0_13c9f7a0","line":11,"in_reply_to":"392ae8d2_0eb0ff78","updated":"2026-05-26 18:10:59.000000000","message":"Reworked this to a local role that uses the docker compose approach","commit_id":"96c03923bd66389addec79f51cde781bf6b19b4f"}],"playbooks/roles/install-ansible/tasks/main.yaml":[{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"7f1e642bba74a8f6aaf7094e03c60a13b2e59cf7","unresolved":true,"context_lines":[{"line_number":98,"context_line":"- name: Install prometheus.prometheus collection"},{"line_number":99,"context_line":"  command: \u003e-"},{"line_number":100,"context_line":"    /usr/ansible-venv/bin/ansible-galaxy collection install"},{"line_number":101,"context_line":"    prometheus.prometheus:\u003d\u003d0.28.0"},{"line_number":102,"context_line":"  register: _galaxy_prometheus_result"},{"line_number":103,"context_line":"  changed_when: \"\u0027was installed successfully\u0027 in _galaxy_prometheus_result.stdout\""},{"line_number":104,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":1,"id":"0d9ca8e5_44ca1edd","line":101,"updated":"2026-03-18 21:56:55.000000000","message":"Any idea if this will reinstall every time ansible runs? If so maybe we should add a creates argument to this command task so that we won\u0027t reinstall unless files are missing.","commit_id":"96c03923bd66389addec79f51cde781bf6b19b4f"},{"author":{"_account_id":22629,"name":"Michal Nasiadka","email":"mnasiadka@gmail.com","username":"mnasiadka"},"change_message_id":"d881684c9b94176c4c953f837e51642e19d22b00","unresolved":false,"context_lines":[{"line_number":98,"context_line":"- name: Install prometheus.prometheus collection"},{"line_number":99,"context_line":"  command: \u003e-"},{"line_number":100,"context_line":"    /usr/ansible-venv/bin/ansible-galaxy collection install"},{"line_number":101,"context_line":"    prometheus.prometheus:\u003d\u003d0.28.0"},{"line_number":102,"context_line":"  register: _galaxy_prometheus_result"},{"line_number":103,"context_line":"  changed_when: \"\u0027was installed successfully\u0027 in _galaxy_prometheus_result.stdout\""},{"line_number":104,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":1,"id":"a2ba0409_0b9f0ab9","line":101,"in_reply_to":"0d9ca8e5_44ca1edd","updated":"2026-05-26 18:10:59.000000000","message":"It\u0027s not in the patch anymore since we decided to go with a local role.","commit_id":"96c03923bd66389addec79f51cde781bf6b19b4f"}],"playbooks/roles/prometheus-node-exporter/templates/docker-compose.yaml.j2":[{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"72ca28058bee1af974d80385c4651bb5cadf1429","unresolved":true,"context_lines":[{"line_number":1,"context_line":"services:"},{"line_number":2,"context_line":"  node-exporter:"},{"line_number":3,"context_line":"    image: quay.io/prometheus/node-exporter:v1.9.1"},{"line_number":4,"context_line":"    network_mode: host"},{"line_number":5,"context_line":"    restart: always"},{"line_number":6,"context_line":"    command:"}],"source_content_type":"text/x-jinja2","patch_set":7,"id":"d19996a7_307c10f4","line":3,"range":{"start_line":3,"start_character":45,"end_line":3,"end_character":50},"updated":"2026-06-08 22:43:23.000000000","message":"There is a 1.11.1 release now. Should we be using that?","commit_id":"d80004f6c587ad232675fe625d84efb58b866359"},{"author":{"_account_id":22629,"name":"Michal Nasiadka","email":"mnasiadka@gmail.com","username":"mnasiadka"},"change_message_id":"95ba5acd20fee59e2a5d0b854aa3c72e5ca2bba6","unresolved":false,"context_lines":[{"line_number":1,"context_line":"services:"},{"line_number":2,"context_line":"  node-exporter:"},{"line_number":3,"context_line":"    image: quay.io/prometheus/node-exporter:v1.9.1"},{"line_number":4,"context_line":"    network_mode: host"},{"line_number":5,"context_line":"    restart: always"},{"line_number":6,"context_line":"    command:"}],"source_content_type":"text/x-jinja2","patch_set":7,"id":"bd66059e_35efd077","line":3,"range":{"start_line":3,"start_character":45,"end_line":3,"end_character":50},"in_reply_to":"d19996a7_307c10f4","updated":"2026-06-09 22:12:17.000000000","message":"Done","commit_id":"d80004f6c587ad232675fe625d84efb58b866359"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"72ca28058bee1af974d80385c4651bb5cadf1429","unresolved":true,"context_lines":[{"line_number":6,"context_line":"    command:"},{"line_number":7,"context_line":"      - \u0027--path.rootfs\u003d/host\u0027"},{"line_number":8,"context_line":"    volumes:"},{"line_number":9,"context_line":"      - /:/host:ro,rslave"},{"line_number":10,"context_line":"    logging:"},{"line_number":11,"context_line":"      driver: journald"},{"line_number":12,"context_line":"      options:"}],"source_content_type":"text/x-jinja2","patch_set":7,"id":"5f500b40_521b3c56","line":9,"range":{"start_line":9,"start_character":19,"end_line":9,"end_character":25},"updated":"2026-06-08 22:43:23.000000000","message":"I\u0027ve read the docker documentation on this and I\u0027m not fully sure I understand why this option is used. If we understand it is that worth a comment?","commit_id":"d80004f6c587ad232675fe625d84efb58b866359"},{"author":{"_account_id":22629,"name":"Michal Nasiadka","email":"mnasiadka@gmail.com","username":"mnasiadka"},"change_message_id":"95ba5acd20fee59e2a5d0b854aa3c72e5ca2bba6","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    command:"},{"line_number":7,"context_line":"      - \u0027--path.rootfs\u003d/host\u0027"},{"line_number":8,"context_line":"    volumes:"},{"line_number":9,"context_line":"      - /:/host:ro,rslave"},{"line_number":10,"context_line":"    logging:"},{"line_number":11,"context_line":"      driver: journald"},{"line_number":12,"context_line":"      options:"}],"source_content_type":"text/x-jinja2","patch_set":7,"id":"695996aa_079c66b6","line":9,"range":{"start_line":9,"start_character":19,"end_line":9,"end_character":25},"in_reply_to":"5f500b40_521b3c56","updated":"2026-06-09 22:12:17.000000000","message":"Done","commit_id":"d80004f6c587ad232675fe625d84efb58b866359"}],"playbooks/roles/prometheus/templates/prometheus.yml.j2":[{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"7f1e642bba74a8f6aaf7094e03c60a13b2e59cf7","unresolved":true,"context_lines":[{"line_number":9,"context_line":""},{"line_number":10,"context_line":"  - job_name: \u0027node\u0027"},{"line_number":11,"context_line":"    static_configs:"},{"line_number":12,"context_line":"{% for host in groups[\u0027all\u0027] | sort %}"},{"line_number":13,"context_line":"{% if hostvars[host][\u0027public_v4\u0027] is defined and hostvars[host][\u0027public_v4\u0027] %}"},{"line_number":14,"context_line":"      - targets: [\u0027{{ hostvars[host][\u0027public_v4\u0027] }}:9100\u0027]"},{"line_number":15,"context_line":"        labels:"}],"source_content_type":"text/x-jinja2","patch_set":1,"id":"fb8d680a_4ff906cf","line":12,"updated":"2026-03-18 21:56:55.000000000","message":"Should we consider a phased rollout where we have an explicit node-exporter group that we add hosts to and ensure things are working? In other comments on this change I\u0027ve left notes about potential deployment concerns like overexposing data publicly, port collisions, and uuid/gid collisions. Starting with a smaller subset of nodes may reduce risk while we spin this up.","commit_id":"96c03923bd66389addec79f51cde781bf6b19b4f"},{"author":{"_account_id":22629,"name":"Michal Nasiadka","email":"mnasiadka@gmail.com","username":"mnasiadka"},"change_message_id":"d881684c9b94176c4c953f837e51642e19d22b00","unresolved":false,"context_lines":[{"line_number":9,"context_line":""},{"line_number":10,"context_line":"  - job_name: \u0027node\u0027"},{"line_number":11,"context_line":"    static_configs:"},{"line_number":12,"context_line":"{% for host in groups[\u0027all\u0027] | sort %}"},{"line_number":13,"context_line":"{% if hostvars[host][\u0027public_v4\u0027] is defined and hostvars[host][\u0027public_v4\u0027] %}"},{"line_number":14,"context_line":"      - targets: [\u0027{{ hostvars[host][\u0027public_v4\u0027] }}:9100\u0027]"},{"line_number":15,"context_line":"        labels:"}],"source_content_type":"text/x-jinja2","patch_set":1,"id":"41e81f37_54cfd016","line":12,"in_reply_to":"fb8d680a_4ff906cf","updated":"2026-05-26 18:10:59.000000000","message":"Defined prometheus-node-exporter group","commit_id":"96c03923bd66389addec79f51cde781bf6b19b4f"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"7f1e642bba74a8f6aaf7094e03c60a13b2e59cf7","unresolved":true,"context_lines":[{"line_number":11,"context_line":"    static_configs:"},{"line_number":12,"context_line":"{% for host in groups[\u0027all\u0027] | sort %}"},{"line_number":13,"context_line":"{% if hostvars[host][\u0027public_v4\u0027] is defined and hostvars[host][\u0027public_v4\u0027] %}"},{"line_number":14,"context_line":"      - targets: [\u0027{{ hostvars[host][\u0027public_v4\u0027] }}:9100\u0027]"},{"line_number":15,"context_line":"        labels:"},{"line_number":16,"context_line":"          instance: \u0027{{ host }}\u0027"},{"line_number":17,"context_line":"{% endif %}"}],"source_content_type":"text/x-jinja2","patch_set":1,"id":"fdf72705_7ab21e58","line":14,"updated":"2026-03-18 21:56:55.000000000","message":"In the past we\u0027ve had ipv6 only clouds and nodes. In those cases there won\u0027t be a public_v4 record. But the ansible_host value is set to public_v4 for hosts with v4 and for those with v6 they will have the v6 address. All that to say can we use ansible_host here instead?\n\nAdditionally, a naive grep in opendev/system-config doesn\u0027t show up any hits for 9100 so it is unlikely that we will have a port collision but something to keep in mind as we deploy this.","commit_id":"96c03923bd66389addec79f51cde781bf6b19b4f"},{"author":{"_account_id":22629,"name":"Michal Nasiadka","email":"mnasiadka@gmail.com","username":"mnasiadka"},"change_message_id":"d881684c9b94176c4c953f837e51642e19d22b00","unresolved":false,"context_lines":[{"line_number":11,"context_line":"    static_configs:"},{"line_number":12,"context_line":"{% for host in groups[\u0027all\u0027] | sort %}"},{"line_number":13,"context_line":"{% if hostvars[host][\u0027public_v4\u0027] is defined and hostvars[host][\u0027public_v4\u0027] %}"},{"line_number":14,"context_line":"      - targets: [\u0027{{ hostvars[host][\u0027public_v4\u0027] }}:9100\u0027]"},{"line_number":15,"context_line":"        labels:"},{"line_number":16,"context_line":"          instance: \u0027{{ host }}\u0027"},{"line_number":17,"context_line":"{% endif %}"}],"source_content_type":"text/x-jinja2","patch_set":1,"id":"2d677fa4_8b2de55a","line":14,"in_reply_to":"fdf72705_7ab21e58","updated":"2026-05-26 18:10:59.000000000","message":"Reworked that to use ansible_host","commit_id":"96c03923bd66389addec79f51cde781bf6b19b4f"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"aaf194cb21a6bf47b481ed7604f93974f3271364","unresolved":true,"context_lines":[{"line_number":10,"context_line":"  - job_name: \u0027node\u0027"},{"line_number":11,"context_line":"    static_configs:"},{"line_number":12,"context_line":"{% for host in groups[\u0027prometheus-node-exporter\u0027] | sort %}"},{"line_number":13,"context_line":"      - targets: [\u0027{{ hostvars[host][\u0027ansible_host\u0027] }}:9100\u0027]"},{"line_number":14,"context_line":"        labels:"},{"line_number":15,"context_line":"          instance: \u0027{{ host }}\u0027"},{"line_number":16,"context_line":"{% endfor %}"}],"source_content_type":"text/x-jinja2","patch_set":8,"id":"b408c4a7_72b2b54c","line":13,"updated":"2026-06-18 21:08:03.000000000","message":"Do we open port 9100 anywhere?\n\nI haven\u0027t seen it, but maybe I missed it.  It also looks like testinfra may not be connecting to a remote host -- maybe we should add a testinfra test that connects from the prometheus host to a remote node?","commit_id":"4930d188730cea2e63ef7ed0e458a7aa6695c1d4"},{"author":{"_account_id":22629,"name":"Michal Nasiadka","email":"mnasiadka@gmail.com","username":"mnasiadka"},"change_message_id":"75c493602ad245a07ad169b891eddbd2e91ea768","unresolved":false,"context_lines":[{"line_number":10,"context_line":"  - job_name: \u0027node\u0027"},{"line_number":11,"context_line":"    static_configs:"},{"line_number":12,"context_line":"{% for host in groups[\u0027prometheus-node-exporter\u0027] | sort %}"},{"line_number":13,"context_line":"      - targets: [\u0027{{ hostvars[host][\u0027ansible_host\u0027] }}:9100\u0027]"},{"line_number":14,"context_line":"        labels:"},{"line_number":15,"context_line":"          instance: \u0027{{ host }}\u0027"},{"line_number":16,"context_line":"{% endfor %}"}],"source_content_type":"text/x-jinja2","patch_set":8,"id":"b7c945d0_0ee9a67d","line":13,"in_reply_to":"b408c4a7_72b2b54c","updated":"2026-06-19 14:45:59.000000000","message":"Done","commit_id":"4930d188730cea2e63ef7ed0e458a7aa6695c1d4"}],"zuul.d/system-config-run.yaml":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"c2eaf9b2eba42ce60b8ee359181a8a40b7fecbde","unresolved":false,"context_lines":[{"line_number":734,"context_line":"      - testinfra/test_graphite.py"},{"line_number":735,"context_line":""},{"line_number":736,"context_line":"- job:"},{"line_number":737,"context_line":"    name: system-config-run-prometheus"},{"line_number":738,"context_line":"    parent: system-config-run"},{"line_number":739,"context_line":"    description: |"},{"line_number":740,"context_line":"      Run the playbook for the prometheus servers."},{"line_number":741,"context_line":"    nodeset:"},{"line_number":742,"context_line":"      nodes:"},{"line_number":743,"context_line":"        - \u003c\u003c: *bridge_node"},{"line_number":744,"context_line":"        - name: prometheus99.opendev.org"},{"line_number":745,"context_line":"          label: ubuntu-noble"},{"line_number":746,"context_line":"        - name: node-exporter99.opendev.org"},{"line_number":747,"context_line":"          label: ubuntu-noble"},{"line_number":748,"context_line":"      groups:"},{"line_number":749,"context_line":"        - \u003c\u003c: *bastion_group"},{"line_number":750,"context_line":"    vars:"},{"line_number":751,"context_line":"      run_playbooks:"},{"line_number":752,"context_line":"        - playbooks/letsencrypt.yaml"},{"line_number":753,"context_line":"        - playbooks/service-prometheus.yaml"},{"line_number":754,"context_line":"        - playbooks/service-node-exporter.yaml"},{"line_number":755,"context_line":"    files:"},{"line_number":756,"context_line":"      - playbooks/bootstrap-bridge.yaml"},{"line_number":757,"context_line":"      - playbooks/letsencrypt.yaml"},{"line_number":758,"context_line":"      - playbooks/service-prometheus.yaml"},{"line_number":759,"context_line":"      - playbooks/service-node-exporter.yaml"},{"line_number":760,"context_line":"      - playbooks/roles/prometheus/"},{"line_number":761,"context_line":"      - playbooks/roles/prometheus-node-exporter/"},{"line_number":762,"context_line":"      - playbooks/roles/install-docker/"},{"line_number":763,"context_line":"      - playbooks/roles/pip3/"},{"line_number":764,"context_line":"      - playbooks/roles/iptables/"},{"line_number":765,"context_line":"      - playbooks/roles/run-selenium/"},{"line_number":766,"context_line":"      - inventory/service/group_vars/prometheus-node-exporter.yaml"},{"line_number":767,"context_line":"      - testinfra/util.py"},{"line_number":768,"context_line":"      - testinfra/test_prometheus.py"},{"line_number":769,"context_line":"      - testinfra/test_node_exporter.py"},{"line_number":770,"context_line":"    vars:"},{"line_number":771,"context_line":"      run_playbooks:"},{"line_number":772,"context_line":"        - playbooks/letsencrypt.yaml"},{"line_number":773,"context_line":"        - playbooks/service-prometheus.yaml"},{"line_number":774,"context_line":"    files:"},{"line_number":775,"context_line":"      - playbooks/bootstrap-bridge.yaml"},{"line_number":776,"context_line":"      - playbooks/letsencrypt.yaml"},{"line_number":777,"context_line":"      - playbooks/service-prometheus.yaml"},{"line_number":778,"context_line":"      - playbooks/roles/prometheus/"},{"line_number":779,"context_line":"      - playbooks/roles/install-docker/"},{"line_number":780,"context_line":"      - playbooks/roles/pip3/"},{"line_number":781,"context_line":"      - playbooks/roles/run-selenium/"},{"line_number":782,"context_line":"      - testinfra/util.py"},{"line_number":783,"context_line":"      - testinfra/test_prometheus.py"},{"line_number":784,"context_line":""},{"line_number":785,"context_line":"- job:"},{"line_number":786,"context_line":"    name: system-config-run-keycloak"},{"line_number":787,"context_line":"    parent: system-config-run"}],"source_content_type":"text/x-yaml","patch_set":18,"id":"795a378d_55cdaef2","line":784,"range":{"start_line":737,"start_character":4,"end_line":784,"end_character":0},"updated":"2026-06-26 12:43:40.000000000","message":"The key \"vars\" appears more than once; duplicate keys are not permitted.","commit_id":"52e10944e0b5286c811a0940fd592351165c2a3a"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check-arm64","change_message_id":"9485b6ef5a204d34fde2b261ff64607bc19c72d8","unresolved":false,"context_lines":[{"line_number":734,"context_line":"      - testinfra/test_graphite.py"},{"line_number":735,"context_line":""},{"line_number":736,"context_line":"- job:"},{"line_number":737,"context_line":"    name: system-config-run-prometheus"},{"line_number":738,"context_line":"    parent: system-config-run"},{"line_number":739,"context_line":"    description: |"},{"line_number":740,"context_line":"      Run the playbook for the prometheus servers."},{"line_number":741,"context_line":"    nodeset:"},{"line_number":742,"context_line":"      nodes:"},{"line_number":743,"context_line":"        - \u003c\u003c: *bridge_node"},{"line_number":744,"context_line":"        - name: prometheus99.opendev.org"},{"line_number":745,"context_line":"          label: ubuntu-noble"},{"line_number":746,"context_line":"        - name: node-exporter99.opendev.org"},{"line_number":747,"context_line":"          label: ubuntu-noble"},{"line_number":748,"context_line":"      groups:"},{"line_number":749,"context_line":"        - \u003c\u003c: *bastion_group"},{"line_number":750,"context_line":"    vars:"},{"line_number":751,"context_line":"      run_playbooks:"},{"line_number":752,"context_line":"        - playbooks/letsencrypt.yaml"},{"line_number":753,"context_line":"        - playbooks/service-prometheus.yaml"},{"line_number":754,"context_line":"        - playbooks/service-node-exporter.yaml"},{"line_number":755,"context_line":"    files:"},{"line_number":756,"context_line":"      - playbooks/bootstrap-bridge.yaml"},{"line_number":757,"context_line":"      - playbooks/letsencrypt.yaml"},{"line_number":758,"context_line":"      - playbooks/service-prometheus.yaml"},{"line_number":759,"context_line":"      - playbooks/service-node-exporter.yaml"},{"line_number":760,"context_line":"      - playbooks/roles/prometheus/"},{"line_number":761,"context_line":"      - playbooks/roles/prometheus-node-exporter/"},{"line_number":762,"context_line":"      - playbooks/roles/install-docker/"},{"line_number":763,"context_line":"      - playbooks/roles/pip3/"},{"line_number":764,"context_line":"      - playbooks/roles/iptables/"},{"line_number":765,"context_line":"      - playbooks/roles/run-selenium/"},{"line_number":766,"context_line":"      - inventory/service/group_vars/prometheus-node-exporter.yaml"},{"line_number":767,"context_line":"      - testinfra/util.py"},{"line_number":768,"context_line":"      - testinfra/test_prometheus.py"},{"line_number":769,"context_line":"      - testinfra/test_node_exporter.py"},{"line_number":770,"context_line":"    vars:"},{"line_number":771,"context_line":"      run_playbooks:"},{"line_number":772,"context_line":"        - playbooks/letsencrypt.yaml"},{"line_number":773,"context_line":"        - playbooks/service-prometheus.yaml"},{"line_number":774,"context_line":"    files:"},{"line_number":775,"context_line":"      - playbooks/bootstrap-bridge.yaml"},{"line_number":776,"context_line":"      - playbooks/letsencrypt.yaml"},{"line_number":777,"context_line":"      - playbooks/service-prometheus.yaml"},{"line_number":778,"context_line":"      - playbooks/roles/prometheus/"},{"line_number":779,"context_line":"      - playbooks/roles/install-docker/"},{"line_number":780,"context_line":"      - playbooks/roles/pip3/"},{"line_number":781,"context_line":"      - playbooks/roles/run-selenium/"},{"line_number":782,"context_line":"      - testinfra/util.py"},{"line_number":783,"context_line":"      - testinfra/test_prometheus.py"},{"line_number":784,"context_line":""},{"line_number":785,"context_line":"- job:"},{"line_number":786,"context_line":"    name: system-config-run-keycloak"},{"line_number":787,"context_line":"    parent: system-config-run"}],"source_content_type":"text/x-yaml","patch_set":18,"id":"a33b4a74_a2376ddc","line":784,"range":{"start_line":737,"start_character":4,"end_line":784,"end_character":0},"updated":"2026-06-26 12:43:46.000000000","message":"The key \"vars\" appears more than once; duplicate keys are not permitted.","commit_id":"52e10944e0b5286c811a0940fd592351165c2a3a"}]}
