Рубрики
Uncategorized

Автоматизированный анализ удара марионеток

Использование трубопроводов GitLab и каталога Diff для предварительного просмотра изменений между двумя ветвями в запросе слияния. Теги с марионеткой, DevOps, Codequality, Showdev.

Качество кукольного кода (3 части серии)

В На прошлой неделе пост Я представил, как настроить Кукольный каталог развлекается Развлекаться между двумя кукольными средами.

Разве это не было бы здорово, если этот инструмент может быть использован для выполнения автоматического анализа удара перед объединением ветви Git (AKA Chare English или запрос на тягу)? Ну, это может.

Наша текущая настройка основана на Redhat openshift и Gitlab Отказ Это, однако, легко переносимо к другому варианту установки.

Кукольная инфраструктура

Марионеточная инфраструктура в настоящее время работает в openshift, используя нашу серию Кукольные элементы Hearm Charts Для Puppeterver, PuppetDB, Щенцевой доски и кукольного каталога Diff Viewer.

Мы находимся в процессе миграции от Beachet 5 в Beachet 6, поэтому в настоящее время у нас есть два развернутых диаграммы Puppeterver, один для каждой версии. Puppeterver Сервис указывает на двух марионеток 5 стручек, а Puppeterver6 Сервис указывает на двух марионеток 6 стручков.

У нас есть Passthrough Repenshift Parts, сидя перед службами, чтобы открыть их до остальной части инфратуры (по порту 443 вместо 8140).

Линта и развертывание

Развертывание кукольного кода выполняется с использованием диаграммы бегуна GitLab, развертывание которой устанавливает громкость CucetCode (ПВХ от развертывания Puppeterver). Затем мы запускаем R10k в трубопроводе GitLab каждый раз, когда ветка нажата.

Мы также пересекаем код перед развертыванием его, используя Ожовери Кодового плагина качества Отказ

Вот что это выглядит в .gitlab-ci.yml :

--------
stages:
  - lint
  - deploy

.create_r10k_yaml: &create_r10k_yaml |
  cat << EOF > /tmp/r10k.yaml
  ---
  :cachedir: /etc/puppetlabs/code/cache

  :sources:
    :main:
      remote: $CI_PROJECT_DIR
      basedir: /etc/puppetlabs/code/environments
  EOF

linting-puppet-hiera:
  image: camptocamp/onceover-codequality:latest
  stage: lint
  script:
    - 'onceover run codequality  --no_docs'
  tags:
    - puppetmaster
  rules:
    # Skip linting if the commit message contains "[skip lint]"
    - if: '$CI_COMMIT_MESSAGE !~ /\[skip lint\]/'

r10k-deploy:
  image: puppet/r10k:3.1.0
  stage: deploy
  tags:
    # Select GitLab runner from the Puppet OpenShift env (which mounts Puppetcode)
    - puppetmaster
  before_script:
    - while [ -f /etc/puppetlabs/code/r10k.lock ]; do echo -n "Waiting for lock from "; cat /etc/puppetlabs/code/r10k.lock || echo; sleep 2; done
    - hostname -f > /etc/puppetlabs/code/r10k.lock
  script:
    - umask 0002
    # Git https secrets are mounted in the GitLab runner
    - ln -s /secrets/.netrc ~/
    - *create_r10k_yaml
    - git fetch --unshallow
    - 'git branch -r | grep -v "\->" | while read remote; do git branch --track "${remote#origin/}" "$remote"; done'
    - r10k deploy --color -c /tmp/r10k.yaml environment ${CI_COMMIT_REF_NAME} -p --verbose=debug
    - puppet generate types --environment ${CI_COMMIT_REF_NAME}
  after_script:
    - rm -f /etc/puppetlabs/code/r10k.lock

Каталог отличается

Когда запрос слияния открыт, мы хотим проанализировать влияние, которое он будет иметь, прежде чем мы сможем объединить его. Это где каталог diff играет большую роль.

Если у вас не имеет огромную кукольную инфраструктуру, Diff каталог довольно тяжелый для запуска, поскольку он запросит много каталогов в небольшом количестве времени.

Новый --old_catalog_from_puppetdb Опция, представленная в версии 1.7.0, снижает нагрузку вдвое, получая «из» каталогов от PuppetDB, но он все еще является широкой партией запросов к серверам марионеток.

По этой причине мы проводим каталог diff только по требованию, как ручная задача. Lint и развертывание запускаются во второй раз, чтобы сделать их обязательными шагами, прежде чем слияние можно проверить.

Вот установка:

.create_puppetdb_conf: &create_puppetdb_conf |
  cat << EOF > /etc/puppetlabs/puppet/puppetdb.conf
  [main]
  server_urls = https://puppetdb:8081
  EOF

.create_csr_attributes_yaml: &create_csr_attributes_yaml |
  cat << EOF > /etc/puppetlabs/puppet/csr_attributes.yaml
  ---
  custom_attributes:
    # Our autosign script uses hashed secrets based on a psk,
    # the certname and the environment coded in the certificate
    1.2.840.113549.1.9.7: '$(echo -n "$psk/$(puppet config print certname)/production" | openssl dgst -binary -sha256 | openssl base64)'
  extension_requests:
    # We use the pp_authorization=catalog extension to set up auth.conf for v4/catalog
    1.3.6.1.4.1.34380.1.3.1: 'catalog'
    1.3.6.1.4.1.34380.1.1.12: 'production'
  EOF

