I have a problem with checking existing files using a dictonary in Ansible.
- name: Test if config file exists
ansible.builtin.stat:
path: "{{ agpm_runner_base_dir }}/{{ item.key }}/config.toml"
with_dict: "{{ runners }}"
register: config
- name: Register a runner
command: >
docker run
--rm
-v {{ agpm_runner_base_dir }}/{{ item.key }}:/etc/gitlab-runner
-v {{ agpm_runner_base_dir }}/certs:/etc/gitlab-runner/certs
{{ agpm_runner_image }}
register --non-interactive --tls-ca-file /etc/gitlab-runner/certs/default.crt
--url "https://172.20.100.106/" --registration-token "{{ item.value.token }}"
--name "gitlab-runner" --tag-list "runner,docker" --executor "docker"
--docker-volumes /var/run/docker.sock:/var/run/docker.sock
--docker-image alpine:latest --run-untagged="true"
--locked="false" --access-level="not_protected"
with_items: "{{ config.results }}"
when:
- item.stat.exists == false
environment:
- constraint: [node == SRWDVNODE1.agpm.adm]
Trying to run my ansible role I will get the error:
TASK [agpm.runner : Test if config file exists] ****************************************************************************************************************************************************************************
ok: [192.168.171.113] => (item={'key': 'runner1', 'value': {'name': 'runner1', 'cpu': 0.5, 'mem': 256, 'concurrent': 2, 'token': 'rNTPkdzj-8RaYjfGrwbz'}}) => {"ansible_loop_var": "item", "changed": false, "item": {"key": "runner1", "value": {"concurrent": 2, "cpu": 0.5, "mem": 256, "name": "runner1", "token": "rNTPkdzj-8RaYjfGrwbz"}}, "stat": {"exists": false}}
ok: [192.168.171.113] => (item={'key': 'runner2', 'value': {'name': 'runner2', 'cpu': 0.5, 'mem': 256, 'concurrent': 3, 'token': 'rNTPkdzj-8RaYjfGrwbz'}}) => {"ansible_loop_var": "item", "changed": false, "item": {"key": "runner2", "value": {"concurrent": 3, "cpu": 0.5, "mem": 256, "name": "runner2", "token": "rNTPkdzj-8RaYjfGrwbz"}}, "stat": {"exists": false}}
TASK [agpm.runner : Register a runner] *************************************************************************************************************************************************************************************
fatal: [192.168.171.113]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'dict object' has no attribute 'key'\n\nThe error appears to be in '/root/2projet-runner/roles/agpm.runner/tasks/main.yml': line 46, column 3, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n- name: Register a runner\n ^ here\n"}
Something similar to this
- name: Register a runner if exist
include_tasks: register_runner.yml
with_dict: "{{ runners }}"
and new file register_runner.yml
contains:
- name: Test if config file exists
ansible.builtin.stat:
path: "{{ agpm_runner_base_dir }}/{{ item.key }}/config.toml"
register: config
- name: Register a runner
command: >
docker run
--rm
-v {{ agpm_runner_base_dir }}/{{ item.key }}:/etc/gitlab-runner
-v {{ agpm_runner_base_dir }}/certs:/etc/gitlab-runner/certs
{{ agpm_runner_image }}
register --non-interactive --tls-ca-file /etc/gitlab-runner/certs/default.crt
--url "https://172.20.100.106/" --registration-token "{{ item.value.token }}"
--name "gitlab-runner" --tag-list "runner,docker" --executor "docker"
--docker-volumes /var/run/docker.sock:/var/run/docker.sock
--docker-image alpine:latest --run-untagged="true"
--locked="false" --access-level="not_protected"
when: config.stat.exists == false
environment:
- constraint: [node == SRWDVNODE1.agpm.adm]