Stat.exists 在 ansible 中使用字典

Stat.exists with dictionary in ansible

我在 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]

尝试运行我的ansible角色我会得到错误:

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"}

类似的内容

- name: Register a runner if exist
  include_tasks: register_runner.yml
  with_dict: "{{ runners }}"

新文件 register_runner.yml 包含:

- 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]