Используйте фигурные скобки вместо скобок для списка Terraform - PullRequest
0 голосов
/ 21 января 2020

Я хочу установить официальный jenkins шлем график , используя Terraform, который затем вызывает Ansible.

В идеале, я бы использовал поставщика Terraform helm, но у него есть серьезное ограничение , когда будучи вызвано через tls .

Поэтому я выполняю фактическое helm установка с помощью следующей local-exec установки.

  provisioner "local-exec" {
    command = "ansible-playbook -vvv ${path.module}/playbooks/playbook.yaml -i ./playbooks/hosts --extra-vars \"{ \"k8s_cluster_name\": \"${local.k8s_name}\", \"zonename\": \"${var.zone}\", \"env_name\": \"${var.env_name}\", \"google_project_name\": \"${var.project_id}\", \"jenkins_master_image_tag\": \"${var.jenkins_master_image_tag}\", \"jenkins_agent_image_tag\": \"${var.jenkins_agent_image_tag}\", \"jenkins_plugins_list\": \"${var.jenkins_plugins_list}\" }\""
  }
}

Моя цель состоит в том, чтобы иметь возможность передать список плагинов, используемых в файле значений, в качестве аргумента (т. Е. Extra var) в ansible cmd.

Поэтому я объявил следующую переменную:

variable "jenkins_plugins_list" {
  description = "The list of jenkins' plugins to be installed"
  type = "list"
  default = ["kubernetes:1.21.2", "workflow-job:2.36", "workflow-aggregator:2.6", "credentials-binding:1.20", "git:4.0.0"]
}

Конкретная задача ansible, которая будет использовать переменную jenkins_plugins_list, выглядит следующим образом:


    - name: Install Jenkins
      register: jenkins_init
      shell: "helm upgrade --force --tls --install --set master.installPlugins={{ jenkins_plugins_list }}  --set master.tag={{ jenkins_master_image_tag }} --set agent.tag={{ jenkins_agent_image_tag }} -f {{ tempdir }}/{{ env_name }}-jenkins/jenkins-values.yaml jenkins-{{ env_name }} --namespace jenkins stable/jenkins"
      retries: 5
      delay: 30
      until: jenkins_init.rc == 0

I я пытаюсь явно установить переменную master.installPlugins через переменную tf, переданную во время вызова ansible.

Проблема заключается в следующем:

The helm Команда принимает список, т.е. значение, соответствующее переменной jenkins_plugins_list, следующим образом:

helm upgrade --force --tls --install --set master.installPlugins="{kubernetes:1.21.2,git:4.0.0}"

, т.е. th кавычки и фигурные скобки.

Однако мне удалось только получить следующий вывод:

helm upgrade --force --tls --install --set master.installPlugins=[u'kubernetes:1.21.2', u'workflow-job:2.36', u'workflow-aggregator:2.6', u'credentials-binding:1.20', u'git:4.0.0'] -f /org_files/tmp/myenv-jenkins/jenkins-values.yaml jenkins-myenv --namespace jenkins stable/jenkins"

1 Ответ

1 голос
/ 21 января 2020

Вы получаете список в виде ... списка, и это хорошо;)

Вам нужно преобразовать его в "какой бы формат ни был", который вам нужен, то есть список элементов, разделенных в коме и в окружении фигурных скобок.

См. пример ниже. Синтаксис немного сложнее, чтобы обойти тройные фигурные скобки в выражении, которые вызывают ошибку интерпретации:

---
- hosts: localhost
  gather_facts: false

  vars:
    jenkins_plugins_list: ['kubernetes:1.21.2', 'workflow-job:2.36', 'workflow-aggregator:2.6', 'credentials-binding:1.20', 'git:4.0.0']

  tasks:
    - debug:
        msg: "{{ '{' + jenkins_plugins_list | join(',') + '}' }}"

Что дает

PLAY [localhost] ********************************************************************************************************************************************************************************************************************************************************

TASK [debug] ************************************************************************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": "{kubernetes:1.21.2,workflow-job:2.36,workflow-aggregator:2.6,credentials-binding:1.20,git:4.0.0}"
}

PLAY RECAP **************************************************************************************************************************************************************************************************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
...