В процессе работы появилась идея автоматизировать доставку powershell скриптов, а также синхронизировать работу в команде среди системных администраторов со скриптами выполняемыми на разных серверах. Статья рассчитана на простых win администраторов незнакомых глубоко с git, gitlab, ci/cd и прочими devops заморочками, поэтому если интересно прошу под кат.

Начнем с проблем которые возникали при работе


  • отсутствие версионности;
  • несогласованность между коллегами при доработке скриптов;
  • потеря полезных скриптов при уходе коллег;
  • ручная доставка скриптов в места их выполнения;
  • банальный бардак.

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

Для упрощения жизни я использовал замечательный продукт Gitlab, уже развернутый у нас и используемый кодерами. Я не буду рассматривать процесс установки gitlab и gitlab-runner, просто уточню что у нас уже есть настроенный gitlab с доменной авторизацией и отдельный runner на windows с powershell executor, который и будет выполнять наши задачи развертывания. Для написания скриптов я использую отличный Visual Studio Code.

Организуем работу в gitlab


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

Создание группы


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

Создание проекта


После создания проекта, на первой же страничке будут все подсказки на тему «что делать дальше». В нашем случае нужно запушить существующие файлы со своей рабочей станции в gitlab. Для примера все это лежит в каталоге «E:\scripts\powershellmegaproject». Воспользуемся соответствующей подсказкой и выполним на своем компьютере:

cd E:\scripts\powershellmegaproject
git init
git remote add origin http://gitlab.domain.net/sysadminsdev/powershellmegaproject.git
git add .
git commit -m "Initial commit"
git push -u origin master

Бинго! Все наши файлики из каталога «E:\scripts\powershellmegaproject» теперь в нашем проекте.

Что дальше? Откроем VSCode и попробуем внести изменения в наш powershell скрипт, находящийся в этом каталоге. Сохранив файл, мы увидим в разделе «Source Control» уведомление, где можно посмотреть изменения и сделать коммит. Далее делаем пуш на сервер:

vscode git


Проверим на сайте проекта в gitlab, там будет актуальное содержимое файлов, а в истории коммитов можно отследить изменения.

Настройка CI/CD


Пора настроить доставку скриптов на сервер. Для работы CI/CD для вашего проекта должен быть доступен runner. Назначить его можно в админке gitlab — runners, либо использовать shared runner`ы.

А теперь к проекту. Что бы CI/CD заработало необходимо создать в каталоге с нашим проектом файл .gitlab-ci.yml с описанием действий (подсказку и help об этом можно так же увидеть при переходе в меню gitlab — CI/CD — Pipelines). Для доставки файлов можно выбрать различные способы, от просто копирования файлов, до rsync или git pull на нужный сервер. Так как мы рассматриваем самый простой сценарий, то будет просто копирование powershell`ом. Для этого необходимо сделать папку на целевом сервере со скриптом общедоступной в сети и предоставить доступ на изменение пользователю под которым запущена наша служба gitlab-runner.

Заполним .gitlab-ci.yml простым содержимым:

deploy_stage:
  variables:
    DEST_DIR: \\srv-megaserver\scripts\powershellmegaproject
  script:
    - remove-item -path $DEST_DIR\* -recurse
    - gci -Recurse | Copy-Item -Destination $DEST_DIR

Тут мы запишем в переменную путь до нашего каталога (в других проектах можно просто копировать этот файл и менять целевой каталог) и простой powershell командой сначала удалим все содержимое каталога, а потом скопируем все из нашего проекта в эту папку.

Коммитим, пушим изменения и проверяем. В нашей папке на сервере должны обновится все файлы. Посмотреть статус и выполнение Pipeline можно в том же разделе нашего gitlab — ci/cd — pipelines, пример успешного выполнения:


Running with gitlab-runner 11.3.1~beta.4.g0aa5179e (0aa5179e)
  on gl-runner2-windows a24eda81
Using Shell executor...
Running on SRV-GL-RUNNER2...
Fetching changes...
HEAD is now at e6e9a2c update ci file
From http://gitlab.domain.net/sysadminsdev/powershellmegaproject
   e6e9a2c..5f5cfce  master     -> origin/master
Checking out 5f5cfceb as master...
Skipping Git submodules setup
$ remove-item -path $DEST_DIR\* -recurse
$ gci -Recurse | Copy-Item -Destination $DEST_DIR
Job succeeded

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

Что с коллегами?


Все просто, создаем папку для проектов, переходим в неё в ps/cmd и клонируем проект к себе.


