Как получить секреты из хранилища в мою конфигурацию jenkins в виде установки кода с помощью helm?

Я пытаюсь развернуть Jenkins, используя руль с JCASC, чтобы получить секреты хранилища. Я использую локальный minikube для создания mi k8 кластера и локальный vault экземпляр на моей машине (не в k8 кластере).

Даже если я пытаюсь использовать initContainerEnv и ContainerEnv, я не могу достичь значений хранилища. Для значения CASC_VAULT_TOKEN я использую корневой токен vault. Это helm команда, которую я запускаю локально:

helm upgrade --install -f values.yml mijenkins jenkins/jenkins

А вот мой код файла values.yml:

controller:
  installPlugins:
    # need to add this configuration-as-code due to a known jenkins issue: https://github.com/jenkinsci/helm-charts/issues/595
  - "configuration-as-code:1414.v878271fc496f"
  - "hashicorp-vault-plugin:latest"

  # passing initial environments values to docker basic container
  initContainerEnv:
  - name: CASC_VAULT_TOKEN
    value: "my-vault-root-token"
  - name: CASC_VAULT_URL
    value: "http://localhost:8200"
  - name: CASC_VAULT_PATHS
    value: "cubbyhole/jenkins"
  - name: CASC_VAULT_ENGINE_VERSION
    value: "2"
  ContainerEnv:
  - name: CASC_VAULT_TOKEN
    value: "my-vault-root-token"
  - name: CASC_VAULT_URL
    value: "http://localhost:8200"
  - name: CASC_VAULT_PATHS
    value: "cubbyhole/jenkins"
  - name: CASC_VAULT_ENGINE_VERSION
    value: "2"

  JCasC:
    configScripts:
      here-is-the-user-security: |
        jenkins:
          securityRealm:
            local:
              allowsSignup: false
              enableCaptcha: false
              users:
                - id: "${JENKINS_ADMIN_ID}"
                  password: "${JENKINS_ADMIN_PASSWORD}"

И в моем локальном vault я могу видеть/достигать значения:

>vault kv get cubbyhole/jenkins
============= Data =============
Key                       Value
---                       -----
JENKINS_ADMIN_ID          alan
JENKINS_ADMIN_PASSWORD    acosta

У кого-нибудь из вас есть идеи, что я могу делать неправильно?

"DevOps: Jenkins & AWS Series, часть 5: Установка Gradle на Ubuntu 22.04
"DevOps: Jenkins & AWS Series, часть 5: Установка Gradle на Ubuntu 22.04
В этой статье блога мы проведем вас через процесс установки Gradle на Ubuntu 22.04, интеграции его с Jenkins и создания задания Gradle. Мы...
0
0
40
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я не использовал Vault с jenkins, поэтому я не совсем уверен в вашей конкретной ситуации, но я очень хорошо знаком с тем, насколько привередлива диаграмма руля Jenkins, и я смог настроить свой securityRealm (с плагином Google Login), создав k8s secret со значениями, необходимыми в первую очередь:

kubectl create secret generic googleoauth --namespace jenkins \
  --from-literal=clientid=${GOOGLE_OAUTH_CLIENT_ID} \
  --from-literal=clientsecret=${GOOGLE_OAUTH_SECRET}

затем передавая эти значения в helm chart values.yml через:

controller:
  additionalExistingSecrets:
  - name: googleoauth
    keyName: clientid
  - name: googleoauth
    keyName: clientsecret

затем читаем их в JCasC так:

...
  JCasC:
    configScripts:
      authentication: |
        jenkins:
          securityRealm:
            googleOAuth2:
              clientId: ${googleoauth-clientid}
              clientSecret: ${googleoauth-clientsecret}

Чтобы это работало, файл values.yml также должен включать следующие настройки:

serviceAccount:
  name: jenkins

rbac:
  readSecrets: true # allows jenkins serviceAccount to read k8s secrets

Обратите внимание, что я запускаю jenkins как учетную запись службы k8s с именем jenkins в пространстве имен jenkins

На самом деле, чего я пытался добиться, так это прикоснуться к локальному серверу хранилища с моим кластером minikube, но с этой информацией, которой вы поделились, я понял, что проблема была не в моем коде, а на самом деле была связь между моим хранилищем и моим локальным кластером kubernetes. Я нашел решение, раскрывающее службу хранилища! Я поделюсь им в комментариях. СПАСИБО!

alanmas 08.04.2022 03:50
Ответ принят как подходящий

После отладки моей установки jenkins я понял, что основная проблема не в моей values.yml и не в моей интеграции JCASC, поскольку я смог увидеть значения ContainerEnv, если я войду в свой модуль jenkins с помощью:

kubectl exec -ti mijenkins-0 -- sh

Поэтому мне нужно было открыть свой сервер хранилища, чтобы мои jenkins могли к нему добраться, я использовал этот Учебник по хранилищу для этого. Вкратце, вместо обычного: сервер хранилища -dev

Нам нужно использовать:

vault server -dev -dev-root-token-id root -dev-listen-address 0.0.0.0:8200

Затем нам нужно экспортировать переменную среды для интерфейса командной строки хранилища для обращения к серверу хранилища.

export VAULT_ADDR=http://0.0.0.0:8200

После этого нам нужно определить адрес хранилища, на который мы собираемся перенаправить наш пинг jenkins, для этого нам нужно запустить сеанс minukube ssh:

minikube ssh

В рамках этого сеанса SSH получите значение хоста Minikube.

$ dig +short host.docker.internal
192.168.65.2

После получения значения мы собираемся получить статус сервера Vault, чтобы проверить подключение к сети.

$ dig +short host.docker.internal | xargs -I{} curl -s http://{}:8200/v1/sys/seal-status

И теперь мы можем подключить наш модуль jenkins к нашему хранилищу, нам просто нужно изменить CASC_VAULT_URL, чтобы использовать http://192.168.65.2:8200 в нашем основном .yml файле следующим образом:

  - name: CASC_VAULT_URL
    value: "http://192.168.65.2:8200"

Другие вопросы по теме