Helm — Создание Secret’а с переменной

 

Для того, чтобы сохранить значение переменной как Secret, переменную необходимо закодировать в base64, для этого воспользуемся "_helpers.tpl"

К примеру, нам нужно сохранить значение переменной "applicationSecret"

values.yaml:

# Default values for artem-services.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.

replicaCount: 1
namespace: default

image:
  repository: XXXXXXXXXXXX.dkr.ecr.eu-east-1.amazonaws.com/artem-services
  tag: 1.0.1
  pullPolicy: IfNotPresent

nameOverride: ""
fullnameOverride: "artem-services"

applicationSecret: |
  var1=value1
  var2=value2
  var3=value3
  var4=value4

 

Добавляем в "_helpers.tpl" следующее:

_helpers.tpl:

{{- define "applicationSecret" }}
{{- printf .Values.applicationSecret | b64enc }}
{{- end }}

 

Теперь в директории "templates" создадим файл "secret.yaml"

secret.yaml:

apiVersion: v1
kind: Secret
type: Opaque
metadata:
  name: "{{ .Chart.Name }}-application"
data:
  application.conf: {{ template "applicationSecret" . }}

Ansible — Запуск Playbook’а с определенной версией Python

К примеру есть инстанс, на котором установлен Python 2-ой и 3-ей версий, но по умолчанию используется 2-ая, и чтобы не менять версию по умолчанию и запустить Playbook используя Python3, можно воспользоваться следующей командой:

python3 $(which ansible-playbook) -i localhost my-playbook.yaml

 

Так же можно указать интерпретатор в инвентори файле:

[localhost]
localhost ansible_connection=local ansible_python_interpreter=python3

 

Убедитесь, что для нужной версии Python установлен Ansible модуль

sudo pip3 install --user ansible

Ansible — Template: to_nice_json

Для того, чтобы создать из шаблона файл и сразу его сохранить как "Pretty JSON" можно воспользоваться модулем "copy" с ключем "content".

К примеру сохраним шаблон "config.j2" как файл "/app/config.json"

Playbook:

- name: Template a file to configuration files
  copy:
    content: "{{ lookup('template', 'templates/config.j2') | to_nice_json }}"
    dest: "/app/config.json"
    owner: artem
    group: artem
    mode: '0644'

Jenkins — Active Choice: CheckBox — Значения по умолчанию

 

При работе с параметром Active Choice CheckBox, можно выбрать значения по умолчанию добавив параметр ":selected"

Pipeline:

properties([
  parameters([
    [$class: 'CascadeChoiceParameter', 
      choiceType: 'PT_CHECKBOX', 
      description: 'Select environment',
      filterLength: 1,
      filterable: false,
      name: 'Environment', 
      script: [
        $class: 'GroovyScript', 
        script: [
          classpath: [], 
          sandbox: false, 
          script: 
            'return[\'Development:selected\',\'Production:selected\']'
        ]
      ]
    ]
  ])
])

 

При сборке с параметрами сразу два окружения, "Development" и "Production" будут выбраны по умолчанию

Jenkins — Active Choice: CheckBox — Работа с массивом

При работе с параметром Active Choice CheckBox, значения параметра записываются в переменную, через запятую. Для работы с ними как отдельными элементами, нужно их сохранить в массив. К примеру есть следующий  Active Choice, который выдает список окружений в виде CheckBox

Pipeline:

properties([
  parameters([
    [$class: 'CascadeChoiceParameter', 
      choiceType: 'PT_CHECKBOX', 
      description: 'Select Environment',
      filterLength: 1,
      filterable: false,
      name: 'Environment', 
      script: [
        $class: 'GroovyScript', 
        script: [
          classpath: [], 
          sandbox: false, 
          script: 
            'return[\'Development\',\'QA\',\'Staging\',\'Production\']'
        ]
      ]
    ]
  ])
])

 

Выглядит это следующим образом:

 

Выберем два окружения, "Development" и "QA"

 

Значение переменной "Environment" будет следующее: "Development,QA". Сохраним эти значения в массив, для дальнейшей работы с ним.

String[] Env_Array = "${params.Environment}".split(',');

 

Полностью Pipeline будет иметь следующий вид

Pipeline:

properties([
  parameters([
    [$class: 'CascadeChoiceParameter', 
      choiceType: 'PT_CHECKBOX', 
      description: 'Select Environment',
      filterLength: 1,
      filterable: false,
      name: 'Environment', 
      script: [
        $class: 'GroovyScript', 
        script: [
          classpath: [], 
          sandbox: false, 
          script: 
            'return[\'Development\',\'QA\',\'Staging\',\'Production\']'
        ]
      ]
    ]
  ])
])

pipeline {
  agent any
  stages {
    stage('Check env') {
      steps {
        script {
          if ( env.Environment.isEmpty() ) {
            echo "Environment not specified."
            autoCancelled = true
            error('Aborting the build.')
          }
          else {
            echo "Environment total: ${env.Environment}"
            String[] Env_Array = "${params.Environment}".split(',');
            for (x in Env_Array) {
              echo "ENV: ${x}"
            }
          }
        }
      }
    }
  }
}

 

