Добавить один элемент в список словаря ansible / jinja - PullRequest
0 голосов
/ 27 марта 2020

Я пытаюсь добавить элемент в список словаря.

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

, но он переопределяет список.

Ответы [ 2 ]

0 голосов
/ 27 марта 2020

Спасибо за помощь и ответ @ vladimir-botka. Но моя проблема более сложная, но, по моей вине, я не дал все детали в моем последнем посте.

У меня есть dict gitlab_runner_config, который содержит список бегунов _gitlab_runner_config.runners. Я уже l oop в этом списке, чтобы зарегистрировать каждого бегуна, и я получаю токен в ответ (у каждого бегуна будет свой токен). Я хочу вставить этот токен в поле token. Весь dict gitlab_runner_config будет использоваться для шаблонов файла конфигурации.

The dict:

_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 с помощью al oop:

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

register.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 }}"
0 голосов
/ 27 марта 2020

_gitlab_runner_config.runners - это список. Это подразумевает, что в списке может быть больше элементов. Если все элементы в списке должны быть обновлены одним и тем же токеном, например, mytoken, игра ниже выполняет работу

  vars:
    mytoken: token000
  tasks:
    - set_fact:
        config_updated: "{{ {'runners': _gitlab_runner_config.runners|
                                        map('combine', {'token': mytoken})|
                                        list} }}"
    - set_fact:
        _gitlab_runner_config: "{{ _gitlab_runner_config|
                                   combine(config_updated) }}"

Если для каждого элемента списка могут быть разные токены, список должен быть обновлено в al oop. Например, учитывая список токенов mytokens, игра ниже

  vars:
    mytokens:
      - {'token': 'token000'}
      - {'token': 'token001'}
      - {'token': 'token002'}
  tasks:
    - set_fact:
        runners: "{{ runners|default([]) +
                     [item|combine(mytokens[ansible_loop.index0])] }}"
      loop: "{{ _gitlab_runner_config.runners }}"
      loop_control:
        extended: yes
    - set_fact:
        config_updated: "{{ {'runners': runners} }}"
    - set_fact:
        _gitlab_runner_config: "{{ _gitlab_runner_config|
                                   combine(config_updated) }}"
    - debug:
        var: _gitlab_runner_config

дает

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