MS SQL — Создание пользователя с полными правами к базе

Создадим пользователя "admin_web" с логином "admin_web", паролем "password1234" и дадим ему права владельца на базу "artem_services"

Создаем логин:

CREATE LOGIN admin_web with Password ='password1234';
GO

 

Выбираем нашу базу данных:

USE artem_services;
GO

 

Создаем пользователя для созданного логина:

CREATE USER admin_web FOR LOGIN admin_web;
GO

 

Добавляем пользователя в группу владельцев базы данных:

ALTER ROLE db_owner ADD MEMBER admin_web;
GO

Jenkins — Проверка существования переменной

 

Если в Jenkins Pipeline используется переменная, которая создается на основе Webhook'а или т.п., то при ручном запуске задача завершится ошибкой. Чтобы это избежать, можно добавить проверку существования переменной и задать ей значение.

pipeline {
  agent any
    stage('Check ENV') {
      when { expression { env.GIT_COMMIT_ID == null } }
      steps {
        script {
          echo "COMMIT ID IS NOT SET"
          env.GIT_COMMIT_ID = sh(script: 'git log --format="%H" -n 1', returnStdout: true).trim()
        }
      }
    }
  }
}  

 

В данном примере проверяется наличие переменной "GIT_COMMIT_ID", и при ее отсутствии выполняется скрипт, который задает данную переменную со значением последнего HASH коммита для данной ветки. Данная проверка должна выполнятся только после "checkout" стейджа.

Nginx — Jenkins reverse proxy

 

jenkins.conf

 server {
    listen [::]:80;
    listen 80;

    server_name jenkins.{YOUR_DOMAIN_NAME};

    location / {
        proxy_set_header        Host $host:$server_port;
        proxy_set_header        X-Real-IP $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header        X-Forwarded-Proto $scheme;

        proxy_pass          http://127.0.0.1:8080;
        proxy_read_timeout  90;

        proxy_redirect      http://127.0.0.1:8080 http://jenkins.{YOUR_DOMAIN_NAME};

        proxy_http_version 1.1;
        proxy_request_buffering off;
        add_header 'X-SSH-Endpoint' 'jenkins.{YOUR_DOMAIN_NAME}:50022' always;
    } 
}

AWS SNS — HTTP(S) Subscription: ручное подтверждение

При создании подписки на HTTP/HTTPS в AWS SNS можно наблюдать, что подписка повисла в статусе: "Pending confirmation"

 

SNS на указанный URL делает POST запрос, в котором отправляет данные в формате JSON, и ожидает в ответ получить значение ключа: "SubscribeURL". Но если приложение не умеет ответить SNS'у, то можно ввести URL подтверждения вручную, но для этого его нужно узнать.

Для этого можно воспользоваться Nginx'ом и его access_log.

Так как тело POST запроса записывается в лог, только при использовании "proxy_pass", то смоделируем проксирование на бэкенд.

nginx.conf

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}

http {
    log_format postdata escape=json '"$request_body"';

    server {
        listen       80;
        server_name  _;

        location /success {
            return 200;
        }

        location / {
            proxy_redirect off;
            proxy_pass_request_body on;
            proxy_pass $scheme://127.0.0.1:$server_port/success;
            add_header X-Body $request_body;
            access_log  /var/log/nginx/post.log postdata;
        }
    }
}

 

В примере конфигурация приведена для HTTP протокола, если у вас HTTPS, добавьте части конфигурации, которые относятся к SSL.

 

Перечитаем конфигурацию Nginx'а:

systemctl reload nginx

 

После возвращаемся в консоль AWS и в SNS подписках выбираем нужную и делаем повторный запрос "Request Confirmation"

 

Смотрим лог Nginx'а:

cat /var/log/nginx/post.log

 

Интересует значение ключа: "SubscribeURL", оно будет вида:

https://sns.{REGION}.amazonaws.com/?Action=ConfirmSubscription&TopicArn=arn:aws:sns:{REGION}:{YOUR_ACCOUNT_ID}:{YOUR_TOPIC_NAME}&Token={YOUR_TOKEN}

 

Копируем его и возвращаемся к AWS SNS. Выбираем подтверждение подписки "Confirm Subscription"

 

Вставляем значение "SubscribeURL" и подтверждаем.

 

BASH — Цикл FOR с диапазоном на основе переменной

 

Если нужно выполнить цикл FOR N-ое количество раз, и это значение будет задаваться переменной, то скрипт будет выглядеть следующим образом:

 

#!/bin/bash

END=10

for i in $(seq 1 $END)
do
    echo $i
done

BASH — Цикл FOR на основе списка

 