Результат выполнения Jenkins задачи:

Jenkins — Active Choice: Pipeline примеры

 

Несколько примеров, как Active Choices параметры можно описывать в Pipeline

Пример 1

Одиночный выбор, из предоставленного списка. Выпадающий список окружений, по умолчанию выбран первый в списке элемент.

Pipeline:

properties([
  parameters([
    [$class: 'CascadeChoiceParameter', 
      choiceType: 'PT_SINGLE_SELECT', 
      description: 'Select environment',
      filterLength: 1,
      filterable: false,
      name: 'Environment', 
      script: [
        $class: 'GroovyScript', 
        script: [
          classpath: [], 
          sandbox: false, 
          script: 
            'return[\'Development\',\'Production\']'
        ]
      ]
    ]
  ])
])

 

Читать далее "Jenkins — Active Choice: Pipeline примеры"

Jenkins — Имя пользователя, запустившего задачу

Для того, чтобы узнать имя пользователя Jenkins'а, понадобится плагин user build vars

Переходим в настройки Jenkins

 

Раздел "Управление плагинами"

 

Переходим к вкладке "Доступные" и в поиске указываем "user build vars"

Устанавливаем его.

 

Пример использования плагина из Pipeline:

pipeline {
  agent any
  stages {
    stage('Output') {
      steps {
        script {
          wrap([$class: 'BuildUser']) {
            echo "Build was started by user: ${BUILD_USER}"
          }
        }
      }
    }
  }
}

 

Так же в модуле есть следующие переменные:

  • BUILD_USER — Full name (first name + last name)
  • BUILD_USER_FIRST_NAME — First name
  • BUILD_USER_LAST_NAME — Last name
  • BUILD_USER_ID — Jenkins user ID
  • BUILD_USER_EMAIL — Email address

Jenkins — Active Choice: Git branch

 

Для параметризованной сборки с выбором ветки, понадобится плагин Active Choices

Переходим в настройки Jenkins

 

Раздел "Управление плагинами"

 

Переходим к вкладке "Доступные" и в поиске указываем "Active Choices"

Устанавливаем его.

Создаем "New Item" — "Pipeline", указываем, что это будет параметризованной сборка, и добавляем параметр "Active Choices Reactive Parameter"

 

Указываем, что это "Groovy Script" и вставляем туда следующее:

def gettags = ("git ls-remote -t -h ssh://git-codecommit.eu-west-1.amazonaws.com/v1/repos/artem-services.git").execute()
return gettags.text.readLines().collect { 
  it.split()[1].replaceAll('refs/heads/', '').replaceAll('refs/tags/', '').replaceAll("\\^\\{\\}", '')
}

 

Где "ssh://git-codecommit.eu-west-1.amazonaws.com/v1/repos/artem-services.git" путь к вашему репозиторию. Jenkins должен иметь доступ к данному репозиторию по протоколу SSH

 

 

Теперь при сборке с параметрами будет выбор ветки

Jenkins — Изменить язык по умолчанию

 

По умолчанию Jenkins использует язык настроек вашего браузера. Для того, чтобы принудительно его поменять можно воспользоваться плагином Locale

Переходим в настройки Jenkins

 

Раздел "Управление плагинами"

 

Переходим к вкладке "Доступные" и в поиске указываем "Locale"

 

Устанавливаем его. И возвращаемся в настройки Jenkins'а, вкладка "Конфигурация системы"

 

Находим блок "Locale" и указываем необходимый язык. Так же ставим галочку, чтобы игнорировать настройки браузера.

 

Готово. Сохраняем изменения.

FIX ERROR — Ansible AWS SSM: AnsibleError: An unhandled exception occurred while templating

При попытке получить значение с AWS SSM Ansible Playbook используя в качестве интерпретатора Python3 выдает следующую ошибку:

fatal: [localhost-py3]: FAILED! => {"changed": false, "msg": "AnsibleError: An unhandled exception occurred while templating '{{ lookup('aws_ssm', 'server_listeners', decrypt=false, region=’eu-west-1′) }}'. Error was a <class 'ansible.errors.AnsibleError'>, original message: An unhandled exception occurred while running the lookup plugin 'aws_ssm'. Error was a <class 'ansible.errors.AnsibleError'>, original message: botocore and boto3 are required for aws_ssm lookup."}

В документации Ansible сказано, что нужны зависимости для PIP:

  • boto3
  • botocore

Но ошибка по прежнему присутствовала, пока не был добавлен в зависимости PIP'а модуль "ansible"

Решение:

---
- name: Ensure boto3, botocore and ansible modules are installed
  pip:
    name: 
      - boto3
      - botocore
      - ansible
    executable: /usr/bin/pip3