cd e:\projects
git clone http://gitlab.domain.net/sysadminsdev/powershellmegaproject.git

Всё, дальше просто работаем в VSCode открыв папку, делая коммиты и пуши.

Чего мы добились в итоге


  • все скрипты у нас хранятся в репозитарии;
  • вся группа администрирования может работать со скриптами;
  • все изменения видны в истории;
  • любой новоиспеченный администратор сразу видит все наработки и ему не нужно бегать по серверам и узнавать «где-что выполняется»;
  • все продуктивные изменения автоматически доставляются на «продуктивное место работы».

Мы устранили все наши проблемы, а также значительно упростили нашу жизнь в команде.

Бонусом


Добавьте файл README.md в каталог с проектом для описания что в этих скриптах вообще происходит.
Добавьте файл Changelog для описания изменений.

ps: что можно еще? Можно крутить runner в docker, можно конфигурить scheduler в ansible, можно еще много чего и по сложней, но целью статьи было упростить понимание данного инструментария для новичков.

Комментарии (11)


  1. rbobot
    24.10.2018 08:44

    Спасибо, гитлаб есть, CI есть для сборки пары своих модулей для PS, скриптов куча, а вот засунуть их в CI руки не дошли.
    Подписывание скриптов не хотели в пайплайн добавить?


    1. brainfair Автор
      24.10.2018 08:53

      Можно и подписывать, никакой сложности в том, что бы добавить еще строчку «Set-AuthenticodeSignature...» не вижу. В рабочих пайплайнах намного больше делается. Просто статья для старта и примера, поэтому не перегружал информацией не относящейся к теме.


  1. fishca
    24.10.2018 08:45

    Коротко. По существу. Полезно. Спасибо.


  1. Evgenym
    24.10.2018 09:39

    Полезная статья. Спасибо! Как раз недавно развернул GitLab у себя и хочу реализовать подобный функционал, чтобы при изменении скриптов в репозитории они подтягивались на сервер. Подскажите, пожалуйста, правильно ли я понял, что у вас runner — это средство доставки? Может, посоветуете какие-нибудь ресурсы, кроме документации, где можно почитать об этом дополнительно? С GitLab я пока работал мало, поэтому собираю информацию о том, что с ним можно делать в наших условиях.


    1. brainfair Автор
      24.10.2018 09:50
      +1

      Да все верно, runner это в простейшем случае просто исполнитель того, что напишешь в .gitlab-ci.yml
      По поводу ресурсов на почитать, кроме офф документации, каких-то особенных рекомендаций не подскажу, но тут же на хабре по слову gitlab есть несколько интересных русскоязычных статей, которые в своё время мне помогли вникнуть. Например эта или эта.


      1. Evgenym
        24.10.2018 13:18

        Спасибо!


  1. shane54
    24.10.2018 23:21
    +1

    Наверно надо так же продумать и способ обезопасить себя от ситуации, когда поправили какой-нибудь важный скрипт (например, бекапа, если бекап вдруг на скриптах: или ещё «лучше», например — logon-скрипт для всех компов и серверов в домене) — и через несколько секунд бекап не работает на всем парке серверов, вход в систему на всех машинах тоже невозможен. Я не про откат в один клик до предыдущей, рабочей версии скрипта, которая так же быстро разлетится по всем серверам и все исправит — а о способе как не довести до такой ситуации! Может Code Review для критических скриптов внедрить, чтоб минимум 4 глаза просматривали коммит, может автотесты, если придумать как и где и на чем тестировать скрипт бекапа, и тем более logon скрипт. Кстати, вымышленный пример с logon-скриптом, возможно, так просто будет и не откатить — ведь запуск runner'а тоже подразумевает под собой вход в систему, как минимум в некоторых случая (наверно).

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


    1. brainfair Автор
      25.10.2018 04:05

      Да вы мыслите верно, скрипты в GPO, какие-то конфигурационные файли, настройки системы и так далее все проходит через gitlab и CI/CD. И вот постепенно вы уже и не заметите как прийдете к «infrastructure as code» =)


    1. Evgenym
      25.10.2018 09:26

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


      1. brainfair Автор
        25.10.2018 10:21

        Там где это возможно и нужно, да так и нужно делать, но боюсь что тут уже нужно было бы разжовывать полностью работу с git, работу с dev-test-staged-prod средами и прочим. Я посчитал, что это выходит за рамки «простого системного администратора» и не стал перегружать публикацию.


  1. Adjuster2004
    25.10.2018 11:50

    Добавил в закладки. Благодарю. Эту тему нужно развивать.