.cleanup_cert: &cleanup_cert |
  curl -s -X  DELETE \
  "Accept:application/json" -H "Content-Type: text/pson" \
  --cacert "/etc/puppetlabs/puppet/ssl/certs/ca.pem" \
  --cert "/etc/puppetlabs/puppet/ssl/certs/$(puppet config print certname).pem" \
  --key "/etc/puppetlabs/puppet/ssl/private_keys/$(puppet config print certname).pem" \
  "https://puppetserver:8140/puppet-ca/v1/certificate_status/$(puppet config print certname)?environment=production"


catalog-diff:
  image: puppet/puppet-agent:6.15.0
  stage: diff
  tags:
    # Select GitLab runner in Puppet OpenShift env to get direct access to services
    - puppetmaster
  script:
    - apt update
    - apt install -y locales puppetdb-termini
    - locale-gen en_US.UTF-8
    - *create_puppetdb_conf
    - *create_csr_attributes_yaml
    # Generate a certificate and get it signed
    - puppet ssl submit_request --ca_server puppetserver --certificate_revocation=false
    # We currently diff with puppetserver6 for the migration
    - puppet catalog --environment ${CI_MERGE_REQUEST_SOURCE_BRANCH_NAME} --certificate_revocation=false diff puppetserver:8140/${CI_MERGE_REQUEST_TARGET_BRANCH_NAME} puppetserver6:8140/${CI_MERGE_REQUEST_SOURCE_BRANCH_NAME} --show_resource_diff --changed_depth 1000 --content_diff --old_catalog_from_puppetdb --certless --threads 4 --output_report /catalog-diff/mr_${CI_MERGE_REQUEST_IID}_${CI_JOB_ID}.json
  after_script:
    # We have configured our auth.conf to allow nodes to clean their own cert, see https://dev.to/camptocamp-ops/automatic-renewal-of-puppet-certificates-28pm
    - *cleanup_cert
    - echo "You can view the report details at https://puppetdiff.example.com/?report=mr_${CI_MERGE_REQUEST_IID}_${CI_JOB_ID}"
    # Post a comment on the Merge Request
    - 'curl -k -X POST -H "Private-Token: $CI_BOT_TOKEN" -d "body=You can view the Catalog Diff report details at https://puppetdiff.example.com/?report=mr_${CI_MERGE_REQUEST_IID}_${CI_JOB_ID}" $CI_API_V4_URL/projects/$CI_PROJECT_ID/merge_requests/$CI_MERGE_REQUEST_IID/notes'
  # Allow failure so the Merge Request can be validated even without catalog diff
  allow_failure: true
  rules:
    - if: '$CI_MERGE_REQUEST_ID'
      when: manual
  variables:
    LANG: en_US.UTF-8
    LC_ALL: en_US.UTF-8

Несколько замечаний по этой установке:

  1. PuppetDB обращается через SSL. Поскольку у нас есть допустимые сертификаты для доступа к серверу кукол, мы также можем, но 8080 в порядке, если у вас есть такая возможность.

  2. Мы используем Autosign Script Подписать сертификаты, используя PSK (который мы хэш). Если вам легче, вы также можете ввести действительный ключ и сертификат в сборку вместо PSK.

  3. Если вы не генерируете сертификат, вам также не нужен шаг очистки.

  4. Отчеты сохраняются в /каталог-различие Справочник, который устанавливается на бегун от кукольного каталога Diff Viewer PVC. Таким образом, отчеты доступны непосредственно в зрителе, передавая их имя в строке запроса.

  5. Запрос скручивания запроса слияния требует прохождения Ci_bot_token переменная к сборке. В настоящее время мы устанавливаем один в переменные сборки, используя учетную запись GitLab Robot. Если у вас есть серебряный план GitLab, вы можете использовать Ci_job_token переменной вместо этого.

На что это похоже?

Вот несколько скриншотов типичного рабочего процесса.

Проверка запроса слияния, с комментарием, оставленным ботом после того, как сборка DIFF каталога была запущена (см. 3 этапа в строке 3)

Просмотр отчета, сгенерированного кукольным каталогом, Diff запустить

Демонстрация

Вот демонстрация видео установки, описанной выше:

В итоге

Эта настройка позволяет нам:

  • Проверьте качество кода (Lint) перед развертыванием сред
  • Проверьте, какие изменения будут доставлены в кукольные каталоги, прежде чем принимать запрос слияния

Как указано в предыдущем сообщении в блоге, это не учитывается для каждого изменения, поскольку изменения в плагинах (фактах, типах и провайдерах, авгусских линзах и т. Д.) Также могут быть обнаружены серверы, но не будут видели в каталоге Diffs.

Качество кукольного кода (3 части серии)

Оригинал: «https://dev.to/camptocamp-ops/automated-puppet-impact-analysis-1c1»