Рубрики
devops Конспект

Конспект: CI / CD / LaC / DevOps / git / vagrant / ansible

Ссылки

https://digital.ai/periodic-table-of-devops-tools - периодическая таблица DevOps
https://git-scm.com/book/ru/v2 - документация по git на русском языке


В начале было слово \ КОД \ git

SCM - Source Control Management - важнейший компонент инфраструктуры как код
Поскольку написание кода занимает у разработчиков(код) и современного инженера(средства автоматизации) большую часть рабочего времени.
Все сделанные изменения  кода нуждаются в отслеживании.
Разработчики и инженеры используют SCM что бы отслеживать изменения по отдельности и в случаи необходимости объединить эти изменения в основную ветку кода.
Средства автоматизации и Continus integration будут получать код из SCM.
SCM будет уведомлять CI сервер, когда появится новый код и потребуется собрать новую версию программы.

Git — одна из SCM

https://git-scm.com/downloads
apt-get install git -y 
yum install git -y  

Первичная настройка.
git config --global user.name "Vasya Pupkin"
git config --global user.email "ваш@почтовый.ящик"
git config --global push.default simple - позволяет использовать простой push, где находимся туда и push

Генерация ключей
ssh-keygen -t rsa -b 4096 - команда для генерации связки открытого-закрытого ключа (~/.shh/id_rsa.pub - публичный ключ)
cat ~/.ssh/id_rsa.pub - посмотреть сгенерированный публичный ключ
ssh-copy-id user_name@hostname.zzz - скопировать публичный ключ на ПК user_name@hostname.zzz

Подключение репозитория:
git clone  - выполняем в случае если у нас есть уже репозиторий  например на github
git unit - выполняем если у нас еще нет репозитория, репозиторий будет создан локально, новый репозиторий

Внесение изменений в репозиторий
индексация кода, первая стадия (git add .)
staged - commit - добавление в commit, вторя стадия  (git commit -m "add new file")
branch - какую ветку мы используем ()

git status  - покажет состояние нашего репозитория(ожидание commit, текущая ветка, и т.д.)

Индексация:
git add  - добавить файл в индексацию
git add . - добавить все файлы в индексацию (текущий каталог)
git add -A - добавить все файлы в индексацию (текущий каталог)

Фиксируем изменения в git
git commit -m "<ваше описание>" - при commit старайтесь писать подробней что было сделано.

Отправка изменений на внешний репозиторий git
git push - загрузить изменения на репозиторий git
!!! push по умолчанию  загружает изменения на удаленный репозиторий ассоциированный с текущей локальной ветки
git push -u    - загрузить изменения на репозиторий git


Переключение веток(branch)
git checkout 

Лог
git log --pretty=format:\"%h %ad | %s%d[%an]\" --graph --date-short

Создание новой ветки
git checkout -b 

Указатели git tag

Запрос pull, загрузка ветки 
Запрос merges, объединение веток


Виртуализация:

host - система предоставляющая ресурсы ВМ (реальное железо)
guest - виртуальная машина (ВМ)

Гипервизоры - host - KVM, XEN, VMware, VirtuakBox, Parallels and etc

Vagrant

Vagrant - свободное и открытое программное обеспечение для создания и конфигурирования виртуальной среды разработки. 
Является обёрткой для программного обеспечения виртуализации, например VirtualBox, и средств управления конфигурациями, таких как Chef, Salt и Puppet.
Используется для развертывания ВМ.

https://www.vagrantup.com/ - сайт разработчиков vagrant
https://www.vagrantup.com/docs - документацияvagrant
https://github.com/hashicorp - главный репозиторий vagrant
https://github.com/hashicorp/vagrant/wiki/Available-Vagrant-Plugins - все возможные плагины
https://github.com/vagrant-libvirt/vagrant-libvirt - плагин для KVM

https://www.turnkeylinux.org/ - образы
https://app.vagrantup.com/boxes/search  - золотые образы -  box - golden image




Установка на debian
apt-get build-dep vagrant ruby-libvirt
apt-get install qemu libvirt-daemon-system libvirt-clients ebtables dnsmasq-base
apt-get install libxslt-dev libxml2-dev libvirt-dev zlib1g-dev ruby-dev



vagrant plugin install PLUGIN - установка плагина

