В Сольте, как я могу условно и итеративно ( jinja) применить включенное состояние

На первый взгляд это может показаться довольно простым. Но я могу вам сказать, что пару дней ломал голову над этим. Я прочитал много документов, сидел на IRC с людьми и разговаривал с коллегами, и на данный момент у меня нет ответа, который, на мой взгляд, оправдывает себя.

Я рассмотрел несколько возможных подходов

  • реактор
  • оркестровщик

Мне не нравятся эти два из-за необходимости выполнения сверху вниз... они, кажется, приспособлены для организации нескольких состояний узлов, а не рабочих процессов в одном узле.

  • пользовательские состояния

Это то, чего я ДЕЙСТВИТЕЛЬНО хотел бы избежать, поскольку это повторяющийся рабочий процесс, и я не хочу создавать подобные настройки. Там слишком много места для неразборчивости, если я пойду по этому пути со своими товарищами по команде.

  • требует / часы

У них нет концепции (которую я знаю) о повторном применении состояния или в логическом порядке / рабочем процессе.

И несколько других я не буду упоминать.

Без дальнейшего обсуждения, вот моя дилемма.

Цели:

  • Дженкинс Мастер получает развертывание
  • Мы можем приступить к тестированию развертывания по мере его продолжения.
  • Мы только перезапускаем Tomcat, когда это необходимо
  • Мы можем обновить плагины для каждого пакета
  • Большой упор на хорошие чистые интуитивно понятные солевые конфиги

Развертывание Jenkins довольно простое. Мы бросаем в пакеты, и конфиги, и мы настроены.

Модульное тестирование сложнее. В качестве примера у меня есть этот файл состояния.

Действия / ve rsion.sls:

# Hit's the jenkins CLI interface to check for version info
# This can be used to verify that jenkins is active and the version we want

# Import some info
{%- from 'jenkins/init.sls' import jenkins_home with context %}

# Install plugins in jenkins_plugins list
jenkins_version:
  cmd.run:
    - name: java -jar jenkins-cli.jar -s "http://127.0.0.1:8080" version
    - cwd: /var/lib/tomcat/webapps/ROOT/WEB-INF/
    - user: jenkins

actions.ve rsion в основном проверяет, что jenkins запущен и работает с запросами. мы хотим быть уверены в этом во время сборки в нескольких точках.

пример... коту нужно время, чтобы раскрутиться. мы должны были добавить задержку к этой операции перезапуска. Если вы посмотрите на start.sls ниже, вы увидите, что эта операция происходит. Обратите внимание на ошибку, открытую при init_delay:.

Действия / start.sls:

# Starts the tomcat service
tomcat_start:
  service.running:
    - name: tomcat
    - enable: True
    - full_restart: True
# Not functional atm see --> https://github.com/saltstack/salt/issues/20631
#    - init_delay: 120

# initiate a 120 second delay after any service start to let tomcat come up.
tomcat_wait:
  module.run:
    - name: test.sleep
    - length: 60

include:
  - jenkins.actions.version

Теперь у нас есть возможность перезагрузки, выполнив Actions.stop и Actions.start. У нас есть это состояние actions.ve rsion, которое мы можем использовать для проверки того, что система готова продолжить работу с конкретными рабочими процессами состояния jenkins.

Я хочу сделать что-то вроде этого...

 Install Jenkins --> Grab yaml of plugins --> install plugins that need it

Довольно прямо вперед.

За исключением того, чтобы пройтись по цепочке плагинов, я использую Jinja.
И теперь у меня нет возможности позвонить и быть уверенным, что состояния start.sls и ve rsion.sls можно применять повторно.

Я ищу, хороший способ сделать это.

Это было бы что-то вроде jenkins.sls

{% set repo_username = "foo" -%}
{% set repo_password = "bar" -%}

include:
  - jenkins.actions.version
  - jenkins.actions.stop
  - jenkins.actions.start

# Install Jenkins
jenkins:
  pkg:
    - installed

# Import Jenkins Plugins as List, and Working Path
{%- from 'jenkins/init.sls' import jenkins_home with context %}
{%- import_yaml "jenkins/plugins.sls" as jenkins_plugins %}
{%- import_yaml "jenkins/custom-plugins.sls" as custom_plugins %}
# Grab updated package list
jenkins-contact-update-server:
  cmd.run:
    - name: curl -L http://updates.jenkins-ci.org/update-center.json | sed '1d;$d' > {{ jenkins_home }}/updates/default.json
    - unless: test -d {{ jenkins_home }}/updates/default.json
    - require:
      - pkg: jenkins
      - service: tomcat
# Install plugins in jenkins_plugins list
{% for plugin in jenkins_plugins %}
jenkins-plugin-{{ plugin }}:
  cmd.run:
    - name: java -jar jenkins-cli.jar -s "http://127.0.0.1:8080" install-plugin "{{ plugin }}"
    - unless: java -jar jenkins-cli.jar -s "http://127.0.0.1:8080" list-plugins | grep "{{ plugin }}"
    - cwd: /var/lib/tomcat/webapps/ROOT/WEB-INF/
    - user: jenkins
    - require:
      - pkg: jenkins
      - service: tomcat

Вот где я застрял. Требовать не буду этого делать. и списки действий, кажется, не планируются линейно в соли. Мне нужно иметь возможность просто проверить, что Дженкинс готов и готов. Мне нужно иметь возможность перезапустить Tomcat после добавления одного плагина в итерации. Мне нужно быть в состоянии сделать это, чтобы удовлетворить зависимости в порядке плагинов.

      - sls: jenkins.actions.version
      - sls: jenkins.actions.stop
      - sls: jenkins.actions.start