Есть к примеру файл "/home/artem/IP" с IP адресами, на которых нужно выполнить удаленную команду, то цикл FOR будет выглядеть следующим образом:

 

IP="$(cat /home/artem/IP)"

for i in $IP
do
    ssh root@$i 'hostname'
done

BASH — Переменная содержимое которой ссылается на другую переменную

 

К примеру есть N-ое количество переменных, "var_1", "var_2" и так далее, скрипт принимает в качестве аргументов только номер переменной, и ее содержимое должно быть в новой переменной var.

Если выполнить данный скрипт передав ему в качестве аргумента "1":

./my_script.sh 1

 

my_script.sh

#!/bin/bash

var_1='MY_VAR_NUMBER_1'
var_2='MY_VAR_NUMBER_2'
var_3='MY_VAR_NUMBER_3'

var="var_$1"
echo $var

 

То скрипт вернет:

var_1

 

А нам нужно содержимое переменной "var_1". Для этого, команда "echo" должна иметь следующий вид:

echo "${!var}"

 

В таком случае она вернет:

MY_VAR_NUMBER_1

CentOS 7 — Jenkins установка

Установим Java OpenJDK, так как она является зависимостью для Jenkins'а. Последние версии Jenkins'а совместимы с 11-ой версией, так что установим ее.

sudo yum install -y java-11-openjdk

 

Для добавления Jenkins репозитория понадобится утилита "wget", если ее нет в системе, то устанавливаем:

sudo yum install -y wget

 

Добавляем репозиторий и импортируем его ключ:

sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key

 

Устанавливаем Jenkins:

sudo yum install -y jenkins

 

Запускаем:

sudo systemctl start jenkins

 

Проверяем статус:

sudo systemctl status jenkins

 

Если все хорошо, добавляем в автозапуск:

sudo systemctl enable jenkins

 

Для продолжения установки нужно перейти в браузере по IP адресу сервера на порт "8080"

FIX ERROR — sudo cat EOF: Permission denied

При попытке записать в файл поток используя sudo

sudo cat << EOF > /etc/yum.repos.d/some-name.repo
...
EOF

 

Появляется следующая ошибка:

-bash: /etc/yum.repos.d/some-name.repo: Permission denied

 

Решение

Чтобы выполнить запись используя sudo нужно использовать следующий формат:

sudo bash -c 'cat << EOF > /etc/yum.repos.d/some-name.repo
...
EOF'

Graphite — Stress test

 

Все действия проводились на "AMI Linux 2", если выполнять на другом дистрибутиве, вам будет нужно установить Java и Git, остальные шаги будут такими же.

 

Устанавливаем Java OpenJDK:

sudo amazon-linux-extras install java-openjdk11

 

Так же устанавливаем Git:

yum install -y git

 

Клонируем репозиторий и переходим в него:

git clone https://github.com/feangulo/graphite-stresser
cd graphite-stresser

 

Перед сборкой нужно поправить версию Gradle на актуальную

vim gradle/wrapper/gradle-wrapper.properties

 

#distributionUrl=https\://services.gradle.org/distributions/gradle-2.9-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-6.2.1-all.zip

 

Собираем:

./gradlew uberjar

 

Для удобства скопируем собранный jar файл с другим именем:

cp build/libs/graphite-stresser-0.1.jar ./graphite-stresser.jar

 

Запускаем тест:

java -jar graphite-stresser.jar 172.31.22.196 2003 1 128 10 false

 

Где:

  • 172.31.22.196 — IP адрес Graphite инстанса
  • 2003 — порт (UDP, с TCP этот тестер не захотел работать)
  • 1 — количество хостов (симуляция нескольких хостов, публикующих метрики)
  • 128 — numTimers (сколько метрик будет генерироваться. [1, 2, 3, 4, 5, 10, 20, 64, 128, 256, 384, 650, 975, 1956, 3912, 4887, 7824, 9780, 13699])
  • 10 — как часто будут генерироваться (секунды)
  • false — выключить дебаг (можно смело отключать, при возникновении ошибок они будут выводится в консоль. Параметр для включения — true)

 

Для мониторинга количества метрик можно в Grafana импортировать этот дашборд.

 

Так же нужно обратить внимание на I/O и нагрузку CPU. Так как Whisper требователен к I/O, а carbon-cache не все запросы может распараллелить, и за частую все выполняет в одном потоке. Если у вас бутылочным горлышком является CPU, то стоит присмотреться к реализации Carbon на Gogo-carbon

Для Go-Carbon данный дашборд не будет показывать метрики, так как они отличаются от Python версии. Для Go-Carbon вы можете воспользоваться следующим дабордом