首页 > 解决方案 > 将一个元素添加到字典 ansible / jinja 列表中

问题描述

我正在尝试将一个元素添加到字典列表中。

_gitlab_runner_config:
      server:
        url: "https://gitlab.mydomain.com"
        api_token: "XXXXXXXXXXXXXXXXXX"
        registration_token: "YYYYYYYYYYYYYYYY"
      global:
        listen_address: ":9200"
        concurent: 5
        check_interval: 15
      session_server:
        listen_address: "0.0.0.0:8093"
        advertise_address: "{{ ansible_fqdn }}:8093"
        session_timeout: 600
      runners:
        - description: "Test runner 1"
          token: "" 
          tags:
            - test1
          locked: False
          active: False
          run_untagged: False
          access_level: "not_protected"
          maximum_timeout: "3600"
          executor: "docker"
          executor_config:
            tls_verify: false
            image: "test-image"
            pull_policy: "always"
            volumes:
            cpus:

在另一个任务中,我注册了令牌值。Si,我想设置 gitlab_runner_config.runners.LIST_INDEX.token 的值

我尝试过:

- name: "Save runner token"
  set_fact:
    _gitlab_runner_config: "{{ _gitlab_runner_config|combine({'runners': {runner_index: {'token':  _gitlab_server_registered.runner.token}}} ) }}"

但它会覆盖列表。

标签: listdictionaryansiblejinja2

解决方案


感谢您的帮助和回答@vladimir-botka。但是我的问题更复杂,但是,我的错,我没有在上一篇文章中提供所有细节。

我有一个gitlab_runner_config包含 runners 列表的字典_gitlab_runner_config.runners。我已经在此列表中循环以注册每个跑步者,并且我得到一个令牌作为响应(每个跑步者将有一个不同的令牌)。我想将此令牌插入到字段中token。整个 dictgitlab_runner_config将用于模板化配置文件。

字典:

_gitlab_runner_config:
      server:
        url: "https://gitlab.mydomain.com"
        api_token: "XXXXXXXXXXXXXXXXXX"
        registration_token: "YYYYYYYYYYYYYYYY"
      global:
        listen_address: ":9200"
        concurent: 5
        check_interval: 15
      session_server:
        listen_address: "0.0.0.0:8093"
        advertise_address: "{{ ansible_fqdn }}:8093"
        session_timeout: 600
      runners:
        - description: "Test runner 1"
          token: "" 
          tags:
            - test1
          locked: False
          active: False
          run_untagged: False
          access_level: "not_protected"
          maximum_timeout: "3600"
          executor: "docker"
          executor_config:
            tls_verify: false
            image: "test-image"
            pull_policy: "always"
            volumes:
            cpus:
        - description: "Test runner 2"
          token: "" 
          tags:
            - test2
          locked: False
          active: False
          run_untagged: False
          access_level: "not_protected"
          maximum_timeout: "3600"
          executor: "docker"
          executor_config:
            tls_verify: false
            image: "test-image"
            pull_policy: "always"
            volumes:
            cpus:

使用循环注册每个 runenr 的任务:

- name: "Registered runners"
  include_tasks: register.yml
  loop: "{{ _gitlab_runner_config.runners }}"
  loop_control:
    index_var: runner_index

注册.yml:

- name: "Register runner on gitlab server"
  gitlab_runner:
    api_url: "{{ _gitlab_runner_config.server.url }}"
    api_token: "{{ _gitlab_runner_config.server.api_token }}"
    registration_token: "{{ _gitlab_runner_config.server.registration_token }}"
    description: "[{{ ansible_fqdn }}] {{ item.description }}"
    state: "present"
    active: " {{ item.active }}"
    tag_list: "{{ item.tags }}"
    run_untagged: "{{ item.run_untagged }}"
    maximum_timeout: "{{ item.maximum_timeout }}"
    access_level: "{{ item.access_level }}"
    locked: "{{ item.locked }}"
    validate_certs: "no"
  register: _gitlab_server_registered
- name: Debug
  debug:
    msg: "Token to merge for runner id: {{ runner_index }} : {{ gitlab_server_registered.runner.token }}"

推荐阅读