#    This can't work for several reasons
#    - watch_in:
#      - sls: jenkins-safe-restart
{% endfor %}

# Install custom plugins in the custom_plugins list
{% for cust_plugin,cust_plugin_url in custom_plugins.iteritems() %}
# manually downloading the plugin, because jenkins-cli.jar doesn't seem to work direct to artifactory URLs.
download-plugin-{{ cust_plugin }}:
  cmd.run:
    - name: curl -o {{ cust_plugin }}.jpi -O "https://{{ repo_username }}:{{ repo_password }}@{{ cust_plugin_url }}"
    - unless: java -jar jenkins-cli.jar -s "http://127.0.0.1:8080" list-plugins | grep "{{ cust_plugin }}"
    - cwd: /tmp
    - user: jenkins
    - require:
      - pkg: jenkins
      - service: tomcat
# installing the plugin ( REQUIRES TOMCAT RESTART AFTER )
custom-plugin-{{ cust_plugin }}:
  cmd.run:
    - name: java -jar jenkins-cli.jar -s "http://127.0.0.1:8080" install-plugin /tmp/{{ cust_plugin }}.jpi
    - unless: java -jar jenkins-cli.jar -s "http://127.0.0.1:8080" list-plugins | grep "{{ cust_plugin }}"
    - cwd: /var/lib/tomcat/webapps/ROOT/WEB-INF/
    - user: jenkins
    - require:
      - pkg: jenkins
      - service: tomcat
{% endfor %}

4 ответа

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

Дженкинс Мастер получает развертывание

Напишите исполняемый модуль jenkins на python с функцией install(...):, В этой функции вы управляете любыми зависимостями, либо вызывая существующие исполняющие модули, либо сами их записывая.

Мы можем приступить к тестированию развертывания по мере его продолжения.

Внутри функции установки модуля jenkins вы запускаете определенные события в зависимости от результатов установки.

if not _run_deployment_phase(...):
    __salt__['event.send']('jenkins/install/error', {
            'finished': False,
            'message': "Something failed during the deployment!",
    })

Вы бы отобразили это событие в файлы slat реактора и обработали его.

Мы только перезапускаем Tomcat, когда это необходимо

Напишите модуль Tomcat. Добавить _is_up(...) Функция, в которой вы можете проверить, работает ли tomcat, путем анализа логов tomcat на результат. Вызовите функцию внутри модуля состояния и добавьте функцию mod_watch.

def mod_watch():
    # required dict to return
    return_dict = {
           "name": "Tomcat install",
           "changes": {}, 
           "result": False,
           "comment": "",
            }
    if __salt__["tomcat._is_up"]():
      return_dict["result"] = True
      return_dict["comment"] = "Tomcat is up."

    if __opts__["test"]:
        return_dict["result"] = None
        return_dict["comment"] = "comment here about what will change"
        return return_dict

    # execute changes now

    return return_dict

Используйте свой модуль состояния внутри файла состояния.

install tomcat:
  tomcat.install:
    - name: ...
    - user: ...
    ...

wait until tomcat is up:
  cmd.run:
    - name: ...
    - watch:
      - tomcat: install tomcat

Мы можем обновить плагины для каждого пакета

Добавьте в свой исполняющий модуль jenkins функцию с именем install_plugin. Посмотрите код pkg.install для репликации интерфейса.

Большой упор на хорошие чистые, интуитивно понятные солевые конфиги

Напишите исполняющие модули Python для простой и понятной логики конфигурации. Используйте этот исполнительный модуль внутри ваших собственных модулей состояния. Внутренние файлы состояний вызывают ваши собственные модули состояния и предоставляют индивидуальную конфигурацию для любого средства визуализации состояний, которое вам нравится.

Это довольно старый вопрос, но если вы измените процедуру запуска / остановки Jenkins / tomcat на стандартную службу init/systemd/windows (как и все хорошо работающие службы), вы можете получить service.running для службы Jenkins и добавьте это к каждому из ваших пользовательских плагинов -{{ cust_plugin }} состояний.

require_in: 
  - svc: jenkins
watch_in: 
  - svc: jenkins

Вы можете продолжать использовать модуль cmd.run с onchanges. Вам нужно добавить onchanges_in: к каждому из пользовательских плагинов -{{ cust_plugin }} состояний, но вам нужно иметь хотя бы один элемент в списке изменений, или команда будет срабатывать при каждом запуске состояния.

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

Вместо того, чтобы все это включать / требовать, что вы делаете, вы должны просто поместить весь код в один файл sls и генерировать состояния посредством итерации jinja.

Если то, что вы пытаетесь сделать, это добавить несколько плагинов, добавить файлы конфигурации, а затем в конце перезапустить, тогда вам действительно нужно просто выполнить все по порядку, не использовать require и использовать listen или listen_in, а не смотреть или смотреть

listen/listen_in приводит к тому, что инициируемые действия происходят в конце запуска состояния. Они похожи на концепцию обработчиков в Ansible.

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

Watch / watch_in также переупорядочит ваши состояния. Если вместо этого вы используете listen / listen_in, он будет ставить в очередь триггерные действия для выполнения в том порядке, в котором они были запущены в конце выполнения состояния.

Увидеть:

http://ryandlane.com/blog/2014/07/14/truly-ordered-execution-using-saltstack/ http://ryandlane.com/blog/2015/01/06/truly-ordered-execution-using-saltstack-part-2/

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