vagrant plugin update PLUGIN - обновление плагина

vagrant plugin license LICENSE-FILE - установка лицензии для дополнительного функционала (например для плагина vmware)

vagrant plugin uninstall PLUGIN - удалить плагине

vagrant plugin install vagrant-aws - установить плагин vagrant-aws

vagrant plugin install vagrant-libvirt - установить плагин vagrant-libvirt 

box - (golden image)


Cоздадим первый образ
mkdir vagrant - создаем каталог где у нас будут хранится проекты
cd vagrant - перейдем в каталог
mkdir project1-test - создадим каталог для первого проекта
cd project1-test - перейдем в каталог проекта
vagrant init - произведем инициализацию проекта (будет создан файл Vagrantfile)

https://www.vagrantup.com/docs/vagrantfile/machine_settings - документация по настройке вм в конфиге
https://app.vagrantup.com/boxes/search - золотые образы 

nano Vagrantfile - редактируем файл проекта
----------------
Vagrant.configure("2") do |config|
  config.vm.box = "debian/jessie64"
end
----------------

vagrant validate - проверяем конфиг

vagrant up - запускаем проект (будет произведена загрузка и установка образа, сгенерированы открытый/закрытый ключ)


Управление текущим образом
vagrant ssh - подключение к ВМ
vagrant ssh-config - посмотреть текущие настройки
vagrant halt - выключить ВМ
vagrant suspend - приостановить ВМ
vagrant resume - возобновить работу ВМ
vagrant reload - перезагрузка ВМ
vagrant snapshot save name_snapshot - создать снимок ВМ и назвать его name_snapshot
vagrant snapshot list - показать список снимков
vagrant snapshot restore name_snapshot - восстановить ВМ из снимка name_snapshot
vagrant list - показать все ВМ (в libertv нет такой команды, все управления осуществляются входя в каталог проекта, но мы можем воспользоваться командами virsh, например "virsh list --all")
vagrant upload [options]  [destination] [name|id] - копирование файлов
vagrant upload /root/1.txt /home/vagrant/ - скопировали файл /root/1.txt на удаленный ПК(проект project1-test) в каталог /home/vagrant/ 
vagrant status - команда покажет все проекты, их имена, состояние
vagrant global-status - команда покажет все проекты, их имена, состояние
vagrant destroy name_vm - удалить ВМ


При развертывании есть возможность добавить копирование/синхронизацию каталога
----------------
Vagrant.configure("2") do |config|
  config.vm.box = "debian/jessie64"
  config.vm.synced_folder "app/", "/var/www/app"
end
----------------


При развертывании есть возможность настроить сеть например проброс портов
----------------
Vagrant.configure("2") do |config|
  config.vm.box = "debian/jessie64"
  config.vm.synced_folder "app/", "/var/www/app"
  config.vm.network "forward_port", guest: 8080, host:8081
end
----------------


Запуск программ и скриптов 1
----------------------------
Vagrant.configure("2") do |config|
  config.vm.box = "debian/jessie64"
  config.vm.synced_folder "app/", "/var/www/app"
  config.vm.network "forward_port", guest: 8080, host:8081

  config.vm.define "app" do |app|
    app.vm.provision "shell", line: "apt-get install -y nodejs npm"
  end

end
----------------------------



Запуск программ и скриптов 2
----------------------------
Vagrant.configure("2") do |config|
  config.vm.box = "debian/jessie64"
  config.vm.synced_folder "app/", "/var/www/app"
  config.vm.network "forward_port", guest: 8080, host:8081

  config.vm.define "app" do |app|
    app.vm.provision "shell", line: "apt-get install -y nodejs npm"
  end

  $script - <<-SCRIPT
    apt-get install nodejs npm -y
  SCRIPT

  app.vm.provision "shell", inline: $script
  app.vm.provision "shell", path: "scripts/pre.sh"
end
----------------------------



Запуск программ и скриптов 3
----------------------------
Vagrant.configure("2") do |config|
  config.vm.box = "debian/jessie64"
  config.vm.synced_folder "app/", "/var/www/app"
  config.vm.network "forward_port", guest: 8080, host:8081

  config.vm.define "app" do |app|
    app.vm.provision "shell", line: "apt-get install -y nodejs npm"
  end

  $script - <<-SCRIPT
    apt-get install nodejs npm -y
  SCRIPT

  app.vm.provision "shell", inline: $script
  app.vm.provision "shell", path: "scripts/pre.sh"
end
----------------------------


Для настройки ВМ поддерживаются конфигурационные менеджеры, такие как Ansible, Chef, Puppet, Salt

Использование ansible
----------------------------
Vagrant.configure("2") do |config|
  config.vm.box = "debian/jessie64"
  app.vm.provision "ansible_local" do |ansible|
  ansible.playbook = "playbooks/node.yaml"
  ansible.become = true
  ansible.become_user = "root"
end
----------------------------

gitLab установка с помощью vagrant на CentOS7

0. Готовимся к установке gitlab 
vagrant box add centos/7 - этой командой мы скачаем "золотой образ" для дальнейшего развертывания ВМ
mkdir gitlab - в каталоге vagrant создаем каталог gitlab
cd gitlab/ - переходим в каталог gitlab
vagrant init -  и выполняем инициализацию (будет создан файл Vagrantfile) (или vagrant init centos/7  узнав тут https://app.vagrantup.com/centos/boxes/7)

1.Смотрим инструкцию про установку gitlab на centos7 
https://about.gitlab.com/install/#centos-7
по инструкции нам нужно будет выполнить следующие команды
sudo yum install -y curl policycoreutils-python openssh-server perl
sudo systemctl enable sshd
sudo systemctl start sshd
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo systemctl reload firewalld
sudo yum install postfix
sudo systemctl enable postfix
sudo systemctl start postfix
Все команды в инструкции начинающиеся с "sudo" мы в vagrand выполняем без sudo так как там команды выполняются от root
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh | sudo bash - в этой команде нам нужно будет изменить "gitlab-ee" на "gitlab-ce" (ee - Enterprise Edition - платное, ce - Community Edition - бесплатное) 
sudo EXTERNAL_URL="https://gitlab.example.com" yum install -y gitlab-ee - в этой команде нам нужно будет изменить "gitlab-ee" на "gitlab-ce" (ee - Enterprise Edition - платное, ce - Community Edition - бесплатное) 

2. Редактируем файл  Vagrantfile
vim Vagrantfile
----------------------------------
Vagrant.configure("2") do |config|
  config.vm.box = "centos/7"

  config.vm.hostname = "gitlab"

  config.vm.provider "libvirt" do |domain|
    domain.memory = "4096"
    domain.cpus = "4"
   end

  config.vm.provision "shell", inline: <<-SHELL
     yum -y update
     yum install -y curl policycoreutils-python openssh-server perl
     systemctl enable sshd
     systemctl start sshd
     firewall-cmd --permanent --add-service=http
     firewall-cmd --permanent --add-service=https
     systemctl reload firewalld
     yum install postfix
     systemctl enable postfix
     systemctl start postfix
     curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
     EXTERNAL_URL="https://gitlab.linux.local" yum install -y gitlab-ce
  SHELL
end

----------------------------------


3. Проверим все ли правильно с конфигом Vagrantfile 
vagrant validate

4. Если с пунктом три все ок то запустили установку
vagrant up


Vagrand bridge


  config.vm.network "public_network",
      :dev => "br0",
      :mode => "bridge",
      :type => "bridge",
      :ip => "192.168.1.200"


Vagrant итог:

https://help.ubuntu.ru/wiki/vagrant - краткая документация
https://kevin.thecorams.net/posts/2020/08/libvirt-bridging/ - настройка bridge

Основные понятия
Provider — используемая система для виртуализации (VirtualBox, VMWare, LXC). 
По умолчанию используется VirtualBox.

Vagrant Box — это сохраненный образ ВМ, для быстрого клонирования виртуальных машин. 
Брать можно тут: 
https://app.vagrantup.com/boxes/search
http://www.vagrantbox.es/
На основе бокса будут создаваться виртуальные машины. 
Сами боксы при этом не изменяются. 
Размер боксов варьируется от 200 Мб до 2,5 Гб. 
Когда вы архивируете состояние вашей ВМ, на выходе также получаете бокс.

Vagrantfile — это файл конфигурации виртуальной машины, расположен в директории проекта. Он описывает настройки виртуальной машины, форвардинг портов, установку приложений, прочее. 
Содержимое файла это код на языке Ruby. 
Желательно держать этот файл в Git-репозитории.


Пример использования
--------------------
Заходим в директорию проекта, добавляем “бокс” с Ubuntu, инициализируем Vagrant, правим при необходимости Vagrantfile с настройками и выполняем vagrant up для запуска виртуалки. 
Если все готово, подключаемся по ssh.

cd your_project
vagrant box add ubuntu/trusty64
vagrant init ubuntu/trusty64
vagrant up
vagrant ssh

Эти команды необходимы для запуска виртуальной машины с помощью Vagrant. 
Будет запущена полнофункциональная виртуальная машина на операционной системе Ubuntu с выделенным объемом памяти по умолчанию в 512 Мб.
-------------------

Основные команды Vagrant
vagrant box list — cписок доступных (уже добавленных) боксов, на основе которых мы можем запускать нашу виртуалку
vagrant box add — добавление бокса, указываем название и ссылку для скачивания
vagrant init — инициализация, в текущем каталоге будет создан файл Vagrantfile, а сама виртуальная машина будет располагаться в дефолтном для VirtualBox каталоге
vagrant up — запускаем виртулаку, в том числе выполняются необходимы инструкции по настройке из конфига при первом запуске
vagrant ssh — подключение по SSH к виртуалке
vagrant package — создание пакета текущего виртуального окружения готового к развертыванию на другом компьютере
vagrant reload — перезагрузить виртуалку
vagrant suspend — уход в спящий режим с сохранением текущего состояния, возобновление работы происходит очень быстро но требуется место на диске
vagrant resume — возобновления работы из спящего режима
vagrant halt — выключить виртуалку, обычное завершение работы; состояние системы не сохраняется, запуск через vagrant up
vagrant destroy — завершение работы с очисткой места на диске, которое занимало запущенное виртуальное окружение (обычно не рекомендуется использовать)
vagrant provision — подготовить окружение виртуальной машины (“provision” — обеспечение), запустить необходимые инструкции по установке и настройке ПО с помощью инструкций Ansible, Chef или Puppet; эта команда зачастую используется при внесенных изменениях в конфигурацию.

!!! Vagrant в основном применяется для первоначальной установки, а дальнейшая настройка и конфигурирование выполняется с помощью Ansible(Chef или Puppet)

Ansible - конфигурирование

https://docs.ansible.com/ansible/latest/index.html

Используется для конфигурирования ВМ, сетевых устройств, серверов, и т.д.
Работает через SSH.

Главное отличие от других конфиг менеджеров в том что для работы не требуется "устанавливать демоны и вспомогательное ПО" на устройства которыми управляет ansible
YAML - язык разметки

Плюсы
1. Понятность YAML
2. Быстрота обучения
3. Завершённость
4. Эффективность
5. Безопасность (работает через ssh)


1. Установка
apt install ansible - установим ansible (на любом ПК с которого будем управлять)
adduser ansible - создадим пользователя
su - ansible - зайдем под пользователем ansible
ssh-keygen - генерируем открытый и закрыты ключ для пользователя ansible

2. Что бы не мучится с DNS в тестовых целях можно отредактировать файл /etc/hosts 
nano /etc/hosts - редактируем, добавим записи
---------------------------
10.0.0.24 node1.linux.local node1
10.0.0.25 node2.linux.local node2
192.168.15.128 hsrv2.linux.local hsrv2 
192.168.121.192 gitlab.linux.local gitlab
192.168.121.174 test.linux.local test
---------------------------

3. Приводим имена хостов в порядок
hostnamectl set-hostname node1.linux.local - изменить имя хоста

4. Добавляем пользователя ansible на все хосты которыми будем управлять
adduser ansible
passwd ansible

5. Для работы Ansible потребуется отредактировать файл /etc/sudoers на всех хостах которыми будем управлять
cat /etc/sudoers - посмотреть содержимое файла /etc/sudoers

!!!nano /etc/sudoers - не рекомендуется использовать обычные редакторы

visudo - добавляем привилегии в файл /etc/sudoers  рекомендуется использовать эту программу 
-------------------------------
ansible ALL=(ALL) NOPASSWD: ALL
--------------------------------