Page_c76a3fcf https://linux-notes.org Unix/ Linux блог, на котором можно найти полезную информацию по настройке ОС и ПО. Wed, 06 Jan 2021 16:25:17 +0000 ru-RU hourly 1 https://wordpress.org/?v=6.7.2 Page_c76a3fcf https://linux-notes.org/ustanovka-argocd-v-unix-linux/ https://linux-notes.org/ustanovka-argocd-v-unix-linux/#respond Wed, 06 Jan 2021 16:24:57 +0000 https://linux-notes.org/?p=18003 ArgoCD - это декларативный инструмент непрерывной доставки GitOps для Kubernetes. Т.е дает возможность выполнять деплой приложений в K8S и хранить все конфиги в гите.

The post Установка ArgoCD в Unix/Linux first appeared on linux-notes.org.]]>

ArgoCD — это декларативный инструмент непрерывной доставки GitOps для Kubernetes. Т.е дает возможность выполнять деплой приложений в K8S и хранить все конфиги в гите.

Установка ArgoCD в Unix/Linux

Для начало что необходимо, так установить Кубернетес, у меня есть ряд статей на эту тему:

Установка Kubernetes кластера в Unix/Linux

Установка Kubernetes в Unix/Linux

Команды Kubernetes в Unix/Linux

Создание AWS EKS кластера в Unix/Linux

Установка minikube в Unix/Linux

После чего, создаем неймспейс:

$ kubectl create namespace argocd

Установка ArgoCD через KubeCTL

Первое что необходимо, так — это поставить данную утилиту под названием kubectl!

Выполняем деплой:

$ kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

Можно выполнить установку еще так (Non-HA):

$ export VESION=$(curl --silent "https://api.github.com/repos/argoproj/argo-cd/releases/latest" | grep '"tag_name"' | sed -E 's/.*"([^"]+)".*/\1/')
$ export ARGO_VERSION="v1.8.0-rc1"
$ kubectl apply -n argo -f https://raw.githubusercontent.com/argoproj/argo/${ARGO_VERSION}/manifests/install.yaml

Можно выполнить установку еще так (HA):

$ export ARGO_VERSION="v1.8.0-rc1"
$ kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/${ARGO_VERSION}/manifests/ha/install.yaml

Установка ArgoCD через Helm

Первое что необходимо, так — это поставить данную утилиту под названием helm!

И выполняем deploy:

$ helm repo add argo https://argoproj.github.io/argo-helm

$ helm install argocd \
	-n argocd \
	--set global.image.repository="argoproj/argocd" \
	--set global.image.tag="v1.8.1" \
	--set server.service.type="LoadBalancer" \
	argo/argo-cd

Если используете локальный миникуб или что-то такое, то запускаем так:

helm install argocd \
	-n argocd \
	--set global.image.repository="argoproj/argocd" \
	--set global.image.tag="v1.8.1" \
	argo/argo-cd

Проверим что все подымается так:

$ kubectl get po -n argocd && \
kubectl get service -n argocd

Можем идти дальше.

Кстати, пароль будет таким:

$ export OLD_ARGOCD_PWD=$(kubectl get pods -n argocd -l app.kubernetes.io/name=argocd-server -o name | cut -d'/' -f 2)

Если что, его можно поменять.

Установка ArgoCD через Terraform

Я недавно писал модуль для работы с helm, и на примере ArgoCD выполнил деплой. Код выглядит так:

#
# MAINTAINER Vitaliy Natarov "vitaliy.natarov@yahoo.com"
#
terraform {
  required_version = "~> 0.13"
}

module "helm_release" {
  source = "../../modules/release"

  enable_release     = true
  release_name       = "argocd-dev"
  release_chart      = "argo-cd"
  release_repository = "https://argoproj.github.io/argo-helm"
  release_version    = "v1.7.6"

  release_namespace        = "argocd-dev"
  release_create_namespace = true
  release_values           = []

  release_set = [
    {
      name  = "server.service.type"
      value = "LoadBalancer"
    }
  ]
  release_set_sensitive = []
  release_postrender    = []

  release_timeout       = 600
  release_force_update  = false
  release_recreate_pods = true
  release_lint          = false

}

Код с моими модулями можно найти тут — https://github.com/SebastianUA/terraform/blob/master/helm/examples/release/main.tf

Попозже дополню данную статью этим материалом.

Настройка ArgoCD в Unix/Linux

Поле того, как у вас задеплоится ArgoCD, вы не можете знать пароль от стандартного пользователя (admin), но его можно посмотреть тут:

$ kubectl get secret -n argocd argocd-secret -o yaml

Или, так:

$ kubectl get secret -n argocd argocd-secret -o yaml | grep -Ei "  admin.password: "

Т.к кубернетес пишет все секреты в base64, то декодировать строку можно так:

$ kubectl get secret -n argocd argocd-secret -o yaml | grep -Ei "  admin.password: " | awk '{print $2}' | base64 --decode

Пока не понял как расшифровать пароль с BCrypt. По этому, пойду по простому пути, а именно — перепишу пароль на нужный, например, вы хотите поставить пароль «admin» — т.е как и логин. Дано:

  • Plain Text: admin
  • BCrypt Hash:
$2b$10$ixLkbNDoNmoo3sHorEFequhJeEsZBtFVGlYjEhKZqBv2dlgTmbt.G

И выполняем патч:

$ kubectl -n argocd patch secret argocd-secret \
  -p '{"stringData": {
    "admin.password": "$2b$10$ixLkbNDoNmoo3sHorEFequhJeEsZBtFVGlYjEhKZqBv2dlgTmbt.G",
    "admin.passwordMtime": "'$(date +%FT%T%Z)'"
  }}'

Можно использовать login & password — admin.

Можно, просто выключить авторизацию так:

$ kubectl patch deploy argocd-server -n argocd -p '[{"op": "add", "path": "/spec/template/spec/containers/0/command/-", "value": "--disable-auth"}]' --type json

Добавление пользователей в ArgoCD

Посмотреть конфиг с юзерами и паролями, можно так:

$ kubectl get secret -n argocd argocd-secret -o yaml

Первое что нужно — это отредактировать:

$ kubectl edit -n argocd configmap/argocd-cm

И приводим к виду:

data:
  accounts.vnatarov: apiKey, login
  accounts.vnatarov.enabled: "true"
  accounts.test: apiKey, login
  accounts.test.enabled: "true"

Где:

  • vnatarov & test — это имена юзеров.
  • apiKey — Позволяет генерировать токены.
  • login — Позволяет выполнять вход в UI админку ArgoCD.
  • enabled: «true» — Говорит системе то, что юзер будет включен.

Для пользователей я поставлю пароль по логину чтобы проверить как это будет работать.

Патчим пароли:

$ kubectl -n argocd patch secret argocd-secret \
  -p '{"stringData": {
    "vnatarov.password": "$2b$10$ySVNtxkJVrSmh2GQA2zTLOzNedw1QPtDMYXp0X21WYSFwqvVUdWfm",
    "vnatarov.passwordMtime": "'$(date +%FT%T%Z)'"
  }}'

kubectl -n argocd patch secret argocd-secret \
  -p '{"stringData": {
    "test.password": "$2b$10$O1Jc1FgWcDN.PC0mA6xdPOT4OmUQXHupcO9/0k6r6MHYLhuH7ALP6",
    "test.passwordMtime": "'$(date +%FT%T%Z)'"
  }}'

Или, можно отредактировать (но тогда нужно будет зашифровать фразу в base64):

$ kubectl edit secret -n argocd argocd-secret

Чет какие-то баги в аргоСД и я смог пофиксить способом что описал выше, по этому, выполнил вход в админку:

$ yes | argocd login 127.0.0.1:8080 --username admin --password admin

Можно поглядеть учетки:

$ argocd account list
NAME      ENABLED  CAPABILITIES
admin     true     login
test      true     login, apiKey
vnatarov  true     apiKey, login

Ну и обновляем пароль:

$ argocd account update-password --account test --new-password 'test'

Точно так же для моего другого юзера:

$ argocd account update-password --account vnatarov --new-password 'vnatarov'
*** Enter current password:
Password updated

Приведу полный вывод моего конфига configmap-ы argocd-cm:

$ kubectl get -n argocd configmap/argocd-cm -o yaml

apiVersion: v1
data:
  accounts.test: login,apiKey
  accounts.test.enabled: "true"
  accounts.vnatarov: apiKey,login
  accounts.vnatarov.enabled: "true"
  application.instanceLabelKey: argocd.argoproj.io/instance
  statusbadge.enabled: "true"
  url: https://127.0.0.1:8080
  users.anonymous.enabled: "true"
kind: ConfigMap
metadata:
  annotations:
    meta.helm.sh/release-name: argocd
    meta.helm.sh/release-namespace: argocd
  creationTimestamp: "2021-01-05T18:18:34Z"
  labels:
    app.kubernetes.io/component: server
    app.kubernetes.io/instance: argocd
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/name: argocd-cm
    app.kubernetes.io/part-of: argocd
    helm.sh/chart: argo-cd-2.11.0
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:data:
        .: {}
        f:application.instanceLabelKey: {}
      f:metadata:
        f:annotations:
          .: {}
          f:meta.helm.sh/release-name: {}
          f:meta.helm.sh/release-namespace: {}
        f:labels:
          .: {}
          f:app.kubernetes.io/component: {}
          f:app.kubernetes.io/instance: {}
          f:app.kubernetes.io/managed-by: {}
          f:app.kubernetes.io/name: {}
          f:app.kubernetes.io/part-of: {}
          f:helm.sh/chart: {}
    manager: Go-http-client
    operation: Update
    time: "2021-01-05T18:18:34Z"
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:data:
        f:accounts.test.enabled: {}
        f:accounts.vnatarov.enabled: {}
        f:statusbadge.enabled: {}
        f:url: {}
        f:users.anonymous.enabled: {}
    manager: kubectl-edit
    operation: Update
    time: "2021-01-05T21:18:04Z"
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:data:
        f:accounts.test: {}
        f:accounts.vnatarov: {}
    manager: argocd-server
    operation: Update
    time: "2021-01-05T21:32:26Z"
  name: argocd-cm
  namespace: argocd
  resourceVersion: "122982"
  selfLink: /api/v1/namespaces/argocd/configmaps/argocd-cm
  uid: adc7f9e5-1318-44c7-a59e-ba1625a8f887

Приведу полный вывод моего конфига secret-а argocd-secret:

$ kubectl get secret -n argocd argocd-secret -o yaml

apiVersion: v1
data:
  accounts.test.password: JDJhJDEwJEhyUW0uQlo2alFTRWxvT1J3N3BKMnVXOGVGLnVRUGc4cC5LQ2JSTGJqUzRtYWtWVDRZZ1dl
  accounts.test.passwordMtime: MjAyMS0wMS0wNVQyMToyNzo0NFo=
  accounts.test.tokens: bnVsbA==
  accounts.vnatarov.password: JDJhJDEwJGExRElNNnk5SFhqM1h3ZmZjMkFNa094eGdROUYzTTg0OUQ2M1BoOFhnZXB3VkNrc2ZoZnYy
  accounts.vnatarov.passwordMtime: MjAyMS0wMS0wNVQyMTozMjoyNlo=
  accounts.vnatarov.tokens: bnVsbA==
  admin.password: JDJiJDEwJGl4TGtiTkRvTm1vbzNzSG9yRUZlcXVoSmVFc1pCdEZWR2xZakVoS1pxQnYyZGxnVG1idC5H
  admin.passwordMtime: MjAyMS0wMS0wNVQyMDoyMTowNFo=
  server.secretkey: MDZ5QVA3WVZ4cTQ0ZDFDdXZzaEZqZjcydDZmUmVmdjQ0UXFsenhUWDZEcz0=
  test.password: JDJiJDEwJE8xSmMxRmdXY0ROLlBDMG1BNnhkUE9UNE9tVVFYSHVwY085LzBrNnI2TUhZTGh1SDdBTFA2
  test.passwordMtime: MjAyMS0wMS0wNVQyMjo0NTozNEVFVA==
  tls.crt: YYYYY=
  tls.key: XXXXXXX==
  vnatarov.password: JDJiJDEwJHlTVk50eGtKVnJTbWgyR1FBMnpUTE96TmVkdzFRUHRETVlYcDBYMjFXWVNGd3F2VlVkV2Zt
  vnatarov.passwordMtime: MjAyMS0wMS0wNVQyMjoyNjo0N0VFVA==
kind: Secret
metadata:
  annotations:
    meta.helm.sh/release-name: argocd
    meta.helm.sh/release-namespace: argocd
  creationTimestamp: "2021-01-05T18:18:34Z"
  labels:
    app.kubernetes.io/component: server
    app.kubernetes.io/instance: argocd
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/name: argocd-secret
    app.kubernetes.io/part-of: argocd
    helm.sh/chart: argo-cd-2.11.0
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:metadata:
        f:annotations:
          .: {}
          f:meta.helm.sh/release-name: {}
          f:meta.helm.sh/release-namespace: {}
        f:labels:
          .: {}
          f:app.kubernetes.io/component: {}
          f:app.kubernetes.io/instance: {}
          f:app.kubernetes.io/managed-by: {}
          f:app.kubernetes.io/name: {}
          f:app.kubernetes.io/part-of: {}
          f:helm.sh/chart: {}
      f:type: {}
    manager: Go-http-client
    operation: Update
    time: "2021-01-05T18:18:34Z"
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:data:
        f:admin.password: {}
        f:test.password: {}
        f:test.passwordMtime: {}
        f:vnatarov.password: {}
        f:vnatarov.passwordMtime: {}
    manager: kubectl-patch
    operation: Update
    time: "2021-01-05T20:45:35Z"
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:data:
        .: {}
        f:accounts.test.password: {}
        f:accounts.test.passwordMtime: {}
        f:accounts.test.tokens: {}
        f:accounts.vnatarov.password: {}
        f:accounts.vnatarov.passwordMtime: {}
        f:accounts.vnatarov.tokens: {}
        f:admin.passwordMtime: {}
        f:server.secretkey: {}
        f:tls.crt: {}
        f:tls.key: {}
    manager: argocd-server
    operation: Update
    time: "2021-01-05T21:32:26Z"
  name: argocd-secret
  namespace: argocd
  resourceVersion: "122983"
  selfLink: /api/v1/namespaces/argocd/secrets/argocd-secret
  uid: 17e9ff5c-946d-4655-bd05-c983091ef210
type: Opaque

Приведу полный вывод моего конфига secret-а argocd-secret:

$ kubectl get -n argocd configmap/argocd-rbac-cm -o yaml

apiVersion: v1
data:
  policy.csv: |
    # Built-in policy which defines two roles: role:readonly and role:admin,
    # and additionally assigns the admin user to the role:admin role.
    # There are two policy formats:
    # 1. Applications (which belong to a project):
    # p, <user/group>, <resource>, <action>, <project>/<object>
    # 2. All other resources:
    # p, <user/group>, <resource>, <action>, <object>

    p, role:readonly, applications, get, */*, allow
    p, role:readonly, certificates, get, *, allow
    p, role:readonly, clusters, get, *, allow
    p, role:readonly, repositories, get, *, allow
    p, role:readonly, projects, get, *, allow
    p, role:readonly, accounts, get, *, allow
    p, role:readonly, gpgkeys, get, *, allow

    p, role:admin, applications, create, */*, allow
    p, role:admin, applications, update, */*, allow
    p, role:admin, applications, delete, */*, allow
    p, role:admin, applications, sync, */*, allow
    p, role:admin, applications, override, */*, allow
    p, role:admin, applications, action/*, */*, allow
    p, role:admin, certificates, create, *, allow
    p, role:admin, certificates, update, *, allow
    p, role:admin, certificates, delete, *, allow
    p, role:admin, clusters, create, *, allow
    p, role:admin, clusters, update, *, allow
    p, role:admin, clusters, delete, *, allow
    p, role:admin, repositories, create, *, allow
    p, role:admin, repositories, update, *, allow
    p, role:admin, repositories, delete, *, allow
    p, role:admin, projects, create, *, allow
    p, role:admin, projects, update, *, allow
    p, role:admin, projects, delete, *, allow
    p, role:admin, accounts, update, *, allow
    p, role:admin, gpgkeys, create, *, allow
    p, role:admin, gpgkeys, delete, *, allow

    g, role:admin, role:readonly
    g, admin, role:admin
    g, vnatarov, role:admin
  policy.default: role:readonly
kind: ConfigMap
metadata:
  annotations:
    meta.helm.sh/release-name: argocd
    meta.helm.sh/release-namespace: argocd
  creationTimestamp: "2021-01-05T18:18:34Z"
  labels:
    app.kubernetes.io/component: server
    app.kubernetes.io/instance: argocd
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/name: argocd-rbac-cm
    app.kubernetes.io/part-of: argocd
    helm.sh/chart: argo-cd-2.11.0
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:metadata:
        f:annotations:
          .: {}
          f:meta.helm.sh/release-name: {}
          f:meta.helm.sh/release-namespace: {}
        f:labels:
          .: {}
          f:app.kubernetes.io/component: {}
          f:app.kubernetes.io/instance: {}
          f:app.kubernetes.io/managed-by: {}
          f:app.kubernetes.io/name: {}
          f:app.kubernetes.io/part-of: {}
          f:helm.sh/chart: {}
    manager: Go-http-client
    operation: Update
    time: "2021-01-05T18:18:34Z"
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:data:
        .: {}
        f:policy.csv: {}
        f:policy.default: {}
    manager: kubectl-edit
    operation: Update
    time: "2021-01-05T20:34:00Z"
  name: argocd-rbac-cm
  namespace: argocd
  resourceVersion: "116734"
  selfLink: /api/v1/namespaces/argocd/configmaps/argocd-rbac-cm
  uid: aa1649df-d477-4258-bb3a-f7219326ad84

Можно юзать!

Убрать HTTPS в ArgoCD

Патчим:

$ kubectl patch deploy argocd-server -n argocd -p '[{"op": "add", "path": "/spec/template/spec/containers/0/command/-", "value": "--insecure"}]' --type json

И потом все норм.

Создание RBAC для пользователей

Команда простая (на примере дефолтного админа):

$ kubectl -n argocd create rolebinding default-admin --clusterrole=admin --serviceaccount=argo:default

Дальше — больше.

Создание ArtifactRepository для ArgoCD

Создаем это так:

$ cat <<EoF > argo-patch.yaml
data:
  config: |
    artifactRepository:
      s3:
        endpoint: s3.amazonaws.com
        bucket: batch-artifact-repository
EoF

Где:

  • batch-artifact-repository — это созданный бакет.

И применяем:

$ kubectl -n argocd patch \
  configmap/argocd-cm \
  --patch "$(cat argo-patch.yaml)"

Вот так вот.

Установка оператора (Argo CD Operator) для ArgoCD (Helm)

Установка очень простая:

$ kubectl apply -f https://operatorhub.io/install/argocd-operator-helm.yaml

После чего, проверяем:

$ kubectl get csv -n my-argocd-operator-helm

Или, еще проще способ:

$ curl -sL https://github.com/operator-framework/operator-lifecycle-manager/releases/download/v0.17.0/install.sh | bash -s v0.17.0

После чего, проверяем:

$ kubectl get csv -n olm

Вот и все.

Использование ArgoCD в Unix/Linux

Пропишу команду для дальнейшего использования:

$ export ARGOCD_SERVER=$(kubectl get pods -n argocd -l app.kubernetes.io/name=argocd-server -o name | cut -d'/' -f 2)

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

$ kubectl port-forward service/argocd-server -n argocd 8080:443

И после данного действия, у вас будет работать argoCD на 127.0.0.1:8080

Т.к я использую макбук, то следующая команда установит argocd CLI на мой мак:

$ brew install argocd

Далее, выполним логин:

$ argocd login localhost:8080 --insecure --username admin --grpc-web

NOTE: Нужно знать пароль!

Далее, ставим 1-е приложение:

$ argocd app create guestbook \
--repo https://github.com/pcrete/argocd-example-apps.git \
--path guestbook \
--dest-server https://kubernetes.default.svc \
--dest-namespace guestbook

И далее, ставим 2-е приложение:

$ argocd app create webapp \
--repo https://gitlab.com/gitops-argocd-demo/webapp-chart.git \
--path . \
--dest-server https://kubernetes.default.svc \
--dest-namespace hello-gitops \
--sync-policy automated \
--auto-prune \
--self-heal

Можно открыть в браузере аргоСД и поглядеть что оно будет делать.

Вот и все, статья «Установка ArgoCD в Unix/Linux» завершена.

The post Установка ArgoCD в Unix/Linux first appeared on linux-notes.org.]]>
https://linux-notes.org/ustanovka-argocd-v-unix-linux/feed/ 0
Page_c76a3fcf https://linux-notes.org/sozdaem-github-workflows-s-actions-v-unix-linux/ https://linux-notes.org/sozdaem-github-workflows-s-actions-v-unix-linux/#respond Mon, 19 Oct 2020 17:53:57 +0000 https://linux-notes.org/?p=17735 Недавно, в GitHub появилась возможность использовать workflows для различных задач. Например, можно сделать флов для проверки вашего кода перед тем как код будет смерджен в какую-то из бранчей ( например - master). Я приведу пример использования lint для Terrafrom-а, т.е я хочу чтобы код работал не только у меня локально, но и после того как я его запушу в репозиторий - он будет проходить проверку и даст мне знать если что-то пойдет не так.

The post Создаем GitHub workflows с actions в Unix/Linux first appeared on linux-notes.org.]]>

Недавно, в GitHub появилась возможность использовать workflows для различных задач. Например, можно сделать флов для проверки вашего кода перед тем как код будет смерджен в какую-то из бранчей ( например — master). Я приведу пример использования lint для Terrafrom-а, т.е я хочу чтобы код работал не только у меня локально, но и после того как я его запушу в репозиторий — он будет проходить проверку и даст мне знать если что-то пойдет не так.

Структура моего .github фолдера выглядит так:

$ tree .github | grep -Ev "_BK"
.github
|-- FUNDING.yml
|-- ISSUE_TEMPLATE
|   |-- bug_report.md
|   |-- custom.md
|   `-- feature_request.md
|-- actions
|-- lock.yml
|-- move.yml
|-- no-response.yml
|-- stale.yml
`-- workflows
    |-- terraform-lint.yaml

3 directories, 11 files

Где:

  • FUNDING.yml — Служит файлом для настройки донатинга проекта. Добавил чтобы было…
  • actions — Папка для yaml-файлов с конфигурацией действий для workflows. Т.е описываем что можно выполнять и каким образом. У меня в данном случае — папка пуска и я использую только workflows с готовым примером.
  • workflows — Это папка в которой лежат yaml-файлы с ворк-фловами, т.е файлами конфигураций при работе с вашим проектом. Например, проверка орфограции, выполнение init & plan & apply для Terrafrom-а ( в моем случае). Т.е я хочу сказать — это что-то типа CI/CD в GitHub и похожу что Микромелкие сперли некоторые из фичей с GitLab CI.

Создаем GitHub workflows с actions для Terraform в Unix/Linux

GitHub Actions позволяют создавать собственные рабочие процессы жизненного цикла разработки программного обеспечения (SDLC) непосредственно в вашем репозитории GitHub.

Мой самый простой lint для Terraform выглядит:

$ cat .github/workflows/terraform-lint.yaml
---
name: terraform-lint

on: [push, pull_request]

jobs:
  delivery:
    runs-on: ubuntu-latest
    steps:
      - name: Check out code
        uses: actions/checkout@master
      - name: Lint Terraform
        uses: actionshub/terraform-lint@master

Я не создавал экшены и взял готовое использование проекта ( написанного кем-то до меня).

Еще, имеется и другой пример использование:

---
name: 'Terraform GitHub Actions'

# on: 
#   pull_request:
#     branches:
#       - master

on:
  - pull_request

jobs:
  terraform:
    name: 'Terraform'
    runs-on: ubuntu-latest
    steps:
      - name: 'Check out code'
        uses: actions/checkout@master
      - name: 'Terraform Format'
        uses: hashicorp/terraform-github-actions@master
        with:
          tf_actions_version: 0.12.13
          tf_actions_subcommand: 'fmt'
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      - name: 'Terraform Init'
        uses: hashicorp/terraform-github-actions@master
        with:
          tf_actions_version: 0.12.13
          tf_actions_subcommand: 'init'
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          TF_ACTION_WORKING_DIR: '.'
          AWS_ACCESS_KEY_ID:  ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY:  ${{ secrets.AWS_SECRET_ACCESS_KEY }}
      - name: 'Terraform Validate'
        uses: hashicorp/terraform-github-actions@master
        with:
          tf_actions_version: 0.12.13
          tf_actions_subcommand: 'validate'
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      - name: 'Terraform Plan'
        uses: hashicorp/terraform-github-actions@master
        with:
          tf_actions_version: 0.12.13
          tf_actions_subcommand: 'plan'
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          AWS_ACCESS_KEY_ID:  ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY:  ${{ secrets.AWS_SECRET_ACCESS_KEY }}

ЗАМЕЧАНИЕ: В данном примере — использую secrets, которые нужно прописать в настройках самого проекта. Данную настройку можно найти по следующему пути:

<GITHUB_URL>/<YOUR_USER>/<YOUR_REPO_NAME>/settings/secrets

Где:

  • <GITHUB_URL> — URL от гитхаба (с http или https).
  • <YOUR_USER> — Юзер от которого запушился код.
  • <YOUR_REPO_NAME> — Репозиторий.

Например у меня это выглядит так:

https://github.com/SebastianUA/terraform/settings/secrets

Нашел в интернете «runatlantis» проект который позволяет выполнять действия (terraform plan, terraform apply — это как пример) написав команду в комментарии ( например pull request-а). Не проверял работу, но оставил чтобы не забыть про него, если нужно будет заюзать.

Вот и все, статья «Создаем GitHub workflows с actions в Unix/Linux» завершена.

The post Создаем GitHub workflows с actions в Unix/Linux first appeared on linux-notes.org.]]>
https://linux-notes.org/sozdaem-github-workflows-s-actions-v-unix-linux/feed/ 0
Page_c76a3fcf https://linux-notes.org/udalit-vse-jenkins-offline-nodes-slaves-v-unix-linux/ https://linux-notes.org/udalit-vse-jenkins-offline-nodes-slaves-v-unix-linux/#respond Sat, 23 Nov 2019 16:11:56 +0000 https://linux-notes.org/?p=17572 При использовании слейвов в дженкинсе, всегда есть вероятность что какая-то из нод, — отпадет из-за какой-то из причин (Например: проблемы с сетью; закрылся порт). А если это ПРОД сервер и там должны собираться проекты. То за некоторый промежуток времени у вас может собраться большое количество выключенных машин. Полезное чтиво: Установка Jenkins и Jenkins-slave в Unix/Linux […]

The post Удалить все Jenkins offline nodes/slaves в Unix/Linux first appeared on linux-notes.org.]]>

При использовании слейвов в дженкинсе, всегда есть вероятность что какая-то из нод, — отпадет из-за какой-то из причин (Например: проблемы с сетью; закрылся порт). А если это ПРОД сервер и там должны собираться проекты. То за некоторый промежуток времени у вас может собраться большое количество выключенных машин.

Полезное чтиво:

Установка Jenkins и Jenkins-slave в Unix/Linux

Автосборка Java проектов через Jenkins в Unix/Linux

Настройка языка в Jenkins

Разграничение прав доступа в Jenkins

Мониторинг места на сервере через Jenkins

Настройка темы для Jenkins

Изменить/Поменять пароль для пользователя Jenkins

Создание Jenkins backup/restore в Unix/Linux

Автосборка Java проектов через Jenkins в Unix/Linux

Я нашел пару решений как это можно сделать. Покажу на наглядных примера как мне удалось убить больше 1.5к зомби-нод.

Удалить все Jenkins offline nodes

Так, одним из способов удалить все офлайн-хосты — это выполнить груви-скрипт через дженкинс консоль. Для этого, нужно зологиниться в сам дженкинс, затем кликнуть по «Manage Jenkins» и перейти в «script Console»:

В само поле со скриптом, вставить:

Closure query = { it.name ==~ /^.*$/  }
Closure action = {
  println('====================')
  println("Name: ${it.name}")
  println("LabelString: ${it.labelString}")
  println("NumExectutors: ${it.numExecutors}")
  println("RemoteFS: ${it.remoteFS}")
  println("Mode: ${it.mode}")
  println("RootPath: ${it.rootPath}")
  println("Offline: ${it.computer.offline}")
  
  if (it.computer.offline) {
    println("Deleting node: ${it.name}")
    it.computer.doDoDelete()
  }
}

Jenkins.instance.slaves.findAll(query).each(action)
return

Нажимаем на «RUN» и если много хостов, — это занимает некоторое время. Данный пример — полностью использовался на ПРОД серверах компании где работаю.

Удалить все Jenkins offline slaves

Проверил другой подход скрипта на груви. Полностью рабочий вариант. Чтобы удалить все офлайн-слейвы, нужно зологиниться в сам дженкинс, затем кликнуть по «Manage Jenkins» и перейти в «script Console»:

В само поле со скриптом, вставить:

for (aSlave in hudson.model.Hudson.instance.slaves) {
    if (aSlave.getComputer().isOffline()) {
        aSlave.getComputer().setTemporarilyOffline(true,null);
        aSlave.getComputer().doDoDelete();
    }
}

Нажимаем на «RUN» и если много хостов, — это занимает некоторое время. Данный пример — полностью использовался на ПРОД серверах компании где работаю.

Мне данные решения помогли и они полностью рабочие. Еси будут еще идеи чем можно дополнить — обязательно дополню данную тему.

Вот и все, статья «Удалить все Jenkins offline nodes/slaves в Unix/Linux» завершена.

The post Удалить все Jenkins offline nodes/slaves в Unix/Linux first appeared on linux-notes.org.]]>
https://linux-notes.org/udalit-vse-jenkins-offline-nodes-slaves-v-unix-linux/feed/ 0
Page_c76a3fcf https://linux-notes.org/ustanovka-concourse-ci-v-unix-linux/ https://linux-notes.org/ustanovka-concourse-ci-v-unix-linux/#respond Wed, 26 Jun 2019 14:04:06 +0000 http://linux-notes.org/?p=15547 Concourse CI - это современная система непрерывной интеграции, которая автоматизирует конвейеры тестирования.

The post Установка Concourse CI в Unix/Linux first appeared on linux-notes.org.]]>

Concourse CI — это современная система непрерывной интеграции, которая автоматизирует конвейеры тестирования.

Он очень самоуверен в нескольких вещах:

  • Идемпотентность,
  • Неизменность,
  • Имеет декларативный конфиг,
  • Stateless workers (воркеры без сохранения состояния),
  • Воспроизводимые сборки.

Пайплайн выглядит следующим образом:

Перейдем к установке.

Установка Concourse CI в Unix/Linux

Concourse можно установить несколькими способами. Приведу примеры установок.

Установка Concourse CI используя бинарный файл

Скачиваем архивы (для MacOS):

$ wget https://github.com/concourse/concourse/releases/download/v5.3.0/concourse-5.3.0-darwin-amd64.tgz && wget https://github.com/concourse/concourse/releases/download/v5.3.0/fly-5.3.0-darwin-amd64.tgz

Скачиваем архивы (для Linux):

$ wget https://github.com/concourse/concourse/releases/download/v5.3.0/concourse-5.3.0-linux-amd64.tgz && wget https://github.com/concourse/concourse/releases/download/v5.3.0/fly-5.3.0-linux-amd64.tgz

Замините архивы для своих целей (версию или тип ОС).

Распаковываем:

$ tar -xfvz concourse-*.tgz -C /usr/local
$ tar -xfvz fly-*.tgz -C /usr/local

ЗАМЕЧАНИЕ: Нужно добавить PATH для использования данных тулов (если этого не было сделано). Например, у меня такой:

export PATH="$PATH:/usr/local/bin:/usr/local/sbin:/opt/X11/bin:/usr/local/git/bin:/usr/local/go/bin:/sbin:/bin:/opt/local/bin:/opt/local/sbin"

Добавил я его в:

$ vim ~/.bash_profile 

Чтобы настройка применилась, выполняем:

$ source ~/.bash_profile 

или:

$ . ~/.bash_profile 

Вот и вся установка.

Установка Concourse CI используя исходный код

Скачаем архив:

$ wget -O concourse-latest.tar.gz https://github.com/concourse/concourse/archive/v5.3.0.tar.gz

Распаковываем:

$ tar xfvz concourse-latest.tar.gz

В папке concourse-5.3.0 лежит исходный код ( на golang). Можно перейти в папку и скомпилировать:

$ cd concourse-*

PS: Компилировать я не стал (не было необходимости). Использую докер для своих реализаций. Будет время, дополню материал….

Возможно, кто-то хочет помогать мне в этом — я буду не против.

Установка Concourse CI используя Docker

Ставим Docker, docker-compose, статьи вот тут:

Установка Docker на CentOS/RedHat/Fedora

Установка Docker на Debian/Ubuntu

Установка docker-compose в Unix/Linux

Работа с docker + docker-compose в Unix/Linux

Другие полезные статьи:

Запустить Docker контейнер от пользователя в Unix/Linux

Создание docker контейнера в Unix/Linux

Остановить/Удалить все Docker контейнеры/images

Запуск docker контейнеров в Unix/Linux

Запустить bash/SSH в контейнере с Docker

Использование статического IP адреса в docker-compose

Работа с сетью (Networking) в Docker

Работа с томами (Volumes) в Docker

Работа с логами (Logs) в Docker

Приступим….

Для консоурса, нужны 3 сервиса, можно получить помощь так:

$ docker run -t concourse/concourse --help
$ docker run -t concourse/concourse web --help
$ docker run -t concourse/concourse worker --help

Понять что и как работает и потом запустить. Честно говоря, я не использовал данный вариант, я использовал установку через docker-compose. Скачиваем файл:

$ wget https://concourse-ci.org/docker-compose.yml

Запускаем билд консоурса:

$ docker-compose up
Creating docs_concourse-db_1 ... done
Creating docs_concourse_1    ... done

PS: Можно скачать архив (вытянуть все через git):

$ git clone https://github.com/concourse/concourse-docker.git && cd concourse-docker

Можно сгенерировать ключи:

$ ./keys/generate
Unable to find image 'concourse/concourse:latest' locally
latest: Pulling from concourse/concourse
6abc03819f3e: Already exists
05731e63f211: Already exists
0bd67c50d6be: Already exists
f81c432f3eb1: Pull complete
28ed15a59bee: Pull complete
Digest: sha256:df37aa611cc0f75fdd400665a0c422211974cbfe09d3cca6311cc90b17a079e2
Status: Downloaded newer image for concourse/concourse:latest
wrote private key to /keys/session_signing_key
wrote private key to /keys/tsa_host_key
wrote ssh public key to /keys/tsa_host_key.pub
wrote private key to /keys/worker_key
wrote ssh public key to /keys/worker_key.pub

Ну и потом выполнить запуск сервиса:

$ docker-compose up -d
Creating network "concourse-docker_default" with the default driver
Pulling db (postgres:)...
latest: Pulling from library/postgres
fc7181108d40: Pull complete
81cfa12d39e9: Pull complete
793d305ca761: Pull complete
41e3ced3a2aa: Pull complete
a300bc9d5405: Pull complete
3c6a5c3830ed: Pull complete
fb8c79b24338: Pull complete
fcda1144379f: Pull complete
476a22a819cc: Pull complete
78b36b49bb24: Pull complete
6a096a28591f: Pull complete
c0cb89b5217b: Pull complete
778f1469a309: Pull complete
7c4413fcad87: Pull complete
Digest: sha256:1518027f4aaee49b836c5cf4ece1b4a16bdcd820af873402e19e1cc181c1aff2
Status: Downloaded newer image for postgres:latest
Creating concourse-docker_db_1 ... done
Creating concourse-docker_web_1 ... done
Creating concourse-docker_worker_1 ... done

Чтобы проверить старталули ли сервисы, проверяем:

$ docker ps

Поглядеть логи, можно так:

$ docker-compose logs -f

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

Установка Concourse CI используя BOSH

Пока, не было обходимости в этой настройке…

Установка Concourse CI используя Kubernetes

Установка k8s описана тут:

Установка Kubernetes в Unix/Linux

Установка Kubernetes кластера в Unix/Linux

Ставим утилиту через чарт:

$ helm install --name concourse-ci stable/concourse

Удалить можно так:

$ helm delete concourse-ci

На этом у меня закончилось тестирование concourse-ci. Перейдем к использованию.

Настройка Concourse CI в Unix/Linux

Я установил Concourse через docker-compose. После установки данной утилиты, сервис должен работать по 127.0.0.1:8080 УРЛ. Выглядит это так:

Как видно с экрана, можно выполнить вход в панель, для этого нажать нужно на «Login». Логин/пароль — test и test.

Fly — это утилита командной строки, которая позволяет управлять всем вашим кластером ConcourseCI из терминала. Ставится на ваш рабочий компьютер и упралвяет сервером. С ней вы можете совершать все необходимые операции и обслуживать кластер.

Скачиваем утилиту fly:

  • Если вы сиспользуете MacOS:
$ wget -O /usr/local/bin/fly --user=test --password=test "http://localhost:8080/api/v1/cli?arch=amd64&platform=darwin"
  • Если вы сиспользуете Linux:

$ wget -O /usr/local/bin/fly --user=test --password=test "http://localhost:8080/api/v1/cli?arch=amd64&platform=linux"

После скачивания файла, выставим права на исполнение данного бинарника:

$ chmod +x /usr/local/bin/fly

Получить помошь, можно:

$ fly --help

Выполним вход в сервис через утилиту fly:

$ fly -t ci login -c http://127.0.0.1:8080 -u test -p test
logging in to team 'main'


target saved

Смотрим какой таргет используем сейчас:

$ fly targets
name  url                    team  expiry
ci    http://127.0.0.1:8080  main  Sat, 15 Jun 2019 13:05:43 UTC

Проверить статус можно так:

$ fly -t ci status
logged in successfully

Смотрим информацию по таргету:

$ fly -t ci userinfo
username  team/role
test      main/owner

Чтобы выйти:

$ fly -t ci logout

Чтобы очистить свой токен для всех targets:

$ fly logout -a

Чтобы изменить имя, команду или URL-адрес target-а, выполните:

$ fly -t ci edit-target \
    --target-name new-name \
    --concourse-url http://127.0.0.1:8080 \
    --team-name my-team
Updated target: ci

И проверяем что вышло:

$ fly targets
name      url                    team     expiry
new-name  http://127.0.0.1:8080  my-team  Sat, 15 Jun 2019 13:05:43 UTC

Удалить таргет можно следующим образом:

$ fly -t new-name delete-target

Чтобы удалить все таргеты, выполните:

$ fly delete-target -a

Время от времени утилиты обновляетсяи выходят релизы, чтобы обновить локальную версию тулы можно использовать:

$ fly -t new-name sync
version 5.3.0 already matches; skipping

Работа с локальными юзерами (Добавление/Удаление) в concourse

Все операции с юзерами выполняються на web ноде, т.к я использую докер, для добавление юзеров, стоит открыть:

$ vim docker-compose.yml

И привести к виду:

CONCOURSE_ADD_LOCAL_USER: test:test,your_user:your_password
CONCOURSE_MAIN_TEAM_LOCAL_USER: test,your_user

Ну и потом, запустить:

$ docker-compose up -d

Проверим:

$ fly --target ci login --username=captain --password=captain --team-name main
logging in to team 'main'


target saved

Работа с team-ами в concourse

Пример создания тимы:

$ fly -t ci set-team --team-name new-team \
 >   --local-user captain
setting team: new-team

role owner:
  users:
  - local:captain

  groups:
    none

apply team configuration? [yN]: y
team created

Логинимся в тиму:

$ fly --target ci login -n new-team --concourse-url http://localhost:8080 -k -u captain  -p captain

Чтобы посмотреть team-ы:

$ fly -t ci teams
name
main
new-team

Или, с более подробной инфой:

$ fly -t ci teams -d
name/role       users                     groups
main/owner      local:test,local:captain  none
new-team/owner  local:captain             none

Чтобы посмотреть найтройки тимы, выполните:

$ fly -t ci get-team -n new-team
name/role       users          groups
new-team/owner  local:captain  none

Для переименования тимы, можно заюзать:

$ fly -t ci rename-team --old-name new-team --new-name cool-team
Team successfully renamed to cool-team

Смотрим что вышло:

$ fly -t ci teams
name
cool-team
main

Для удаления тимы, служит команда:

$ fly -t ci destroy-team --team-name cool-team
!!! this will remove all data for team `cool-team`

please type the team name to confirm: cool-team

`cool-team` deleted

Приступим к пайплайнам.

Конфигурация Concourse CI pipeline-ов в Unix/Linux

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

Логинимся:

$ fly -t ci login -c http://127.0.0.1:8080 -u captain -p captain
logging in to team 'main'


target saved

Чтобы просмотреть список настроенных конвейеров и их приостановленное состояние, выполните:

$ fly -t ci pipelines
name  paused  public

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

Чтобы переименовать конвейер, запустите:

$ fly -t ci rename-pipeline \
    --old-name my-pipeline \
    --new-name my-cool-pipeline

Чтобы приостановить конвейер, запустите:

$ fly -t ci pause-pipeline --pipeline pipeline_name_here

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

Чтобы снять с паузы пайплайн, запустите:

$ fly -t ci unpause-pipeline --pipeline pipeline_name_here

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

$ fly -t ci expose-pipeline --pipeline pipeline_name_here

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

$ fly -t ci hide-pipeline --pipeline pipeline_name_here

Fly можно использовать для получения и обновления конфигурации ваших конвейеров. Например, чтобы получить текущую конфигурацию вашего конвейера и вывести ее в STDOUT, выполните следующее:

$ fly -t ci get-pipeline --pipeline pipeline_name_here

PS: чтобы получить вывод в JSON вместо YAML, вы можете использовать аргумент -j или —json. Это может быть полезно при проверке вашей конфигурации с утилитой jq.

Чтобы остановить работу конвейера и удалить все данные, собранные конвейером, включая историю сборки и собранные версии, можно выполнив:

$ fly -t ci destroy-pipeline --pipeline pipeline_name_here

Чтобы настроить порядок трубопроводов, выполните:

$ fly -t ci order-pipelines \
    --pipeline pipeline-1 \
    --pipeline pipeline-2 \
    --pipeline pipeline-3

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

Для валидации, можно использовать:

$ fly validate-pipeline --config your_pipeline_name_here.yml
looks good

Так же, можно выполнить команду и проверить форматинг:

$ fly format-pipeline --config your_pipeline_name_here.yml

Перейдем к примеру(ам). У Concourse еет графического интерфейса для настройки пайплайнов и вместо этого, пайплайны настраиваются как декларативные YAML файлы. Выглядит это так:

jobs:
- name: hello-world
  plan:
  - task: say-hello
    config:
      platform: linux
      image_resource:
        type: docker-image
        source: {repository: alpine}
      run:
        path: echo
        args: ["Hello, world!"]

Сохраните данный вывод в файл (например: hello.yml) и потом, запустите:

$ fly -t ci set-pipeline -p hello -c hello.yml
jobs:
  job hello-world has been added:
+ name: hello-world
+ plan:
+ - task: say-hello
+   config:
+     platform: linux
+     image_resource:
+       type: docker-image
+       source:
+         repository: alpine
+     run:
+       path: echo
+       args:
+       - Hello, world!

apply configuration? [yN]: y
pipeline created!
you can view your pipeline here: http://127.0.0.1:8080/teams/main/pipelines/hello

the pipeline is currently paused. to unpause, either:
  - run the unpause-pipeline command:
    fly -t ci unpause-pipeline -p hello
  - click play next to the pipeline in the web ui

Написало что нужно анпаузить проект:

$ fly -t ci unpause-pipeline -p hello
unpaused 'hello'

Открываем веб-линку с консоурсом и смотрим что вышло. Написание пайплайнов будет позже. Я дополню данную статью или создам новую.

Вот и все, статья «Установка Concourse CI в Unix/Linux» завершена.

The post Установка Concourse CI в Unix/Linux first appeared on linux-notes.org.]]>
https://linux-notes.org/ustanovka-concourse-ci-v-unix-linux/feed/ 0
Page_c76a3fcf https://linux-notes.org/ustanovka-gitlab-runner-a-v-unix-linux/ https://linux-notes.org/ustanovka-gitlab-runner-a-v-unix-linux/#respond Tue, 12 Feb 2019 17:39:57 +0000 https://linux-notes.org/?p=16583 GitLab Runner — это агент, который собственно и занимается выполнением инструкций из специального файла .gitlab-ci.yml

The post Установка GitLab-Runner-а в Unix/Linux first appeared on linux-notes.org.]]>

GitLab Runner — это агент, который собственно и занимается выполнением инструкций из специального файла .gitlab-ci.yml

Полезное чтиво:

Установка GitLab сервер в Unix/Linux

Установка GitLab-Runner-а в Unix/Linux

Сейчас я расскажу как можно настроить gitlab-runner на разные Unix/Linux ОС. Но для начала, запустим сервисы.

Установка GitLab-Runner-а в Mac OS X

Скачиваем бинарник:

$ sudo curl --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-darwin-amd64

Конечно же, выставить права нужно:

$ sudo chmod +x /usr/local/bin/gitlab-runner

После того как выставили права, необходимо зарегестрировать гитлаб-ранер, например, это можно сделать следующим образом:

$ gitlab-runner register --url=http://gitlab.local/ --registration-token=xyLWaXwd15xy6VxU7HUV --non-interactive=true --locked=false --name=gitlab-runner-macosx --executor=docker --docker-image=docker:stable --docker-volumes=/var/run/docker.sock:/var/run/docker.sock

Где:

  • gitlab-runner — Утилита.
  • register — Опция для регистрации гитлаб-раннера.
  • —url=http://gitlab.local — УРЛ где базируется гитлаб-сервер.
  • —registration-token=xyLWaXwd15xy6VxU7HUV — Токен для регистрации раннера. Можно найти в админ-панели гитлаб-сервера («Admin Area»-> «Runners»).
  • —non-interactive=true — Не выводить вывод на экран.
  • —locked=false — Не лочить ранер.
  • —name=gitlab-runner-macosx — Собственно имя с которым будет регистрироватся гитлаб-раннер.
  • —executor=docker — Выбираем экзекутера (docker или shell). У меня docker.
  • —docker-image=docker:stable — Выбираем докер имедж.
  • —docker-volumes=/var/run/docker.sock:/var/run/docker.sock — Пробросил докер сокет.

Для помощи есть команда:

$ gitlab-runner register -h
Runtime platform                                    arch=amd64 os=linux pid=137 revision=8bb608ff version=11.7.0
NAME:
   gitlab-runner register - register a new runner

USAGE:
   gitlab-runner register [command options] [arguments...]

OPTIONS:
   -c value, --config value                              Config file (default: "/etc/gitlab-runner/config.toml") [$CONFIG_FILE]
   --tag-list value                                      Tag list [$RUNNER_TAG_LIST]
   -n, --non-interactive                                 Run registration unattended [$REGISTER_NON_INTERACTIVE]
   --leave-runner                                        Don't remove runner if registration fails [$REGISTER_LEAVE_RUNNER]
   -r value, --registration-token value                  Runner's registration token [$REGISTRATION_TOKEN]
   --run-untagged                                        Register to run untagged builds; defaults to 'true' when 'tag-list' is empty [$REGISTER_RUN_UNTAGGED]
   --locked                                              Lock Runner for current project, defaults to 'true' [$REGISTER_LOCKED]
   --maximum-timeout value                               What is the maximum timeout (in seconds) that will be set for job when using this Runner (default: "0") [$REGISTER_MAXIMUM_TIMEOUT]
   --paused                                              Set Runner to be paused, defaults to 'false' [$REGISTER_PAUSED]
   --name value, --description value                     Runner name (default: "7e2764bb1d36") [$RUNNER_NAME]
   --limit value                                         Maximum number of builds processed by this runner (default: "0") [$RUNNER_LIMIT]
   --output-limit value                                  Maximum build trace size in kilobytes (default: "0") [$RUNNER_OUTPUT_LIMIT]
   --request-concurrency value                           Maximum concurrency for job requests (default: "0") [$RUNNER_REQUEST_CONCURRENCY]
   -u value, --url value                                 Runner URL [$CI_SERVER_URL]
   -t value, --token value                               Runner token [$CI_SERVER_TOKEN]
   --tls-ca-file value                                   File containing the certificates to verify the peer when using HTTPS [$CI_SERVER_TLS_CA_FILE]
   --tls-cert-file value                                 File containing certificate for TLS client auth when using HTTPS [$CI_SERVER_TLS_CERT_FILE]
   --tls-key-file value                                  File containing private key for TLS client auth when using HTTPS [$CI_SERVER_TLS_KEY_FILE]
   --executor value                                      Select executor, eg. shell, docker, etc. [$RUNNER_EXECUTOR]
   --builds-dir value                                    Directory where builds are stored [$RUNNER_BUILDS_DIR]
   --cache-dir value                                     Directory where build cache is stored [$RUNNER_CACHE_DIR]
   --clone-url value                                     Overwrite the default URL used to clone or fetch the git ref [$CLONE_URL]
   --env value                                           Custom environment variables injected to build environment [$RUNNER_ENV]
   --pre-clone-script value                              Runner-specific command script executed before code is pulled [$RUNNER_PRE_CLONE_SCRIPT]
   --pre-build-script value                              Runner-specific command script executed after code is pulled, just before build executes [$RUNNER_PRE_BUILD_SCRIPT]
   --post-build-script value                             Runner-specific command script executed after code is pulled and just after build executes [$RUNNER_POST_BUILD_SCRIPT]
   --shell value                                         Select bash, cmd or powershell [$RUNNER_SHELL]
   --ssh-user value                                      User name [$SSH_USER]
   --ssh-password value                                  User password [$SSH_PASSWORD]
   --ssh-host value                                      Remote host [$SSH_HOST]
   --ssh-port value                                      Remote host port [$SSH_PORT]
   --ssh-identity-file value                             Identity file to be used [$SSH_IDENTITY_FILE]
   --docker-host value                                   Docker daemon address [$DOCKER_HOST]
   --docker-cert-path value                              Certificate path [$DOCKER_CERT_PATH]
   --docker-tlsverify                                    Use TLS and verify the remote [$DOCKER_TLS_VERIFY]
   --docker-hostname value                               Custom container hostname [$DOCKER_HOSTNAME]
   --docker-image value                                  Docker image to be used [$DOCKER_IMAGE]
   --docker-runtime value                                Docker runtime to be used [$DOCKER_RUNTIME]
   --docker-memory value                                 Memory limit (format: <number>[<unit>]). Unit can be one of b, k, m, or g. Minimum is 4M. [$DOCKER_MEMORY]
   --docker-memory-swap value                            Total memory limit (memory + swap, format: <number>[<unit>]). Unit can be one of b, k, m, or g. [$DOCKER_MEMORY_SWAP]
   --docker-memory-reservation value                     Memory soft limit (format: <number>[<unit>]). Unit can be one of b, k, m, or g. [$DOCKER_MEMORY_RESERVATION]
   --docker-cpuset-cpus value                            String value containing the cgroups CpusetCpus to use [$DOCKER_CPUSET_CPUS]
   --docker-cpus value                                   Number of CPUs [$DOCKER_CPUS]
   --docker-dns value                                    A list of DNS servers for the container to use [$DOCKER_DNS]
   --docker-dns-search value                             A list of DNS search domains [$DOCKER_DNS_SEARCH]
   --docker-privileged                                   Give extended privileges to container [$DOCKER_PRIVILEGED]
   --docker-disable-entrypoint-overwrite                 Disable the possibility for a container to overwrite the default image entrypoint [$DOCKER_DISABLE_ENTRYPOINT_OVERWRITE]
   --docker-userns value                                 User namespace to use [$DOCKER_USERNS_MODE]
   --docker-cap-add value                                Add Linux capabilities [$DOCKER_CAP_ADD]
   --docker-cap-drop value                               Drop Linux capabilities [$DOCKER_CAP_DROP]
   --docker-oom-kill-disable                             Do not kill processes in a container if an out-of-memory (OOM) error occurs [$DOCKER_OOM_KILL_DISABLE]
   --docker-security-opt value                           Security Options [$DOCKER_SECURITY_OPT]
   --docker-devices value                                Add a host device to the container [$DOCKER_DEVICES]
   --docker-disable-cache                                Disable all container caching [$DOCKER_DISABLE_CACHE]
   --docker-volumes value                                Bind mount a volumes [$DOCKER_VOLUMES]
   --docker-volume-driver value                          Volume driver to be used [$DOCKER_VOLUME_DRIVER]
   --docker-cache-dir value                              Directory where to store caches [$DOCKER_CACHE_DIR]
   --docker-extra-hosts value                            Add a custom host-to-IP mapping [$DOCKER_EXTRA_HOSTS]
   --docker-volumes-from value                           A list of volumes to inherit from another container [$DOCKER_VOLUMES_FROM]
   --docker-network-mode value                           Add container to a custom network [$DOCKER_NETWORK_MODE]
   --docker-links value                                  Add link to another container [$DOCKER_LINKS]
   --docker-services value                               Add service that is started with container [$DOCKER_SERVICES]
   --docker-wait-for-services-timeout value              How long to wait for service startup (default: "0") [$DOCKER_WAIT_FOR_SERVICES_TIMEOUT]
   --docker-allowed-images value                         Whitelist allowed images [$DOCKER_ALLOWED_IMAGES]
   --docker-allowed-services value                       Whitelist allowed services [$DOCKER_ALLOWED_SERVICES]
   --docker-pull-policy value                            Image pull policy: never, if-not-present, always [$DOCKER_PULL_POLICY]
   --docker-shm-size value                               Shared memory size for docker images (in bytes) (default: "0") [$DOCKER_SHM_SIZE]
   --docker-tmpfs value                                  A toml table/json object with the format key=values. When set this will mount the specified path in the key as a tmpfs volume in the main container, using the options specified as key. For the supported options, see the documentation for the unix 'mount' command (default: "{}") [$DOCKER_TMPFS]
   --docker-services-tmpfs value                         A toml table/json object with the format key=values. When set this will mount the specified path in the key as a tmpfs volume in all the service containers, using the options specified as key. For the supported options, see the documentation for the unix 'mount' command (default: "{}") [$DOCKER_SERVICES_TMPFS]
   --docker-sysctls value                                Sysctl options, a toml table/json object of key=value. Value is expected to be a string. (default: "{}") [$DOCKER_SYSCTLS]
   --docker-helper-image value                           [ADVANCED] Override the default helper image used to clone repos and upload artifacts [$DOCKER_HELPER_IMAGE]
   --parallels-base-name value                           VM name to be used [$PARALLELS_BASE_NAME]
   --parallels-template-name value                       VM template to be created [$PARALLELS_TEMPLATE_NAME]
   --parallels-disable-snapshots                         Disable snapshoting to speedup VM creation [$PARALLELS_DISABLE_SNAPSHOTS]
   --virtualbox-base-name value                          VM name to be used [$VIRTUALBOX_BASE_NAME]
   --virtualbox-base-snapshot value                      Name or UUID of a specific VM snapshot to clone [$VIRTUALBOX_BASE_SNAPSHOT]
   --virtualbox-disable-snapshots                        Disable snapshoting to speedup VM creation [$VIRTUALBOX_DISABLE_SNAPSHOTS]
   --cache-type value                                    Select caching method [$CACHE_TYPE]
   --cache-path value                                    Name of the path to prepend to the cache URL [$CACHE_PATH]
   --cache-shared                                        Enable cache sharing between runners. [$CACHE_SHARED]
   --cache-s3-server-address value                       A host:port to the used S3-compatible server [$CACHE_S3_SERVER_ADDRESS]
   --cache-s3-access-key value                           S3 Access Key [$CACHE_S3_ACCESS_KEY]
   --cache-s3-secret-key value                           S3 Secret Key [$CACHE_S3_SECRET_KEY]
   --cache-s3-bucket-name value                          Name of the bucket where cache will be stored [$CACHE_S3_BUCKET_NAME]
   --cache-s3-bucket-location value                      Name of S3 region [$CACHE_S3_BUCKET_LOCATION]
   --cache-s3-insecure                                   Use insecure mode (without https) [$CACHE_S3_INSECURE]
   --cache-gcs-access-id value                           ID of GCP Service Account used to access the storage [$CACHE_GCS_ACCESS_ID]
   --cache-gcs-private-key value                         Private key used to sign GCS requests [$CACHE_GCS_PRIVATE_KEY]
   --cache-gcs-credentials-file value                    File with GCP credentials, containing AccessID and PrivateKey [$GOOGLE_APPLICATION_CREDENTIALS]
   --cache-gcs-bucket-name value                         Name of the bucket where cache will be stored [$CACHE_GCS_BUCKET_NAME]
   --cache-s3-cache-path value                           Name of the path to prepend to the cache URL. DEPRECATED [$S3_CACHE_PATH]
   --cache-cache-shared                                  Enable cache sharing between runners. DEPRECATED
   --machine-idle-nodes value                            Maximum idle machines (default: "0") [$MACHINE_IDLE_COUNT]
   --machine-idle-time value                             Minimum time after node can be destroyed (default: "0") [$MACHINE_IDLE_TIME]
   --machine-max-builds value                            Maximum number of builds processed by machine (default: "0") [$MACHINE_MAX_BUILDS]
   --machine-machine-driver value                        The driver to use when creating machine [$MACHINE_DRIVER]
   --machine-machine-name value                          The template for machine name (needs to include %s) [$MACHINE_NAME]
   --machine-machine-options value                       Additional machine creation options [$MACHINE_OPTIONS]
   --machine-off-peak-periods value                      Time periods when the scheduler is in the OffPeak mode [$MACHINE_OFF_PEAK_PERIODS]
   --machine-off-peak-timezone value                     Timezone for the OffPeak periods (defaults to Local) [$MACHINE_OFF_PEAK_TIMEZONE]
   --machine-off-peak-idle-count value                   Maximum idle machines when the scheduler is in the OffPeak mode (default: "0") [$MACHINE_OFF_PEAK_IDLE_COUNT]
   --machine-off-peak-idle-time value                    Minimum time after machine can be destroyed when the scheduler is in the OffPeak mode (default: "0") [$MACHINE_OFF_PEAK_IDLE_TIME]
   --kubernetes-host value                               Optional Kubernetes master host URL (auto-discovery attempted if not specified) [$KUBERNETES_HOST]
   --kubernetes-cert-file value                          Optional Kubernetes master auth certificate [$KUBERNETES_CERT_FILE]
   --kubernetes-key-file value                           Optional Kubernetes master auth private key [$KUBERNETES_KEY_FILE]
   --kubernetes-ca-file value                            Optional Kubernetes master auth ca certificate [$KUBERNETES_CA_FILE]
   --kubernetes-bearer_token_overwrite_allowed           Bool to authorize builds to specify their own bearer token for creation. [$KUBERNETES_BEARER_TOKEN_OVERWRITE_ALLOWED]
   --kubernetes-bearer_token value                       Optional Kubernetes service account token used to start build pods. [$KUBERNETES_BEARER_TOKEN]
   --kubernetes-image value                              Default docker image to use for builds when none is specified [$KUBERNETES_IMAGE]
   --kubernetes-namespace value                          Namespace to run Kubernetes jobs in [$KUBERNETES_NAMESPACE]
   --kubernetes-namespace_overwrite_allowed value        Regex to validate 'KUBERNETES_NAMESPACE_OVERWRITE' value [$KUBERNETES_NAMESPACE_OVERWRITE_ALLOWED]
   --kubernetes-privileged                               Run all containers with the privileged flag enabled [$KUBERNETES_PRIVILEGED]
   --kubernetes-cpu-limit value                          The CPU allocation given to build containers [$KUBERNETES_CPU_LIMIT]
   --kubernetes-memory-limit value                       The amount of memory allocated to build containers [$KUBERNETES_MEMORY_LIMIT]
   --kubernetes-service-cpu-limit value                  The CPU allocation given to build service containers [$KUBERNETES_SERVICE_CPU_LIMIT]
   --kubernetes-service-memory-limit value               The amount of memory allocated to build service containers [$KUBERNETES_SERVICE_MEMORY_LIMIT]
   --kubernetes-helper-cpu-limit value                   The CPU allocation given to build helper containers [$KUBERNETES_HELPER_CPU_LIMIT]
   --kubernetes-helper-memory-limit value                The amount of memory allocated to build helper containers [$KUBERNETES_HELPER_MEMORY_LIMIT]
   --kubernetes-cpu-request value                        The CPU allocation requested for build containers [$KUBERNETES_CPU_REQUEST]
   --kubernetes-memory-request value                     The amount of memory requested from build containers [$KUBERNETES_MEMORY_REQUEST]
   --kubernetes-service-cpu-request value                The CPU allocation requested for build service containers [$KUBERNETES_SERVICE_CPU_REQUEST]
   --kubernetes-service-memory-request value             The amount of memory requested for build service containers [$KUBERNETES_SERVICE_MEMORY_REQUEST]
   --kubernetes-helper-cpu-request value                 The CPU allocation requested for build helper containers [$KUBERNETES_HELPER_CPU_REQUEST]
   --kubernetes-helper-memory-request value              The amount of memory requested for build helper containers [$KUBERNETES_HELPER_MEMORY_REQUEST]
   --kubernetes-pull-policy value                        Policy for if/when to pull a container image (never, if-not-present, always). The cluster default will be used if not set [$KUBERNETES_PULL_POLICY]
   --kubernetes-node-selector value                      A toml table/json object of key=value. Value is expected to be a string. When set this will create pods on k8s nodes that match all the key=value pairs. (default: "{}")
   --kubernetes-image-pull-secrets value                 A list of image pull secrets that are used for pulling docker image [$KUBERNETES_IMAGE_PULL_SECRETS]
   --kubernetes-helper-image value                       [ADVANCED] Override the default helper image used to clone repos and upload artifacts [$KUBERNETES_HELPER_IMAGE]
   --kubernetes-terminationGracePeriodSeconds value      Duration after the processes running in the pod are sent a termination signal and the time when the processes are forcibly halted with a kill signal. (default: "0") [$KUBERNETES_TERMINATIONGRACEPERIODSECONDS]
   --kubernetes-poll-interval value                      How frequently, in seconds, the runner will poll the Kubernetes pod it has just created to check its status (default: "0") [$KUBERNETES_POLL_INTERVAL]
   --kubernetes-poll-timeout value                       The total amount of time, in seconds, that needs to pass before the runner will timeout attempting to connect to the pod it has just created (useful for queueing more builds that the cluster can handle at a time) (default: "0") [$KUBERNETES_POLL_TIMEOUT]
   --kubernetes-pod-labels value                         A toml table/json object of key-value. Value is expected to be a string. When set, this will create pods with the given pod labels. Environment variables will be substituted for values here. (default: "{}")
   --kubernetes-service-account value                    Executor pods will use this Service Account to talk to kubernetes API [$KUBERNETES_SERVICE_ACCOUNT]
   --kubernetes-service_account_overwrite_allowed value  Regex to validate 'KUBERNETES_SERVICE_ACCOUNT' value [$KUBERNETES_SERVICE_ACCOUNT_OVERWRITE_ALLOWED]
   --kubernetes-pod-annotations value                    A toml table/json object of key-value. Value is expected to be a string. When set, this will create pods with the given annotations. Can be overwritten in build with KUBERNETES_POD_ANNOTATION_* varialbes (default: "{}")
   --kubernetes-pod_annotations_overwrite_allowed value  Regex to validate 'KUBERNETES_POD_ANNOTATIONS_*' values [$KUBERNETES_POD_ANNOTATIONS_OVERWRITE_ALLOWED]

Установим Runner как сервис и запустим его:

$ cd ~
$ gitlab-runner install
$ gitlab-runner start

Для обновления сервиса, нужно выполнить все теже действия что я описывал ранее, но перед этим, стоит остановить службу.

Вот и все использование.

Установка GitLab-Runner-а в GNU/Linux

Скачиваем бинарник в зависимости от разрядности и архитектуры ОС.

Если у вас, Linux x86-64:

$ sudo wget -O /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64

Если у вас, Linux x86:

$ sudo wget -O /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-386

Если у вас, Linux arm:

$ sudo wget -O /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-arm

Конечно же, выставить права нужно:

$ sudo chmod +x /usr/local/bin/gitlab-runner

При желании, если вы хотите использовать Docker, установите Docker с:

$ curl -sSL https://get.docker.com/ | sh

Создайте пользователя GitLab CI:

$ sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash

После того как выставили права, необходимо установить Runner как сервис и запустить его:

$ sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
$ sudo gitlab-runner start

Потом, зарегестрировать гитлаб-ранер, например, это можно сделать следующим образом:

$ gitlab-runner register --url=http://gitlab.local/ --registration-token=xyLWaXwd15xy6VxU7HUV --non-interactive=true --locked=false --name=gitlab-runner --executor=docker --docker-image=docker:stable --docker-volumes=/var/run/docker.sock:/var/run/docker.sock

Где:

  • gitlab-runner — Утилита.
  • register — Опция для регистрации гитлаб-раннера.
  • —url=http://gitlab.local — УРЛ где базируется гитлаб-сервер.
  • —registration-token=xyLWaXwd15xy6VxU7HUV — Токен для регистрации раннера. Можно найти в админ-панели гитлаб-сервера («Admin Area»-> «Runners»).
  • —non-interactive=true — Не выводить вывод на экран.
  • —locked=false — Не лочить ранер.
  • —name=gitlab-runner-linux — Собственно имя с которым будет регистрироватся гитлаб-раннер.
  • —executor=docker — Выбираем экзекутера (docker или shell). У меня docker.
  • —docker-image=docker:stable — Выбираем докер имедж.
  • —docker-volumes=/var/run/docker.sock:/var/run/docker.sock — Пробросил докер сокет.

Для обновления сервиса, нужно выполнить все теже действия что я описывал ранее, но перед этим, стоит остановить службу.

PS: Конечно если кто-то привык устанавливать программы через пакеты, то можно установить гитлаб-раннер через паркет. Приведу пару примеров:

Для Debian или Ubuntu:

$ wget https://s3.amazonaws.com/gitlab-runner-downloads/master/deb/gitlab-runner_i386.deb
$ wget https://s3.amazonaws.com/gitlab-runner-downloads/master/deb/gitlab-runner_amd64.deb
$ wget https://s3.amazonaws.com/gitlab-runner-downloads/master/deb/gitlab-runner_armel.deb
$ wget https://s3.amazonaws.com/gitlab-runner-downloads/master/deb/gitlab-runner_armhf.deb

А чтобы установить, можно выполнить:

$ dpkg -i gitlab-runner_386.deb

Для RedHat или CentOS:

$ wget https://s3.amazonaws.com/gitlab-runner-downloads/master/rpm/gitlab-runner_i686.rpm
$ wget https://s3.amazonaws.com/gitlab-runner-downloads/master/rpm/gitlab-runner_amd64.rpm
$ wget https://s3.amazonaws.com/gitlab-runner-downloads/master/rpm/gitlab-runner_arm.rpm
$ wget https://s3.amazonaws.com/gitlab-runner-downloads/master/rpm/gitlab-runner_armhf.rpm

Установить:

$ rpm -i gitlab-runner_386.rpm

PS: Если у вас проблемы с ссылками, попробуйте использовать http/https (В зависимости от того что используете на данный момент).

Вот и все использование.

Установка GitLab-Runner-а в FreeBSD

Не было необходимости!

Установка GitLab-Runner-а через docker контейнер в Unix/Linux

Можно запустить контейнер, например следующим образом:

$ docker run -d --name gitlab-runner --restart always gitlab/gitlab-runner:latest

Или:

$ docker run -d --name gitlab-runner --restart always \
   -v /srv/gitlab-runner/config:/etc/gitlab-runner \
   -v /var/run/docker.sock:/var/run/docker.sock \
   gitlab/gitlab-runner:latest

Но после создания контейнера, стоит на него зайти:

$ docker exec -ti -u root gitlab-runner bash

И запустить регистрацию, я ее описывал ранее несколько раз.

Установка GitLab-Runner-а через Kubernetes

Не было обходимости пока еще.

Вот и все, статья «Установка GitLab-Runner-а в Unix/Linux» завершена.

The post Установка GitLab-Runner-а в Unix/Linux first appeared on linux-notes.org.]]>
https://linux-notes.org/ustanovka-gitlab-runner-a-v-unix-linux/feed/ 0
Page_c76a3fcf https://linux-notes.org/rabota-s-aws-elasticache-i-terraform-v-unix-linux/ https://linux-notes.org/rabota-s-aws-elasticache-i-terraform-v-unix-linux/#respond Sun, 25 Feb 2018 06:43:30 +0000 http://linux-notes.org/?p=15258 Работа с AWS elasticache и Terraform в Unix/Linux Amazon ElastiCache – это веб-сервис, упрощающий развертывание и масштабирование в облаке хранилища или кэша в памяти, а также управление ими. Сервис повышает производительность интернет-приложений, позволяя получать информацию не только из баз данных, размещенных на дисках, но и из управляемых хранилищ данных в памяти, которые работают быстрее и […]

The post Работа с AWS elasticache и Terraform в Unix/Linux first appeared on linux-notes.org.]]>

Работа с AWS elasticache и Terraform в Unix/Linux

Amazon ElastiCache – это веб-сервис, упрощающий развертывание и масштабирование в облаке хранилища или кэша в памяти, а также управление ими. Сервис повышает производительность интернет-приложений, позволяя получать информацию не только из баз данных, размещенных на дисках, но и из управляемых хранилищ данных в памяти, которые работают быстрее и безопаснее. Amazon ElastiCache поддерживает два сервиса с открытым исходным кодом для размещения данных в памяти.

  • Redis – быстрое хранилище данных и кэш в памяти с открытым исходным кодом. Amazon ElastiCache для Redis – это совместимый с Redis сервис хранения и кэширования данных в памяти, который обеспечивает простоту использования и функциональность Redis, а также доступность, надежность, масштабируемость и производительность, подходящие для самых требовательных приложений. Доступны как кластеры, состоящие из одного узла, так и кластеры, включающие до 15 сегментов, что обеспечивает масштабируемость до 3,55 ТиБ данных в памяти. Сервис поддерживает изменение размера работающего кластера, что позволяет без простоя масштабировать кластеры Redis в сторону увеличения или в сторону уменьшения и адаптироваться к изменяющемуся спросу. Сервис соответствует требованиям HIPAA и предлагает шифрование данных при передаче и хранении, а также Redis AUTH для безопасной передачи данных между узлами и надежного хранения конфиденциальных данных, таких как персональная информация (PII). ElastiCache для Redis – это полностью управляемый, масштабируемый и безопасный сервис. Он идеально подходит для высокопроизводительных примеров использования, таких как мобильные и интернет-приложения, приложения, используемые в здравоохранении и финансовой сфере, игры, рекламные технологии и «Интернет вещей».
  • Memcached – широко распространенная система кэширования объектов в памяти. Используемые в ElastiCache протоколы полностью совместимы с Memcached, поэтому все популярные инструменты, уже используемые в существующих средах Memcached, будут эффективно работать с этим сервисом.

Amazon ElastiCache автоматически определяет и заменяет вышедшие из строя узлы, снижая издержки, связанные с самоуправляемыми инфраструктурами, и формирует отказоустойчивую систему, которая сводит к минимуму риск перегрузок баз данных и его негативное влияние на время загрузки веб-сайтов и приложений. Благодаря интеграции с Amazon CloudWatch сервис Amazon ElastiCache предлагает расширенные возможности мониторинга ключевых показателей производительности, связанных с узлами Redis или Memcached.

С помощью Amazon ElastiCache вы сможете добавить уровень данных в памяти в свою инфраструктуру за считанные минуты, используя Консоль управления AWS.

Установка terraform в Unix/Linux

Установка крайне примитивная и я описал как это можно сделать тут:

Установка terraform в Unix/Linux

Так же, в данной статье, я создал скрипт для автоматической установки данного ПО. Он был протестирован на CentOS 6/7, Debian 8 и на Mac OS X. Все работает должным образом!

Чтобы получить помощь по использованию команд, выполните:

$ terraform
Usage: terraform [--version] [--help] <command> [args]

The available commands for execution are listed below.
The most common, useful commands are shown first, followed by
less common or more advanced commands. If you're just getting
started with Terraform, stick with the common commands. For the
other commands, please read the help and docs before usage.

Common commands:
    apply              Builds or changes infrastructure
    console            Interactive console for Terraform interpolations
    destroy            Destroy Terraform-managed infrastructure
    env                Workspace management
    fmt                Rewrites config files to canonical format
    get                Download and install modules for the configuration
    graph              Create a visual graph of Terraform resources
    import             Import existing infrastructure into Terraform
    init               Initialize a Terraform working directory
    output             Read an output from a state file
    plan               Generate and show an execution plan
    providers          Prints a tree of the providers used in the configuration
    push               Upload this Terraform module to Atlas to run
    refresh            Update local state file against real resources
    show               Inspect Terraform state or plan
    taint              Manually mark a resource for recreation
    untaint            Manually unmark a resource as tainted
    validate           Validates the Terraform files
    version            Prints the Terraform version
    workspace          Workspace management

All other commands:
    debug              Debug output management (experimental)
    force-unlock       Manually unlock the terraform state
    state              Advanced state management

Приступим к использованию!

Работа с AWS elasticache и Terraform в Unix/Linux

У меня есть папка terraform, в ней у меня будут лежать провайдеры с которыми я буду работать. Т.к в этом примере я буду использовать AWS, то создам данную папку и перейду в нее. Далее, в этой папке, стоит создать:

$ mkdir examples modules

В папке examples, я буду хранить так званые «плейбуки» для разварачивания различных служб, например — zabbix-server, grafana, web-серверы и так далее. В modules директории, я буду хранить все необходимые модули.

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

$  mkdir modules/elasticache

Переходим в нее:

$ cd modules/elasticache

Открываем файл:

$ vim elasticache.tf

В данный файл, вставляем:

#---------------------------------------------------
# Create AWS elasticache security group (SG)
#---------------------------------------------------
resource "aws_elasticache_security_group" "elasticache_sg" {
    # NOTE: ElastiCache Subnet Groups are only for use when working with an ElastiCache cluster inside of a VPC. If you are on EC2 Classic, see the ElastiCache Security Group resource.
    # NOTE: ElastiCache Security Groups are for use only when working with an ElastiCache cluster outside of a VPC. If you are using a VPC, see the ElastiCache Subnet Group resource.
    count                = "${length(var.security_group_names) !=0 && length(var.subnet_ids) ==0 ? 1 : 0}"

    name                 = "${lower(var.name)}-${var.engine}-sg-${lower(var.environment)}"
    description          = "Elasticache security group (SG) which managed by ${var.orchestration}"
    security_group_names = ["${var.security_group_names}"]
}
#---------------------------------------------------
# Create AWS elasticache subnet group
#---------------------------------------------------
resource "aws_elasticache_subnet_group" "elasticache_subnet_group" {
    # NOTE: ElastiCache Subnet Groups are only for use when working with an ElastiCache cluster inside of a VPC. If you are on EC2 Classic, see the ElastiCache Security Group resource.
    # NOTE: ElastiCache Security Groups are for use only when working with an ElastiCache cluster outside of a VPC. If you are using a VPC, see the ElastiCache Subnet Group resource.
    count       = "${length(var.subnet_ids) !=0 && length(var.security_group_names) ==0 ? 1 : 0}"

    name        = "${lower(var.name)}-${var.engine}-subnet-group-${lower(var.environment)}"
    description = "Elasticache subnet group which managed by ${var.orchestration}"
    subnet_ids  = ["${var.subnet_ids}"]
}
#---------------------------------------------------
# Create AWS elasticache parameter group
#---------------------------------------------------
resource "aws_elasticache_parameter_group" "elasticache_parameter_group" {
    count       = "${length(var.parameters_for_parameter_group) !=0 && var.create_custom_elasticache_parameter_group ? 1 : 0}"

    name        = "${lower(var.name)}-${var.engine}-parameter-group-${lower(var.environment)}"
    description = "Elasticache parameter group which managed by ${var.orchestration}"
    family      = "${var.elasticache_parameter_group_family[var.engine]}"

    parameter = ["${var.parameters_for_parameter_group}"]
}
#---------------------------------------------------
# Create AWS elasticache cluster
#---------------------------------------------------
resource "aws_elasticache_cluster" "elasticache_cluster" {
    count                   = "${var.num_cache_nodes ==1 && var.number_cluster_replicas ==0 && var.create_single_cluster ? 1 : 0}"

    cluster_id              = "${lower(var.name)}-${lower(var.engine)}-${lower(var.environment)}"
    engine                  = "${var.engine}"
    node_type               = "${var.node_type}"
    port                    = "${var.default_ports[var.engine]}"
    num_cache_nodes         = "${var.num_cache_nodes}"

    subnet_group_name       = "${var.subnet_group_name}"
    security_group_names    = ["${var.security_group_names_for_cluster}"]
    security_group_ids      = ["${var.security_group_ids}"]
    parameter_group_name    = "${var.parameter_group_name[var.engine] !="" ? var.parameter_group_name[var.engine] : aws_elasticache_parameter_group.elasticache_parameter_group.name}"

    maintenance_window          = "${var.maintenance_window}"
    snapshot_window             = "${var.snapshot_window}"
    #snapshot_retention_limit    = "${var.snapshot_retention_limit }"

    availability_zone       = "${var.availability_zone}"
    notification_topic_arn  = "${var.notification_topic_arn}"

    tags {
        Name            = "${lower(var.name)}-${var.engine}-cluster-${lower(var.environment)}"
        Environment     = "${var.environment}"
        Orchestration   = "${var.orchestration}"
        Createdby       = "${var.createdby}"
    }
}

#---------------------------------------------------
# Create AWS elasticache replication group
#---------------------------------------------------
resource "aws_elasticache_replication_group" "elasticache_replication_group" {
    # Redis Master with One Replica with 1 shard
    count                         = "${var.num_cache_nodes >1 && var.number_cluster_replicas ==1 && var.create_single_cluster !="true" ? 1 : 0}"

    replication_group_id          = "${lower(var.name)}-${lower(var.engine)}-${lower(var.environment)}"
    replication_group_description = "The ${var.engine} master with 1 replica shard which managed by ${var.orchestration}"
    node_type                     = "${var.node_type}"
    number_cache_clusters         = "${var.num_cache_nodes}"
    port                          = "${var.default_ports[var.engine]}"
    engine                        = "${var.engine}"
    engine_version                = "${var.engine_version}"

    availability_zones              = ["us-east-1a", "us-east-1c"]
    automatic_failover_enabled      = "${var.automatic_failover_enabled}"
    subnet_group_name               = "${var.subnet_group_name}"
    security_group_names            = ["${var.security_group_names_for_cluster}"]
    security_group_ids              = ["${var.security_group_ids}"]
    parameter_group_name            = "${var.parameter_group_name[var.engine] !="" ? var.parameter_group_name[var.engine] : aws_elasticache_parameter_group.elasticache_parameter_group.name}"
    at_rest_encryption_enabled      = "${var.at_rest_encryption_enabled}"
    transit_encryption_enabled      = "${var.transit_encryption_enabled}"
    #auth_token                      = "${var.auth_token}"

    auto_minor_version_upgrade  = "${var.auto_minor_version_upgrade}"
    snapshot_name               = "${var.snapshot_name}"
    maintenance_window          = "${var.maintenance_window}"
    snapshot_window             = "${var.snapshot_window}"
    snapshot_retention_limit    = "${var.snapshot_retention_limit}"
    apply_immediately           = "${var.apply_immediately}"

    notification_topic_arn  = "${var.notification_topic_arn}"

    tags {
        Name            = "${lower(var.name)}-${var.engine}-cluster-${lower(var.environment)}"
        Environment     = "${var.environment}"
        Orchestration   = "${var.orchestration}"
        Createdby       = "${var.createdby}"
    }
}

resource "aws_elasticache_replication_group" "elasticache_replication_group_2" {
    # Redis Master with One Replica for each nodes
    count                         = "${var.num_cache_nodes >1 && var.number_cluster_replicas ==2 && var.create_single_cluster !="true" ? 1 : 0}"

    replication_group_id          = "${lower(var.name)}-${lower(var.engine)}-${lower(var.environment)}"
    replication_group_description = "The ${var.engine} master with 2 replica shards which managed by ${var.orchestration}"
    node_type                     = "${var.node_type}"
    port                          = "${var.default_ports[var.engine]}"
    engine                        = "${var.engine}"
    engine_version                = "${var.engine_version}"

    automatic_failover_enabled      = "${var.automatic_failover_enabled}"
    subnet_group_name               = "${var.subnet_group_name}"
    security_group_names            = ["${var.security_group_names_for_cluster}"]
    security_group_ids              = ["${var.security_group_ids}"]
    parameter_group_name            = "${var.parameter_group_name[var.engine] !="" ? var.parameter_group_name[var.engine] : aws_elasticache_parameter_group.elasticache_parameter_group.name}"
    at_rest_encryption_enabled      = "${var.at_rest_encryption_enabled}"
    transit_encryption_enabled      = "${var.transit_encryption_enabled}"
    #auth_token                      = "${var.auth_token}"

    auto_minor_version_upgrade  = "${var.auto_minor_version_upgrade}"
    snapshot_name               = "${var.snapshot_name}"
    maintenance_window          = "${var.maintenance_window}"
    snapshot_window             = "${var.snapshot_window}"
    snapshot_retention_limit    = "${var.snapshot_retention_limit}"
    apply_immediately           = "${var.apply_immediately}"

    notification_topic_arn  = "${var.notification_topic_arn}"

    cluster_mode {
        replicas_per_node_group     = "${var.cluster_mode_replicas_per_node_group}"
        num_node_groups             = "${var.num_cache_nodes}"
    }

    lifecycle {
        create_before_destroy   = true,
    }

    tags {
        Name            = "${lower(var.name)}-${var.engine}-cluster-${lower(var.environment)}"
        Environment     = "${var.environment}"
        Orchestration   = "${var.orchestration}"
        Createdby       = "${var.createdby}"
    }
}

Открываем файл:

$ vim variables.tf

И прописываем:

#-----------------------------------------------------------
# Global or/and default variables
#-----------------------------------------------------------
variable "name" {
  description = "Name to be used on all resources as prefix"
  default     = "TEST-elasticache"
}

variable "region" {
  description = "The region where to deploy this code (e.g. us-east-1)."
  default     = "us-east-1"
}

variable "environment" {
    description = "Environment for service"
    default     = "STAGE"
}

variable "orchestration" {
    description = "Type of orchestration"
    default     = "Terraform"
}

variable "createdby" {
    description = "Created by"
    default     = "Vitaliy Natarov"
}

variable "security_group_names" {
    description = "List of EC2 security group names to be authorized for ingress to the cache security group"
    type        = "list"
    default     = []
}

variable "subnet_ids" {
    description = "List of VPC Subnet IDs for the cache subnet group"
    type        = "list"
    default     = []
}

variable "parameters_for_parameter_group" {
    description = "List of parameters for custom elasticache parameter group"
    type        = "list"
    default     = []
}

variable "create_custom_elasticache_parameter_group" {
    description = "If true, will create elasticache parameter group"
    default     = "true"
}

variable "engine" {
    description = "Name of the cache engine to be used for this cache cluster. Valid values for this parameter are memcached or redis"
    default     = "redis"
}

variable "engine_version" {
    description = "The version number of the cache engine to be used for the cache clusters in this replication group."
    default     = ""
}

variable "default_ports" {
    description = "Default database ports"
    type        = "map"
    default     = {
        redis       = "6379"
        memcached   = "11211"
    }
}

variable "elasticache_parameter_group_family" {
    description = "Set DB group family"
    type        = "map"
    default     = {
        redis       = "redis3.2"
        memcached   = "memcached1.4"
    }
}

variable "create_single_cluster" {
    description = "Enable to create a cluster without any replicas. Default - true"
    default     = "true"
}

variable "node_type" {
    description = "The cluster node type. Ex: cache.t2.micro"
    default     = "cache.t2.micro"
}

variable "num_cache_nodes" {
    description = "The number of cache nodes that the cache cluster has.  Cannot create a Redis cluster with a NumCacheNodes parameter greater than 1."
    default     = "1"
}

variable "parameter_group_name" {
    description = "Name of the parameter group associated with this cache cluster. Ex: default.redis3.2, default.memcached1.4 etc"
    type        = "map"
    default     = {
        redis       = ""
        memcached   = ""
    }
}

variable "subnet_group_name" {
    description = "Name of the subnet group associated to the cache cluster."
    default     = ""
}

variable "security_group_names_for_cluster" {
    description = "List of security group names associated with this cache cluster."
    type        = "list"
    default     = []
}

variable "security_group_ids" {
    description = "List VPC security groups associated with the cache cluster."
    type        = "list"
    default     = []
}

variable "maintenance_window" {
    description = "Specifies the weekly time range for when maintenance on the cache cluster is performed. The format is ddd:hh24:mi-ddd:hh24:mi (24H Clock UTC). The minimum maintenance window is a 60 minute period. Example: sun:05:00-sun:09:00"
    default     = "sun:05:00-sun:09:00"
}

variable "snapshot_window" {
    description = "The daily time range (in UTC) during which ElastiCache will begin taking a daily snapshot of the cache cluster. Format: hh24:mi-hh24:mi. The minimum snapshot window is a 60 minute period. Example: 05:00-09:00"
    default     = "01:00-05:00"
}

variable "availability_zone" {
    description = "The Availability Zone for the cache cluster."
    default     = ""
}

variable "notification_topic_arn" {
    description = "An Amazon Resource Name (ARN) of an SNS topic that ElastiCache notifications get sent to."
    default     = ""
}

variable "snapshot_retention_limit" {
    description = "The number of days for which ElastiCache will retain automatic cache cluster snapshots before deleting them. For example, if you set SnapshotRetentionLimit to 5, then a snapshot that was taken today will be retained for 5 days before being deleted. If the value of SnapshotRetentionLimit is set to zero (0), backups are turned off. Please note that setting a snapshot_retention_limit is not supported on cache.t1.micro or cache.t2.* cache nodes"
    default     = "7"
}

variable "replication_group_id" {
    description = "The replication group to which this cache cluster belongs."
    default     = "replication-cluster-group"
}

variable "number_cluster_replicas" {
    description = "Number of cluster replicas which will create"
    default     = "0"
}

variable "automatic_failover_enabled" {
    description = "Specifies whether a read-only replica will be automatically promoted to read/write primary if the existing primary fails. Defaults to false."
    default     = "true"
}

variable "auto_minor_version_upgrade" {
    description = "Specifies whether a minor engine upgrades will be applied automatically to the underlying Cache Cluster instances during the maintenance window. Defaults to true."
    default     = "true"
}

variable "at_rest_encryption_enabled" {
    description = "Whether to enable encryption at rest."
    default     = "false"
}

variable "transit_encryption_enabled" {
    description = "Whether to enable encryption in transit."
    default     = "false"
}

variable "auth_token" {
    description = "The password used to access a password protected server. Can be specified only if transit_encryption_enabled = true."
    default     = "AUTHtoken666AUTHtoken666AUTHtoken666AUTHtoken666"
}

variable "snapshot_name" {
    description = "The name of a snapshot from which to restore data into the new node group. Changing the snapshot_name forces a new resource."
    default     = ""
}

variable "apply_immediately" {
    description = "Specifies whether any modifications are applied immediately, or during the next maintenance window. Default is false."
    default     = "false"
}

variable "cluster_mode_replicas_per_node_group" {
    description = "Specify the number of replica nodes in each node group. Valid values are 0 to 5. Changing this number will force a new resource."
    default     = "1"
}

Собственно в этом файле храняться все переменные. Спасибо кэп!

Открываем последний файл:

$ vim outputs.tf

И в него вставить нужно следующие строки:

output "elasticache_sg_ids" {
    description = ""
    value       = "${aws_elasticache_security_group.elasticache_sg.*.id}"
}

output "elasticache_subnet_group" {
    description = ""
    value       = "${aws_elasticache_subnet_group.elasticache_subnet_group.*.id}"
}

output "elasticache_parameter_group_names" {
    description = ""
    value       = "${aws_elasticache_parameter_group.elasticache_parameter_group.*.name}"
}

output "elasticache_cluster_ids" {
    description = ""
    value       = "${aws_elasticache_cluster.elasticache_cluster.*.id}"
}

output "elasticache_replication_group_ids" {
    description = ""
    value       = "${aws_elasticache_replication_group.elasticache_replication_group.*.id}"
}

output "elasticache_replication_group_2_ids" {
    description = ""
    value       = "${aws_elasticache_replication_group.elasticache_replication_group_2.*.id}"
}

Переходим теперь в папку aws/examples и создадим еще одну папку для проверки написанного чуда:

$ mkdir elasticache && cd $_

Внутри созданной папки открываем файл:

$ vim main.tf

И вставим в него следующий код:

#
# MAINTAINER Vitaliy Natarov "vitaliy.natarov@yahoo.com"
#
terraform {
  required_version = "> 0.9.0"
}
provider "aws" {
    region                  = "us-east-1"
    shared_credentials_file = "${pathexpand("~/.aws/credentials")}"
    profile                 = "default"
}
module "vpc" {
    source                              = "../../modules/vpc"
    name                                = "TEST-VPC"
    environment                         = "PROD"
    # VPC
    instance_tenancy                    = "default"
    enable_dns_support                  = "true"
    enable_dns_hostnames                = "true"
    assign_generated_ipv6_cidr_block    = "false"
    enable_classiclink                  = "false"

    vpc_cidr                            = "172.31.0.0/16"
    private_subnet_cidrs                = ["172.31.64.0/20"]
    public_subnet_cidrs                 = ["172.31.80.0/20"]
    availability_zones                  = ["us-east-1a", "us-east-1b"]
    allowed_ports                       = ["6379", "11211"]

    allow_cidrs_for_allowed_ports       = [{
        "6379"      = ["0.0.0.0/0"]
        "11211"     = ["0.0.0.0/0"]
    }]

    #Internet-GateWay
    enable_internet_gateway             = "true"
    #NAT
    enable_nat_gateway                  = "false"
    single_nat_gateway                  = "true"
    #VPN
    enable_vpn_gateway                  = "false"
    #DHCP
    enable_dhcp_options                 = "false"
    # EIP
    enable_eip                          = "false"
}
module "elasticache" {
    source                          = "../../modules/elasticache"
    name                            = "TEST"
    region                          = "us-east-1"
    environment                     = "PROD"

    # NOTE: ElastiCache Subnet Groups are only for use when working with an ElastiCache cluster inside of a VPC. If you are on EC2 Classic, see the ElastiCache Security Group resource.
    # NOTE: ElastiCache Security Groups are for use only when working with an ElastiCache cluster outside of a VPC. If you are using a VPC, see the ElastiCache Subnet Group resource.
    # I HAVE GOT ISSUE WHEN USED "ElastiCache Security Groups". SO I PREFERED ElastiCache Subnet Groups
    #aws_elasticache_security_group.elasticache_sg: Error creating CacheSecurityGroup: InvalidParameterValue: Use of cache security groups is not permitted in this API version for your account.
    security_group_names    = []
    subnet_ids              = ["${module.vpc.vpc-privatesubnet-ids}", "${module.vpc.vpc-publicsubnet-ids}"]

    create_custom_elasticache_parameter_group   = true
    parameters_for_parameter_group              = [
    {
        name  = "activerehashing"
        value = "yes"
    },
    {
        name  = "min-slaves-to-write"
        value = "2"
    },
    ]
    engine                                      = "redis" #"memcached"

    # Not single cluster
    #create_single_cluster   = false
    #num_cache_nodes         = 2
    #number_cluster_replicas = 1
    #node_type               = "cache.m3.medium"

    # cluster with 2 nodes and 2 shards
    create_single_cluster   = false
    number_cluster_replicas = 2
    num_cache_nodes         = 2
    node_type               = "cache.m3.medium"
    parameter_group_name    = [{
        redis   = "default.redis3.2.cluster.on"
    }]

}

Еще полезности:

Работа с AWS IAM и Terraform в Unix/Linux

Работа с AWS VPC и Terraform в Unix/Linux

Работа с AWS S3 и Terraform в Unix/Linux

Работа с AWS EC2 и Terraform в Unix/Linux

Работа с AWS ASG(auto scaling group) и Terraform в Unix/Linux

Работа с AWS ELB и Terraform в Unix/Linux

Работа с AWS Route53 и Terraform в Unix/Linux

Работа с AWS RDS и Terraform в Unix/Linux

Работа с AWS SNS и Terraform в Unix/Linux

Работа с AWS SQS и Terraform в Unix/Linux

Работа с AWS KMS и Terraform в Unix/Linux

Работа с AWS NLB и Terraform в Unix/Linux

Работа с AWS CloudWatch и Terraform в Unix/Linux

Работа с AWS ALB и Terraform в Unix/Linux

Работа с AWS MQ broker и Terraform в Unix/Linux

Работа с AWS EFS и Terraform в Unix/Linux

Все уже написано и готово к использованию. Ну что, начнем тестирование. В папке с вашим плейбуком, выполняем:

$ terraform init

Этим действием я инициализирую проект. Затем, подтягиваю модуль:

$ terraform get

PS: Для обновление изменений в самом модуле, можно выполнять:

$ terraform get -update

Проверим валидацию:

$ terraform validate

Запускем прогон:

$ terraform plan

Мне вывело что все у меня хорошо и можно запускать деплой:

$ terraform apply

Как видно с вывода, — все прошло гладко! Чтобы удалить созданное творение, можно выполнить:

$ terraform destroy

Весь материал аплоаджу в github аккаунт для удобства использования:

$ git clone https://github.com/SebastianUA/terraform.git

Вот и все на этом. Данная статья «Работа с AWS elasticache и Terraform в Unix/Linux» завершена.

The post Работа с AWS elasticache и Terraform в Unix/Linux first appeared on linux-notes.org.]]>
https://linux-notes.org/rabota-s-aws-elasticache-i-terraform-v-unix-linux/feed/ 0
Page_c76a3fcf https://linux-notes.org/rabota-s-aws-efs-i-terraform-v-unix-linux/ https://linux-notes.org/rabota-s-aws-efs-i-terraform-v-unix-linux/#respond Thu, 22 Feb 2018 14:49:18 +0000 http://linux-notes.org/?p=15240 Работа с AWS EFS и Terraform в Unix/Linux Amazon EFS – это полностью управляемый сервис, который позволяет легко настраивать и масштабировать файловое хранилище в облаке Amazon. С помощью нескольких щелчков мышью в Консоли управления AWS можно создать файловые системы, которые будут доступны для инстансов Amazon EC2 через интерфейс файловой системы (с использованием API ввода-вывода файлов […]

The post Работа с AWS EFS и Terraform в Unix/Linux first appeared on linux-notes.org.]]>

Работа с AWS EFS и Terraform в Unix/Linux

Amazon EFS – это полностью управляемый сервис, который позволяет легко настраивать и масштабировать файловое хранилище в облаке Amazon. С помощью нескольких щелчков мышью в Консоли управления AWS можно создать файловые системы, которые будут доступны для инстансов Amazon EC2 через интерфейс файловой системы (с использованием API ввода-вывода файлов стандартной операционной системы), который поддерживает полную семантику доступа к файловой системе (например, строгую непротиворечивость и блокировку файлов).

Файловые системы Amazon EFS обеспечивают автоматическое масштабирование от нескольких гигабайтов до петабайтов данных без необходимости предоставления хранилища. Десятки, сотни или даже тысячи инстансов Amazon EC2 могут одновременно получать доступ к файловой системе Amazon EFS, при этом Amazon EFS обеспечивает стабильную производительность для каждого инстанса Amazon EC2. Система Amazon EFS отличается высокой доступностью и надежностью. С Amazon EFS вы платите только за реально используемый объем хранилища файлов, минимальные взносы и стартовые платежи отсутствуют.

Установка terraform в Unix/Linux

Установка крайне примитивная и я описал как это можно сделать тут:

Установка terraform в Unix/Linux

Так же, в данной статье, я создал скрипт для автоматической установки данного ПО. Он был протестирован на CentOS 6/7, Debian 8 и на Mac OS X. Все работает должным образом!

Чтобы получить помощь по использованию команд, выполните:

$ terraform
Usage: terraform [--version] [--help] <command> [args]

The available commands for execution are listed below.
The most common, useful commands are shown first, followed by
less common or more advanced commands. If you're just getting
started with Terraform, stick with the common commands. For the
other commands, please read the help and docs before usage.

Common commands:
    apply              Builds or changes infrastructure
    console            Interactive console for Terraform interpolations
    destroy            Destroy Terraform-managed infrastructure
    env                Workspace management
    fmt                Rewrites config files to canonical format
    get                Download and install modules for the configuration
    graph              Create a visual graph of Terraform resources
    import             Import existing infrastructure into Terraform
    init               Initialize a Terraform working directory
    output             Read an output from a state file
    plan               Generate and show an execution plan
    providers          Prints a tree of the providers used in the configuration
    push               Upload this Terraform module to Atlas to run
    refresh            Update local state file against real resources
    show               Inspect Terraform state or plan
    taint              Manually mark a resource for recreation
    untaint            Manually unmark a resource as tainted
    validate           Validates the Terraform files
    version            Prints the Terraform version
    workspace          Workspace management

All other commands:
    debug              Debug output management (experimental)
    force-unlock       Manually unlock the terraform state
    state              Advanced state management

Приступим к использованию!

Работа с AWS EFS и Terraform в Unix/Linux

У меня есть папка terraform, в ней у меня будут лежать провайдеры с которыми я буду работать. Т.к в этом примере я буду использовать AWS, то создам данную папку и перейду в нее. Далее, в этой папке, стоит создать:

$ mkdir examples modules

В папке examples, я буду хранить так званые «плейбуки» для разварачивания различных служб, например — zabbix-server, grafana, web-серверы и так далее. В modules директории, я буду хранить все необходимые модули.

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

$  mkdir modules/efs

Переходим в нее:

$ cd modules/efs

Открываем файл:

$ vim efs.tf

В данный файл, вставляем:

#---------------------------------------------------
# Create AWS EFS file system
#---------------------------------------------------
resource "aws_efs_file_system" "efs_file_system" {
    creation_token      = "${lower(var.name)}-efs-${lower(var.environment)}"
    performance_mode    = "${var.performance_mode}"
    creation_token      = "${var.creation_token}"
    encrypted           = "${var.encrypted}"
    kms_key_id          = "${var.kms_key_id}"

    tags {
        Name            = "${lower(var.name)}-efs-${lower(var.environment)}"
        Environment     = "${var.environment}"
        Orchestration   = "${var.orchestration}"
        Createdby       = "${var.createdby}"
    }

}
#---------------------------------------------------
# Create AWS EFS mount target
#---------------------------------------------------
resource "aws_efs_mount_target" "efs_mount_target" {
    count           = "${length(var.subnet_ids) > 0 ? length(var.subnet_ids) : 0}"

    file_system_id  = "${aws_efs_file_system.efs_file_system.id}"
    subnet_id       = "${data.template_file.subnet_id.rendered}"
}

data "template_file" "subnet_id" {
    count    = "${length(var.subnet_ids) > 0 ? length(var.subnet_ids) : 0}"
    template = "${element(var.subnet_ids, count.index)}"
}

Открываем файл:

$ vim variables.tf

И прописываем:

#-----------------------------------------------------------
# Global or/and default variables
#-----------------------------------------------------------
variable "name" {
  description = "Name to be used on all resources as prefix"
  default     = "TEST-codedeploy"
}

variable "region" {
  description = "The region where to deploy this code (e.g. us-east-1)."
  default     = "us-east-1"
}

variable "environment" {
    description = "Environment for service"
    default     = "STAGE"
}

variable "orchestration" {
    description = "Type of orchestration"
    default     = "Terraform"
}

variable "createdby" {
    description = "Created by"
    default     = "Vitaliy Natarov"
}

variable "performance_mode" {
    description = "The file system performance mode. Can be either 'generalPurpose' or 'maxIO' (Default: 'generalPurpose')."
    default     = "generalPurpose"
}

variable "encrypted" {
    description = "If true, the disk will be encrypted."
    default     = "true"
}

variable "kms_key_id" {
    description = "The ARN for the KMS encryption key. When specifying kms_key_id, encrypted needs to be set to true."
    default     = ""
}

variable "creation_token" {
    description = "DEPRECATED (Optional) A reference name used when creating the Creation Token which Amazon EFS uses to ensure idempotent file system creation. By default generated by Terraform."
    default     = ""
}

variable "subnet_ids" {
    description = "The ID of the subnets to add the mount target in."
    type        = "list"
    default     = []
}

Собственно в этом файле храняться все переменные. Спасибо кэп!

Открываем последний файл:

$ vim outputs.tf

И в него вставить нужно следующие строки:

output "efs_file_system_ids" {
    description = ""
    value       = "${aws_efs_file_system.efs_file_system.*.id}"
}

output "efs_file_system_kms_key_ids" {
    description = ""
    value       = "${aws_efs_file_system.efs_file_system.*.kms_key_id}"
}

output "efs_file_system_dns_names" {
    description = ""
    value       = "${aws_efs_file_system.efs_file_system.*.dns_name}"
}

Переходим теперь в папку aws/examples и создадим еще одну папку для проверки написанного чуда:

$ mkdir efs && cd $_

Внутри созданной папки открываем файл:

$ vim main.tf

И вставим в него следующий код:

#
# MAINTAINER Vitaliy Natarov "vitaliy.natarov@yahoo.com"
#
terraform {
  required_version = "> 0.9.0"
}
provider "aws" {
    region                  = "us-east-1"
    shared_credentials_file = "${pathexpand("~/.aws/credentials")}"
    profile                 = "default"
}
module "vpc" {
    source                              = "../../modules/vpc"
    name                                = "TEST-VPC"
    environment                         = "PROD"
    # VPC
    instance_tenancy                    = "dedicated"
    enable_dns_support                  = "true"
    enable_dns_hostnames                = "true"
    assign_generated_ipv6_cidr_block    = "false"
    enable_classiclink                  = "false"

    vpc_cidr                            = "172.31.0.0/16"
    private_subnet_cidrs                = ["172.31.64.0/20"]
    public_subnet_cidrs                 = ["172.31.80.0/20", "172.31.0.0/20"]
    availability_zones                  = ["us-east-1a", "us-east-1b"]
    allowed_ports                       = ["8080", "3306", "80", "443"]

    #Internet-GateWay
    enable_internet_gateway             = "true"
    #NAT
    enable_nat_gateway                  = "false"
    single_nat_gateway                  = "true"
    #VPN
    enable_vpn_gateway                  = "false"
    #DHCP
    enable_dhcp_options                 = "false"
    # EIP
    enable_eip                          = "false"
}
module "efs" {
    source          = "../../modules/efs"
    name            = "TEST-EFS"
    region          = "us-east-1"
    environment     = "PROD"

    subnet_ids      = ["${module.vpc.vpc-privatesubnet-ids}"]
}

Еще полезности:

Работа с AWS IAM и Terraform в Unix/Linux

Работа с AWS VPC и Terraform в Unix/Linux

Работа с AWS S3 и Terraform в Unix/Linux

Работа с AWS EC2 и Terraform в Unix/Linux

Работа с AWS ASG(auto scaling group) и Terraform в Unix/Linux

Работа с AWS ELB и Terraform в Unix/Linux

Работа с AWS Route53 и Terraform в Unix/Linux

Работа с AWS RDS и Terraform в Unix/Linux

Работа с AWS SNS и Terraform в Unix/Linux

Работа с AWS SQS и Terraform в Unix/Linux

Работа с AWS KMS и Terraform в Unix/Linux

Работа с AWS NLB и Terraform в Unix/Linux

Работа с AWS CloudWatch и Terraform в Unix/Linux

Работа с AWS ALB и Terraform в Unix/Linux

Работа с AWS MQ broker и Terraform в Unix/Linux

Все уже написано и готово к использованию. Ну что, начнем тестирование. В папке с вашим плейбуком, выполняем:

$ terraform init

Этим действием я инициализирую проект. Затем, подтягиваю модуль:

$ terraform get

PS: Для обновление изменений в самом модуле, можно выполнять:

$ terraform get -update

Проверим валидацию:

$ terraform validate

Запускем прогон:

$ terraform plan

Мне вывело что все у меня хорошо и можно запускать деплой:

$ terraform apply

Как видно с вывода, — все прошло гладко! Чтобы удалить созданное творение, можно выполнить:

$ terraform destroy

Весь материал аплоаджу в github аккаунт для удобства использования:

$ git clone https://github.com/SebastianUA/terraform.git

Вот и все на этом. Данная статья «Работа с AWS EFS и Terraform в Unix/Linux» завершена.

The post Работа с AWS EFS и Terraform в Unix/Linux first appeared on linux-notes.org.]]>
https://linux-notes.org/rabota-s-aws-efs-i-terraform-v-unix-linux/feed/ 0
Page_c76a3fcf https://linux-notes.org/rabota-s-aws-mq-broker-i-terraform-v-unix-linux/ https://linux-notes.org/rabota-s-aws-mq-broker-i-terraform-v-unix-linux/#respond Thu, 22 Feb 2018 13:16:11 +0000 http://linux-notes.org/?p=15234 Работа с AWS MQ broker и Terraform в Unix/Linux Amazon MQ – управляемый сервис брокера сообщений для Apache ActiveMQ. Он позволяет без труда настраивать в облаке брокеры сообщений и работать с ними. Брокеры сообщений обеспечивают различным программным системам – зачастую написанным на разных языках программирования для различных платформ – возможность связываться между собой и обмениваться […]

The post Работа с AWS MQ broker и Terraform в Unix/Linux first appeared on linux-notes.org.]]>

Работа с AWS MQ broker и Terraform в Unix/Linux

Amazon MQ – управляемый сервис брокера сообщений для Apache ActiveMQ. Он позволяет без труда настраивать в облаке брокеры сообщений и работать с ними. Брокеры сообщений обеспечивают различным программным системам – зачастую написанным на разных языках программирования для различных платформ – возможность связываться между собой и обмениваться информацией. Система обмена сообщениями – это коммуникационная магистраль, позволяющая связать и интегрировать компоненты распределенных приложений, например систем обработки заказов, складского учета и выполнения заказов в интернет-коммерции. Сервис Amazon MQ работает с популярным брокером сообщений ActiveMQ с открытым исходным кодом, осуществляя управление системой и ее обслуживание. Ресурсы базовой инфраструктуры автоматически выделяются для обеспечения высокой доступности и сохранности сообщений, поддерживая таким образом надежную работу приложений. Amazon MQ позволяет получить прямой доступ к консоли ActiveMQ, а также стандартным отраслевым API и протоколам службы сообщений, в том числе JMS, NMS, AMQP, STOMP, MQTT и WebSocket. Перейти на Amazon MQ с любого другого брокера сообщений, использующего перечисленные стандарты, очень просто: переписывать программный код приложений в части обмена сообщениями не потребуется.

Начать работу с Amazon MQ легко. Запустить брокер сообщений можно за считаные минуты в Консоли управления AWS или с помощью интерфейса командной строки (CLI). Amazon MQ не требует предварительных вложений в аппаратное или программное обеспечение и минимальных платежей. Оплачивается только фактическое использование инстанса брокера и хранилища.

Установка terraform в Unix/Linux

Установка крайне примитивная и я описал как это можно сделать тут:

Установка terraform в Unix/Linux

Так же, в данной статье, я создал скрипт для автоматической установки данного ПО. Он был протестирован на CentOS 6/7, Debian 8 и на Mac OS X. Все работает должным образом!

Чтобы получить помощь по использованию команд, выполните:

$ terraform
Usage: terraform [--version] [--help] <command> [args]

The available commands for execution are listed below.
The most common, useful commands are shown first, followed by
less common or more advanced commands. If you're just getting
started with Terraform, stick with the common commands. For the
other commands, please read the help and docs before usage.

Common commands:
    apply              Builds or changes infrastructure
    console            Interactive console for Terraform interpolations
    destroy            Destroy Terraform-managed infrastructure
    env                Workspace management
    fmt                Rewrites config files to canonical format
    get                Download and install modules for the configuration
    graph              Create a visual graph of Terraform resources
    import             Import existing infrastructure into Terraform
    init               Initialize a Terraform working directory
    output             Read an output from a state file
    plan               Generate and show an execution plan
    providers          Prints a tree of the providers used in the configuration
    push               Upload this Terraform module to Atlas to run
    refresh            Update local state file against real resources
    show               Inspect Terraform state or plan
    taint              Manually mark a resource for recreation
    untaint            Manually unmark a resource as tainted
    validate           Validates the Terraform files
    version            Prints the Terraform version
    workspace          Workspace management

All other commands:
    debug              Debug output management (experimental)
    force-unlock       Manually unlock the terraform state
    state              Advanced state management

Приступим к использованию!

Работа с AWS MQ broker и Terraform в Unix/Linux

У меня есть папка terraform, в ней у меня будут лежать провайдеры с которыми я буду работать. Т.к в этом примере я буду использовать AWS, то создам данную папку и перейду в нее. Далее, в этой папке, стоит создать:

$ mkdir examples modules

В папке examples, я буду хранить так званые «плейбуки» для разварачивания различных служб, например — zabbix-server, grafana, web-серверы и так далее. В modules директории, я буду хранить все необходимые модули.

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

$  mkdir modules/mq

Переходим в нее:

$ cd modules/mq

Открываем файл:

$ vim mq.tf

В данный файл, вставляем:

#---------------------------------------------------
# Create AWS MQ broker
#---------------------------------------------------
resource "aws_mq_broker" "mq_broker" {

    broker_name             = "${lower(var.name)}-mq-broker-${lower(var.environment)}"
    engine_type             = "${var.engine_type}"
    engine_version          = "${var.engine_version}"
    host_instance_type      = "${var.host_instance_type}"
    security_groups         = ["${var.security_group_ids}"]
    subnet_ids              = ["${var.subnet_ids}"]

    apply_immediately           = "${var.apply_immediately}"
    auto_minor_version_upgrade  = "${var.auto_minor_version_upgrade}"
    deployment_mode             = "${var.deployment_mode}"
    publicly_accessible         = "${var.publicly_accessible}"

    maintenance_window_start_time {
        day_of_week = "${var.day_of_week}"
        time_of_day = "${var.time_of_day}"
        time_zone   = "${var.time_zone}"
    }

    configuration {
        id          = "${aws_mq_configuration.mq_configuration.id}"
        revision    = "${aws_mq_configuration.mq_configuration.latest_revision}"
    }

    user {
        username        = "${var.mq_broker_username}"
        password        = "${var.mq_broker_password}"
        groups          = ["${var.mq_broker_groups}"]
        console_access  = "${var.mq_broker_console_access}"
    }

    depends_on = ["aws_mq_configuration.mq_configuration"]
}
#---------------------------------------------------
# Create AWS MQ broker configuration
#---------------------------------------------------
resource "aws_mq_configuration" "mq_configuration" {
    name           = "${lower(var.name)}-mq-broker-configuration-${lower(var.environment)}"
    description    = "The Configuration for ${lower(var.name)}-mq-broker-${lower(var.environment)}"
    engine_type    = "${var.engine_type}"
    engine_version = "${var.engine_version}"
    data           = "${data.template_file.mq_configuration_data.rendered}"

    depends_on  = ["data.template_file.mq_configuration_data"]
}
#---------------------------------------------------
# Create data for AWS MQ broker configuration
#---------------------------------------------------
data "template_file" "mq_configuration_data" {
    template = "${file("${path.module}/data/data.xml.tpl")}"
}

Открываем файл:

$ vim variables.tf

И прописываем:

#-----------------------------------------------------------
# Global or/and default variables
#-----------------------------------------------------------
variable "name" {
  description = "Name to be used on all resources as prefix"
  default     = "TEST-MQ"
}

variable "region" {
  description = "The region where to deploy this code (e.g. us-east-1)."
  default     = "us-east-1"
}

variable "environment" {
    description = "Environment for service"
    default     = "STAGE"
}

variable "orchestration" {
    description = "Type of orchestration"
    default     = "Terraform"
}

variable "createdby" {
    description = "Created by"
    default     = "Vitaliy Natarov"
}

variable "engine_type" {
    description = "The type of broker engine. Currently, Amazon MQ supports only ActiveMQ."
    default     = "ActiveMQ"
}

variable "engine_version" {
    description = "The version of the broker engine. Currently, Amazon MQ supports only 5.15.0"
    default     = "5.15.0"
}

variable "host_instance_type" {
    description = "The broker's instance type. e.g. mq.t2.micro or mq.m4.large"
    default     = "mq.t2.micro"
}

variable "security_group_ids" {
    description = "The list of security group IDs assigned to the broker."
    default     = []
}

variable "subnet_ids" {
    description = "The list of subnet IDs in which to launch the broker. A SINGLE_INSTANCE deployment requires one subnet. An ACTIVE_STANDBY_MULTI_AZ deployment requires two subnets."
    default     = []
}

variable "apply_immediately" {
    description = "Specifies whether any broker modifications are applied immediately, or during the next maintenance window. Default is false."
    default     = "false"
}

variable "auto_minor_version_upgrade" {
    description = "Enables automatic upgrades to new minor versions for brokers, as Apache releases the versions."
    default     = "false"
}

variable "deployment_mode" {
    description = "The deployment mode of the broker. Supported: SINGLE_INSTANCE and ACTIVE_STANDBY_MULTI_AZ. Defaults to SINGLE_INSTANCE."
    default     = "SINGLE_INSTANCE"
}

variable "publicly_accessible" {
    description = "Whether to enable connections from applications outside of the VPC that hosts the broker's subnets."
    default     = "false"
}

variable "mq_broker_username" {
    description = "The username of the user."
    default     = "mq_broker"
}

variable "mq_broker_password" {
    description = "The password of the user. It must be 12 to 250 characters long, at least 4 unique characters, and must not contain commas."
    default     = "mq_broker666"
}

variable "mq_broker_groups" {
    description = "The list of groups (20 maximum) to which the ActiveMQ user belongs."
    type        = "list"
    default     = ["mq_broker"]
}

variable "mq_broker_console_access" {
    description = "Whether to enable access to the the ActiveMQ Web Console for the user."
    default     = "true"
}

variable "day_of_week" {
    description = "The day of the week. e.g. MONDAY, TUESDAY, or WEDNESDAY"
    default     = "MONDAY"
}

variable "time_of_day" {
    description = "The time, in 24-hour format. e.g. 02:00"
    default     = "02:00"
}

variable "time_zone" {
    description = "The time zone, UTC by default, in either the Country/City format, or the UTC offset format. e.g. CET"
    default     = "UTC"
}

Собственно в этом файле храняться все переменные. Спасибо кэп!

Открываем последний файл:

$ vim outputs.tf

И в него вставить нужно следующие строки:

output "mq_broker_ids" {
    description = ""
    value       = "${aws_mq_broker.mq_broker.*.id}"
}

output "mq_broker_arns" {
    description = ""
    value       = "${aws_mq_broker.mq_broker.*.arn}"
}

output "mq_broker_instances" {
    description = ""
    value       = "${aws_mq_broker.mq_broker.*.instances}"
}

output "mq_configuration_ids" {
    description = ""
    value       = "${aws_mq_configuration.mq_configuration.*.id}"
}

output "mq_configuration_arns" {
    description = ""
    value       = "${aws_mq_configuration.mq_configuration.*.arn}"
}

output "mq_configuration_latest_revision" {
    description = ""
    value       = "${aws_mq_configuration.mq_configuration.*.latest_revision}"
}

Переходим теперь в папку aws/examples и создадим еще одну папку для проверки написанного чуда:

$ mkdir mq && cd $_

Внутри созданной папки открываем файл:

$ vim main.tf

И вставим в него следующий код:

#
# MAINTAINER Vitaliy Natarov "vitaliy.natarov@yahoo.com"
#
terraform {
  required_version = "> 0.9.0"
}
provider "aws" {
    region                  = "us-east-1"
    shared_credentials_file = "${pathexpand("~/.aws/credentials")}"
    profile                 = "default"
}
module "vpc" {
    source                              = "../../modules/vpc"
    name                                = "TEST-VPC"
    environment                         = "PROD"
    # VPC
    instance_tenancy                    = "default"
    enable_dns_support                  = "true"
    enable_dns_hostnames                = "true"
    assign_generated_ipv6_cidr_block    = "false"
    enable_classiclink                  = "false"

    vpc_cidr                            = "172.31.0.0/16"
    private_subnet_cidrs                = ["172.31.64.0/20"]
    public_subnet_cidrs                 = ["172.31.80.0/20", "172.31.0.0/20"]
    availability_zones                  = ["us-east-1a", "us-east-1b"]
    allowed_ports                       = ["8080", "3306", "80", "443", "5672"]

    #Internet-GateWay
    enable_internet_gateway             = "true"
    #NAT
    enable_nat_gateway                  = "false"
    single_nat_gateway                  = "true"
    #VPN
    enable_vpn_gateway                  = "false"
    #DHCP
    enable_dhcp_options                 = "false"
    # EIP
    enable_eip                          = "false"
}
module "mq" {
    source                          = "../../modules/mq"
    name                            = "TEST-MQ"
    region                          = "us-east-1"
    environment                     = "PROD"

    security_group_ids     = ["${module.vpc.security_group_id}", "${module.vpc.default_security_group_id}"]
    subnet_ids             = ["${module.vpc.vpc-privatesubnet-ids}"]
}

Еще полезности:

Работа с AWS IAM и Terraform в Unix/Linux

Работа с AWS VPC и Terraform в Unix/Linux

Работа с AWS S3 и Terraform в Unix/Linux

Работа с AWS EC2 и Terraform в Unix/Linux

Работа с AWS ASG(auto scaling group) и Terraform в Unix/Linux

Работа с AWS ELB и Terraform в Unix/Linux

Работа с AWS Route53 и Terraform в Unix/Linux

Работа с AWS RDS и Terraform в Unix/Linux

Работа с AWS SNS и Terraform в Unix/Linux

Работа с AWS SQS и Terraform в Unix/Linux

Работа с AWS KMS и Terraform в Unix/Linux

Работа с AWS NLB и Terraform в Unix/Linux

Работа с AWS CloudWatch и Terraform в Unix/Linux

Работа с AWS ALB и Terraform в Unix/Linux

Все уже написано и готово к использованию. Ну что, начнем тестирование. В папке с вашим плейбуком, выполняем:

$ terraform init

Этим действием я инициализирую проект. Затем, подтягиваю модуль:

$ terraform get

PS: Для обновление изменений в самом модуле, можно выполнять:

$ terraform get -update

Проверим валидацию:

$ terraform validate

Запускем прогон:

$ terraform plan

Мне вывело что все у меня хорошо и можно запускать деплой:

$ terraform apply

Как видно с вывода, — все прошло гладко! Чтобы удалить созданное творение, можно выполнить:

$ terraform destroy

Весь материал аплоаджу в github аккаунт для удобства использования:

$ git clone https://github.com/SebastianUA/terraform.git

Вот и все на этом. Данная статья «Работа с AWS MQ broker и Terraform в Unix/Linux» завершена.

The post Работа с AWS MQ broker и Terraform в Unix/Linux first appeared on linux-notes.org.]]>
https://linux-notes.org/rabota-s-aws-mq-broker-i-terraform-v-unix-linux/feed/ 0
Page_c76a3fcf https://linux-notes.org/rabota-s-aws-alb-i-terraform-v-unix-linux/ https://linux-notes.org/rabota-s-aws-alb-i-terraform-v-unix-linux/#comments Fri, 16 Feb 2018 10:29:08 +0000 http://linux-notes.org/?p=15173 Работа с AWS ALB и Terraform в Unix/Linux Application Load Balancer работает на уровне запросов (уровень 7), маршрутизируя трафик на целевые объекты – инстансы EC2, контейнеры и IP-адреса – на основе содержимого запроса. Application Load Balancer идеально подходит для расширенной балансировки нагрузки HTTP и HTTPS-трафика. Он обеспечивает расширенную маршрутизацию запросов, ориентированную на доставку приложений, построенных […]

The post Работа с AWS ALB и Terraform в Unix/Linux first appeared on linux-notes.org.]]>

Работа с AWS ALB и Terraform в Unix/Linux

Application Load Balancer работает на уровне запросов (уровень 7), маршрутизируя трафик на целевые объекты – инстансы EC2, контейнеры и IP-адреса – на основе содержимого запроса. Application Load Balancer идеально подходит для расширенной балансировки нагрузки HTTP и HTTPS-трафика. Он обеспечивает расширенную маршрутизацию запросов, ориентированную на доставку приложений, построенных на базе современных архитектур, включая микросервисы и приложения на основе контейнеров. Application Load Balancer упрощает настройку и повышает безопасность приложения, гарантируя, что всегда используются самые новые версии шифров и протоколов SSL/TLS.

Балансировка нагрузки на уровне 7
Имеется возможность осуществлять балансировку нагрузки приложений, использующих протокол HTTP/HTTPS, и использовать особые возможности уровня 7, такие как заголовки X-Forwarded-For.

Поддержка HTTPS
Application Load Balancer поддерживает использование HTTPS-терминации между клиентами и балансировщиком нагрузки. Application Load Balancer также позволяет управлять SSL-сертификатами с помощью AWS Identity and Access Management (IAM) и AWS Certificate Manager для предустановленных политик безопасности.

Server Name Indication (SNI)
Server Name Indication (SNI) – это расширение протокола TLS, с помощью которого клиент обозначает имя узла для подключения в начале установления связи по протоколу TLS. Балансировщик нагрузки может передавать через один и тот же обработчик событий безопасности несколько сертификатов, благодаря чему он способен поддерживать несколько защищенных веб-сайтов через один обработчик событий безопасности. Балансировщики нагрузки приложений также поддерживают интеллектуальный алгоритм выбора сертификатов при работе с SNI. Если имя узла, обозначенное клиентом, соответствует нескольким сертификатам, балансировщик нагрузки определяет наилучший сертификат на основании ряда факторов, в том числе учитывая возможности клиента.

IP-адреса как цели
Применять балансировку нагрузки можно для любого приложения, размещенного в AWS или локально, если использовать в качестве целей IP-адреса серверной части приложения. Это позволяет обеспечить балансировку нагрузки на сервер приложения, размещенный на любом IP-адресе и в любом интерфейсе инстанса. Каждое приложение, размещенное на том же инстансе, может относиться к своей группе безопасности и использовать один и тот же порт. Можно также использовать IP-адреса в качестве целей для приложений с балансировкой нагрузки, размещенных локально (через подключение с помощью Direct Connect или VPN-соединения), в VPC с пиринговым подключением или на инстансах EC2-Classic (с использованием ClassicLink). Возможность балансировки нагрузки между AWS и локальными ресурсами упрощает миграцию в облако, расширение ресурсов в облако или использование облака для обеспечения отказоустойчивости.

Высокая доступность
Для Application Load Balancer необходимо указать более одной зоны доступности. Можно распределять входящий трафик по объектам в нескольких зонах доступности. Application Load Balancer автоматически масштабирует ресурсы, необходимые для обработки запросов, реагируя на входящий трафик приложений.

Возможности обеспечения безопасности
При использовании облака Amazon Virtual Private Cloud (Amazon VPC) можно создать группы безопасности, связанные с Elastic Load Balancing, и управлять ими, чтобы обеспечить дополнительные варианты использования сетевой конфигурации и настройки безопасности. Можно настроить Application Load Balancer для работы с выходом в Интернет или создать балансировщик нагрузки без публичного IP-адреса для работы в качестве внутреннего балансировщика нагрузки (без выхода в Интернет).

Маршрутизация на основе контента
Если приложение состоит из нескольких отдельных сервисов, Application Load Balancer может направлять запрос в определенный сервис на основе содержания запроса.

Маршрутизация на основе узла
Можно выполнять маршрутизацию запросов клиента в зависимости от поля Host HTTP-заголовка – это позволяет из одного и того же балансировщика нагрузки осуществлять маршрутизацию в несколько доменов.

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

Поддержка приложений на основе контейнеров
Application Load Balancer обеспечивает расширенную поддержку контейнеров путем балансировки нагрузки между несколькими портами в одном инстансе Amazon EC2. Глубокая интеграция с Amazon EC2 Container Service (ECS) обеспечивает полностью управляемое контейнерное предложение. ECS позволяет в определении задания ECS указать динамический порт, в этом случае контейнеру, запланированному для инстанса EC2, будет передан неиспользуемый порт. Планировщик ECS автоматически добавляет задание в балансировщик нагрузки, используя этот порт.

Поддержка HTTP/2
HTTP/2 – это новая версия протокола передачи гипертекста (HTTP), который использует единое мультиплексное соединение, позволяющее обеспечить отправку нескольких запросов по одному соединению. Он также осуществляет сжатие данных заголовка перед его отправкой в двоичном формате, а также поддерживает установку TLS-соединения с клиентами.

Поддержка WebSocket
WebSocket позволяет серверу в режиме реального времени обмениваться сообщениями с конечными пользователями без необходимости конечных пользователей запрашивать (или опрашивать) этот сервер на наличие обновлений. Протокол WebSocket обеспечивает двунаправленные каналы связи между клиентом и сервером в установленном длительное время TCP-соединении.

Встроенная поддержка протокола IPv6
Application Load Balancer поддерживает работу по интернет-протоколу версии 6 (IPv6) в облаке VPC. Это позволяет клиентам подключаться к Application Load Balancer по протоколам IPv4 или IPv6.

Закрепленные сеансы
Закрепленные сеансы – это механизм маршрутизации запросов из одного и того же клиента к одному и тому же получателю. Application Load Balancer поддерживает закрепленные сеансы с помощью файлов cookie, сгенерированных балансировщиком нагрузки. Если включить закрепленные сеансы, то тот же получатель будет получать запрос и сможет использовать файлы cookie для восстановления контекста сеанса. Закрепленность определяется на уровне целевой группы.

Проверки работоспособности
Application Load Balancer направляет трафик только к работоспособным объектам. С помощью Application Load Balancer можно двумя способами добиться оптимального представления о работоспособности своих приложений. 1) Путем расширенной проверки работоспособности, которая позволяет настроить подробные коды ошибок с 200 по 499. Проверка работоспособности позволяет следить за состоянием каждого из сервисов под управлением балансировщика нагрузки. 2) С помощью новых метрик, которые дают представление о трафике для каждого из сервисов, работающих на инстансе EC2.

Мониторинг в процессе работы
В отчетах Amazon CloudWatch присутствует информация о таких метриках Application Load Balancer, как количество запросов, количество ошибок, тип ошибок и время задержки.

Ведение журналов
Можно использовать возможность ведения журналов доступа для записи всех запросов, отправленных балансировщику нагрузки, и сохранять файлы журналов в Amazon S3 для последующего анализа. Файлы журналов сжаты и имеют расширение .gzip. Сжатые файлы журналов экономят дисковое пространство и пропускную способность при передаче данных и могут использоваться для диагностики сбоев приложений и анализа сетевого трафика.

Можно также использовать AWS CloudTrail для записи вызовов API Application Load Balancer в аккаунте и доставки файлов журналов. История вызовов API позволяет выполнять анализ безопасности, отслеживать изменения ресурсов и аудит соответствия.

Защита от удаления
Можно включить для Application Load Balancer защиту от удаления, чтобы предотвратить возможность его случайного удаления.

Отслеживание запросов
Application Load Balancer вставляет новый пользовательский идентификатор «X-Amzn-Trace-Id» HTTP-заголовка для всех запросов, поступающих в балансировщик нагрузки. Возможность отслеживания запросов позволяет отслеживать запрос по его уникальному ID, поскольку запрос проходит свой путь через различные сервисы, которые являются составляющими ваших веб-сайтов и распределенных приложений. Уникальный идентификатор отслеживания можно использовать для того, чтобы выявить любые проблемы с производительностью или синхронизацией в стеке приложения с детализацией на уровне отдельного запроса.

Web Application Firewall
Теперь можно использовать AWS WAF для защиты интернет-приложений на своих балансировщиках Application Load Balancer. AWS WAF – это брандмауэр для интернет-приложений, который позволяет защитить их от распространенных сетевых эксплойтов, способных повлиять на доступность приложения, создать угрозу безопасности или задействовать чрезмерное количество ресурсов.

Установка terraform в Unix/Linux

Установка крайне примитивная и я описал как это можно сделать тут:

Установка terraform в Unix/Linux

Так же, в данной статье, я создал скрипт для автоматической установки данного ПО. Он был протестирован на CentOS 6/7, Debian 8 и на Mac OS X. Все работает должным образом!

Чтобы получить помощь по использованию команд, выполните:

$ terraform
Usage: terraform [--version] [--help] <command> [args]

The available commands for execution are listed below.
The most common, useful commands are shown first, followed by
less common or more advanced commands. If you're just getting
started with Terraform, stick with the common commands. For the
other commands, please read the help and docs before usage.

Common commands:
    apply              Builds or changes infrastructure
    console            Interactive console for Terraform interpolations
    destroy            Destroy Terraform-managed infrastructure
    env                Workspace management
    fmt                Rewrites config files to canonical format
    get                Download and install modules for the configuration
    graph              Create a visual graph of Terraform resources
    import             Import existing infrastructure into Terraform
    init               Initialize a Terraform working directory
    output             Read an output from a state file
    plan               Generate and show an execution plan
    providers          Prints a tree of the providers used in the configuration
    push               Upload this Terraform module to Atlas to run
    refresh            Update local state file against real resources
    show               Inspect Terraform state or plan
    taint              Manually mark a resource for recreation
    untaint            Manually unmark a resource as tainted
    validate           Validates the Terraform files
    version            Prints the Terraform version
    workspace          Workspace management

All other commands:
    debug              Debug output management (experimental)
    force-unlock       Manually unlock the terraform state
    state              Advanced state management

Приступим к использованию!

Работа с AWS ALB и Terraform в Unix/Linux

У меня есть папка terraform, в ней у меня будут лежать провайдеры с которыми я буду работать. Т.к в этом примере я буду использовать AWS, то создам данную папку и перейду в нее. Далее, в этой папке, стоит создать:

$ mkdir examples modules

В папке examples, я буду хранить так званые «плейбуки» для разварачивания различных служб, например — zabbix-server, grafana, web-серверы и так далее. В modules директории, я буду хранить все необходимые модули.

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

$  mkdir modules/alb

Переходим в нее:

$ cd modules/alb

Открываем файл:

$ vim alb.tf

В данный файл, вставляем:

#---------------------------------------------------
# Create AWS ALB
#---------------------------------------------------
resource "aws_lb" "alb" {
    #name_prefix        = "${var.name_prefix}-"
    name                = "${lower(var.name)}-alb-${lower(var.environment)}"
    security_groups     = ["${var.security_groups}"]
    subnets             = ["${var.subnets}"]
    internal            = "${var.lb_internal}"

    enable_deletion_protection  = "${var.enable_deletion_protection}"
    load_balancer_type          = "${var.load_balancer_type}"
    idle_timeout                = "${var.idle_timeout}"
    ip_address_type             = "${var.ip_address_type}"

    access_logs         = ["${var.access_logs}"]

    timeouts {
        create  = "${var.timeouts_create}"
        update  = "${var.timeouts_update}"
        delete  = "${var.timeouts_delete}"
    }

    lifecycle {
        create_before_destroy = true
    }

    tags {
        Name            = "${lower(var.name)}-alb-${lower(var.environment)}"
        Environment     = "${var.environment}"
        Orchestration   = "${var.orchestration}"
        Createdby       = "${var.createdby}"
    }
}
#---------------------------------------------------
# Create AWS LB target group
#---------------------------------------------------
resource "aws_lb_target_group" "alb_target_group" {
    name                 = "${lower(var.name)}-alb-tg-${lower(var.environment)}"
    port                 = "${var.backend_port}"
    protocol             = "${upper(var.backend_protocol)}"
    vpc_id               = "${var.vpc_id}"
    target_type          = "${var.target_type}"
    deregistration_delay = "${var.deregistration_delay}"

    tags {
        Name            = "${lower(var.name)}-alb-tg-${lower(var.environment)}"
        Environment     = "${var.environment}"
        Orchestration   = "${var.orchestration}"
        Createdby       = "${var.createdby}"
    }

    health_check {
        interval            = "${var.health_check_interval}"
        path                = "${var.health_check_path}"
        port                = "${var.health_check_port}"
        healthy_threshold   = "${var.health_check_healthy_threshold}"
        unhealthy_threshold = "${var.health_check_unhealthy_threshold}"
        timeout             = "${var.health_check_timeout}"
        protocol            = "${var.backend_protocol}"
        matcher             = "${var.health_check_matcher}"
    }
    stickiness {
        type            = "lb_cookie"
        cookie_duration = "${var.cookie_duration}"
        enabled         = "${var.cookie_duration != 1 ? true : false}"
    }
}
#---------------------------------------------------
# Create AWS LB listeners
#---------------------------------------------------
resource "aws_lb_listener" "frontend_http" {
    count               = "${trimspace(element(split(",", var.alb_protocols), 1)) == "HTTP" || trimspace(element(split(",", var.alb_protocols), 2)) == "HTTP" ? 1 : 0}"

    load_balancer_arn   = "${aws_lb.alb.arn}"
    port                = "80"
    protocol            = "HTTP"

    "default_action" {
        target_group_arn    = "${aws_lb_target_group.alb_target_group.arn}"
        type                = "forward"
    }

    depends_on = ["aws_lb.alb","aws_lb_target_group.alb_target_group"]
}

resource "aws_lb_listener" "frontend_https" {
    count               = "${trimspace(element(split(",", var.alb_protocols), 1)) == "HTTPS" || trimspace(element(split(",", var.alb_protocols), 2)) == "HTTPS" ? 1 : 0}"

    load_balancer_arn   = "${aws_lb.alb.arn}"
    port                = 443
    protocol            = "HTTPS"
    certificate_arn     = "${var.certificate_arn}"
    ssl_policy          = "ELBSecurityPolicy-2016-08"
    default_action {
        target_group_arn    = "${aws_lb_target_group.alb_target_group.arn}"
        type                = "forward"
    }

    depends_on = ["aws_lb.alb","aws_lb_target_group.alb_target_group"]
}
#---------------------------------------------------
# Create AWS LB target group attachment
#---------------------------------------------------
resource "aws_lb_target_group_attachment" "alb_target_group_attachment" {
    #count               = "${length(var.target_ids)}"

    #availability_zone   = "all"
    target_group_arn    = "${aws_lb_target_group.alb_target_group.arn}"
    target_id           = "${element(var.target_ids, 0)}"
    #target_id           = "${element(var.target_ids, count.index)}"
    #target_id           = "${var.target_ids[count.index]}"
    port                = "${var.backend_port}"

    depends_on = ["aws_lb.alb","aws_lb_target_group.alb_target_group"]
}

Открываем файл:

$ vim variables.tf

И прописываем:

#-----------------------------------------------------------
# Global or/and default variables
#-----------------------------------------------------------
variable "name" {
  description = "Name to be used on all resources as prefix"
  default     = "TEST-ALB"
}

variable "region" {
  description = "The region where to deploy this code (e.g. us-east-1)."
  default     = "us-east-1"
}

variable "environment" {
    description = "Environment for service"
    default     = "STAGE"
}

variable "orchestration" {
    description = "Type of orchestration"
    default     = "Terraform"
}

variable "createdby" {
    description = "Created by"
    default     = "Vitaliy Natarov"
}

variable "security_groups" {
    description = "A list of security group IDs to assign to the ELB. Only valid if creating an ELB within a VPC"
    type        = "list"
}

variable "subnets" {
    description = "A list of subnet IDs to attach to the ELB"
    type        = "list"
    default     = []
}

variable "lb_internal" {
    description = "If true, ALB will be an internal ALB"
    default     = false
}

variable "name_prefix" {
    description = "Creates a unique name beginning with the specified prefix. Conflicts with name"
    default     = "alb"
}

variable "enable_deletion_protection" {
    description = "If true, deletion of the load balancer will be disabled via the AWS API. This will prevent Terraform from deleting the load balancer. Defaults to false."
    default     = false
}

# Access logs
variable "access_logs" {
    description = "An access logs block. Uploads access logs to S3 bucket. Can be used just for network LB!"
    type        = "list"
    default     = []
}

variable "load_balancer_type" {
    description = "The type of load balancer to create. Possible values are application or network. The default value is application."
    default     = "application"
}

variable "idle_timeout" {
    description = "The time in seconds that the connection is allowed to be idle. Default: 60."
    default     = "60"
}

variable "ip_address_type" {
    description = "The type of IP addresses used by the subnets for your load balancer. The possible values are ipv4 and dualstack"
    default     = "ipv4"
}

variable "timeouts_create" {
    description = "Used for Creating LB. Default = 10mins"
    default     = "10m"
}

variable "timeouts_update" {
    description = "Used for LB modifications. Default = 10mins"
    default     = "10m"
}

variable "timeouts_delete" {
    description = "Used for LB destroying LB. Default = 10mins"
    default     = "10m"
}

variable "vpc_id" {
    description = "Set VPC ID for ?LB"
}

variable "alb_protocols" {
    description = "A comma delimited list of the protocols the ALB accepts. e.g.: HTTPS"
    default     = "HTTP,HTTPS"
}

variable "target_type" {
    description = "The type of target that you must specify when registering targets with this target group. The possible values are instance (targets are specified by instance ID) or ip (targets are specified by IP address). The default is instance. Note that you can't specify targets for a target group using both instance IDs and IP addresses. If the target type is ip, specify IP addresses from the subnets of the virtual private cloud (VPC) for the target group, the RFC 1918 range (10.0.0.0/8, 172.16.0.0/12, and 192.168.0.0/16), and the RFC 6598 range (100.64.0.0/10). You can't specify publicly routable IP addresses"
    default     = "instance"
}

variable "deregistration_delay" {
    description = "The amount time for Elastic Load Balancing to wait before changing the state of a deregistering target from draining to unused. The range is 0-3600 seconds. The default value is 300 seconds."
    default     = "300"
}

variable "backend_port" {
    description = "The port the service on the EC2 instances listen on."
    default     = 80
}

variable "backend_protocol" {
    description = "The protocol the backend service speaks. Options: HTTP, HTTPS, TCP, SSL (secure tcp)."
    default     = "HTTP"
}

variable "target_ids" {
    description = "The ID of the target. This is the Instance ID for an instance, or the container ID for an ECS container. If the target type is ip, specify an IP address."
    type        = "list"
    #default     = []
}

variable "certificate_arn" {
    description = "The ARN of the SSL Certificate. e.g. 'arn:aws:iam::XXXXXXXXXXX:server-certificate/ProdServerCert'"
    default     = ""
}

variable "health_check_healthy_threshold" {
    description = "Number of consecutive positive health checks before a backend instance is considered healthy."
    default     = 3
}

variable "health_check_interval" {
    description = "Interval in seconds on which the health check against backend hosts is tried."
    default     = 10
}

variable "health_check_path" {
    description = "The URL the ELB should use for health checks. e.g. /health"
    default     = "/"
}

variable "health_check_port" {
    description = "The port used by the health check if different from the traffic-port."
    default     = "traffic-port"
}

variable "health_check_timeout" {
    description = "Seconds to leave a health check waiting before terminating it and calling the check unhealthy."
    default     = 5
}

variable "health_check_unhealthy_threshold" {
    description = "Number of consecutive positive health checks before a backend instance is considered unhealthy."
    default     = 3
}

variable "health_check_matcher" {
    description = "The HTTP codes that are a success when checking TG health."
    default     = "200-299"
}

variable "cookie_duration" {
    description = "If load balancer connection stickiness is desired, set this to the duration in seconds that cookie should be valid (e.g. 300). Otherwise, if no stickiness is desired, leave the default."
    default     = 1
}

Собственно в этом файле храняться все переменные. Спасибо кэп!

Открываем последний файл:

$ vim outputs.tf

И в него вставить нужно следующие строки:

output "lb_name" {
    description = ""
    value       = "${aws_lb.alb.name}"
}

output "lb_arn" {
    description = "ARN of the lb itself. Useful for debug output, for example when attaching a WAF."
    value       = "${aws_lb.alb.arn}"
}

output "lb_arn_suffix" {
    description = "ARN suffix of our lb - can be used with CloudWatch"
    value       = "${aws_lb.alb.arn_suffix}"
}

output "lb_dns_name" {
    description = "The DNS name of the lb presumably to be used with a friendlier CNAME."
    value       = "${aws_lb.alb.dns_name}"
}

output "lb_id" {
    description = "The ID of the lb we created."
    value       = "${aws_lb.alb.id}"
}

output "lb_zone_id" {
    description = "The zone_id of the lb to assist with creating DNS records."
    value       = "${aws_lb.alb.zone_id}"
}

output "lb_listener_https_arn" {
    description = "The ARN of the HTTPS lb Listener we created."
    value       = "${element(concat(aws_lb_listener.frontend_https.*.arn, list("")), 0)}"
}

output "lb_listener_http_arn" {
    description = "The ARN of the HTTP lb Listener we created."
    value       = "${element(concat(aws_lb_listener.frontend_http.*.arn, list("")), 0)}"
}

output "lb_listener_https_id" {
    description = "The ID of the lb Listener we created."
    value       = "${element(concat(aws_lb_listener.frontend_https.*.id, list("")), 0)}"
}

output "lb_listener_http_id" {
    description = "The ID of the lb Listener we created."
    value       = "${element(concat(aws_lb_listener.frontend_http.*.id, list("")), 0)}"
}

output "target_group_arn" {
    description = "ARN of the target group. Useful for passing to your Auto Scaling group module."
    value       = "${aws_lb_target_group.alb_target_group.arn}"
}

Переходим теперь в папку aws/examples и создадим еще одну папку для проверки написанного чуда:

$ mkdir alb && cd $_

Внутри созданной папки открываем файл:

$ vim main.tf

И вставим в него следующий код:

#
# MAINTAINER Vitaliy Natarov "vitaliy.natarov@yahoo.com"
#
terraform {
  required_version = "> 0.9.0"
}
provider "aws" {
    region                  = "us-east-1"
    shared_credentials_file = "${pathexpand("~/.aws/credentials")}"
    profile                 = "default"
}
module "iam" {
    source                          = "../../modules/iam"
    name                            = "My-Security"
    region                          = "us-east-1"
    environment                     = "PROD"

    aws_iam_role-principals         = [
        "ec2.amazonaws.com",
    ]
    aws_iam_policy-actions           = [
        "cloudwatch:GetMetricStatistics",
        "logs:DescribeLogStreams",
        "logs:GetLogEvents",
        "elasticache:Describe*",
        "rds:Describe*",
        "rds:ListTagsForResource",
        "ec2:DescribeAccountAttributes",
        "ec2:DescribeAvailabilityZones",
        "ec2:DescribeSecurityGroups",
        "ec2:DescribeVpcs",
        "ec2:Owner",
    ]
}
module "vpc" {
    source                              = "../../modules/vpc"
    name                                = "My"
    environment                         = "PROD"
    # VPC
    instance_tenancy                    = "default"
    enable_dns_support                  = "true"
    enable_dns_hostnames                = "true"
    assign_generated_ipv6_cidr_block    = "false"
    enable_classiclink                  = "false"
    vpc_cidr                            = "172.31.0.0/16"
    private_subnet_cidrs                = ["172.31.32.0/20", "172.31.48.0/20"]
    public_subnet_cidrs                 = ["172.31.80.0/20"]
    availability_zones                  = ["us-east-1a", "us-east-1e"]
    enable_all_egress_ports             = "true"
    allowed_ports                       = ["8080", "3306", "443", "80"]

    map_public_ip_on_launch             = "true"

    #Internet-GateWay
    enable_internet_gateway             = "true"
    #NAT
    enable_nat_gateway                  = "false"
    single_nat_gateway                  = "true"
    #VPN
    enable_vpn_gateway                  = "false"
    #DHCP
    enable_dhcp_options                 = "false"
    # EIP
    enable_eip                          = "false"
}
module "ec2" {
    source                              = "../../modules/ec2"
    name                                = "TEST-Machine"
    region                              = "us-east-1"
    environment                         = "PROD"
    number_of_instances                 = 1
    ec2_instance_type                   = "t2.micro"
    enable_associate_public_ip_address  = "true"
    disk_size                           = "8"
    tenancy                             = "${module.vpc.instance_tenancy}"
    iam_instance_profile                = "${module.iam.instance_profile_id}"
    subnet_id                           = "${element(module.vpc.vpc-publicsubnet-ids, 0)}"
    #subnet_id                           = "${element(module.vpc.vpc-privatesubnet-ids, 0)}"
    #subnet_id                           = ["${element(module.vpc.vpc-privatesubnet-ids)}"]
    vpc_security_group_ids              = ["${module.vpc.security_group_id}"]

    monitoring                          = "true"
}
#module "kms" {
#    source               = "../../modules/kms"
#    name                 = "TEST-KMS"
#    environment          = "PROD"
#
#    aws_account_id       = "XXXXXXXXXXXXXXXXX"
#}
#module "s3" {
#    source                              = "../../modules/s3"
#    name                                = "My-backet"
#    environment                         = "PROD"
#
#    #
#    s3_acl          = "log-delivery-write"  #"private"
#    force_destroy   = "true"
#    # Allow public web-site (Static website hosting)
#    website         = [
#    {
#        index_document = "index.html"
#        error_document = "error.html"
#        #redirect_all_requests_to = "https://s3-website.linux-notes.org"
#    },
#    ]
#    # Use cors rules
#    cors_rule       = [
#    {
#        allowed_headers = ["*"]
#        allowed_methods = ["PUT", "POST"]
#        allowed_origins = ["https://s3-website.linux-notes.org"]
#        expose_headers  = ["ETag"]
#        max_age_seconds = 3000
#    },
#    ]
#
#    kms_master_key_id = "arn:aws:kms:${module.kms.region}:${module.kms.aws_account_id}:key/${module.kms.kms_key_id}"
#}
module "alb" {
    source                  = "../../modules/alb"
    name                    = "App-Load-Balancer"
    region                  = "us-east-1"
    environment             = "PROD"

    load_balancer_type          = "application"
    security_groups             = ["${module.vpc.security_group_id}", "${module.vpc.default_security_group_id}"]
    subnets                     = ["${module.vpc.vpc-privatesubnet-ids}"]
    vpc_id                      = "${module.vpc.vpc_id}"
    enable_deletion_protection  = false

    backend_protocol    = "HTTP"
    alb_protocols       = "HTTP"

    target_ids          = ["${module.ec2.instance_ids}"]

    #access_logs = [
    #    {
    #        enabled         = true
    #        bucket          = "${module.s3.bucket_name}"
    #        prefix          = "log"
    #    },
    #]

}

Еще полезности:

Работа с AWS IAM и Terraform в Unix/Linux

Работа с AWS VPC и Terraform в Unix/Linux

Работа с AWS S3 и Terraform в Unix/Linux

Работа с AWS EC2 и Terraform в Unix/Linux

Работа с AWS ASG(auto scaling group) и Terraform в Unix/Linux

Работа с AWS ELB и Terraform в Unix/Linux

Работа с AWS Route53 и Terraform в Unix/Linux

Работа с AWS RDS и Terraform в Unix/Linux

Работа с AWS SNS и Terraform в Unix/Linux

Работа с AWS SQS и Terraform в Unix/Linux

Работа с AWS KMS и Terraform в Unix/Linux

Работа с AWS NLB и Terraform в Unix/Linux

Работа с AWS CloudWatch и Terraform в Unix/Linux

Все уже написано и готово к использованию. Ну что, начнем тестирование. В папке с вашим плейбуком, выполняем:

$ terraform init

Этим действием я инициализирую проект. Затем, подтягиваю модуль:

$ terraform get

PS: Для обновление изменений в самом модуле, можно выполнять:

$ terraform get -update

Проверим валидацию:

$ terraform validate

Запускем прогон:

$ terraform plan

Мне вывело что все у меня хорошо и можно запускать деплой:

$ terraform apply

Как видно с вывода, — все прошло гладко! Чтобы удалить созданное творение, можно выполнить:

$ terraform destroy

Весь материал аплоаджу в github аккаунт для удобства использования:

$ git clone https://github.com/SebastianUA/terraform.git

Вот и все на этом. Данная статья «Работа с AWS ALB и Terraform в Unix/Linux» завершена.

The post Работа с AWS ALB и Terraform в Unix/Linux first appeared on linux-notes.org.]]>
https://linux-notes.org/rabota-s-aws-alb-i-terraform-v-unix-linux/feed/ 4
Page_c76a3fcf https://linux-notes.org/rabota-s-aws-cloudwatch-i-terraform-v-unix-linux/ https://linux-notes.org/rabota-s-aws-cloudwatch-i-terraform-v-unix-linux/#respond Thu, 15 Feb 2018 14:22:12 +0000 http://linux-notes.org/?p=15184 Работа с AWS CloudWatch и Terraform в Unix/Linux Amazon CloudWatch – это сервис мониторинга облачных ресурсов AWS и приложений, которые вы запускаете с их помощью. Amazon CloudWatch можно использовать для сбора и отслеживания метрик, накопления и анализа файлов журналов, создания предупреждений, а также автоматического реагирования на изменения ресурсов AWS. Amazon CloudWatch может использоваться для мониторинга […]

The post Работа с AWS CloudWatch и Terraform в Unix/Linux first appeared on linux-notes.org.]]>

Работа с AWS CloudWatch и Terraform в Unix/Linux

Amazon CloudWatch – это сервис мониторинга облачных ресурсов AWS и приложений, которые вы запускаете с их помощью. Amazon CloudWatch можно использовать для сбора и отслеживания метрик, накопления и анализа файлов журналов, создания предупреждений, а также автоматического реагирования на изменения ресурсов AWS. Amazon CloudWatch может использоваться для мониторинга следующих ресурсов AWS: инстансов Amazon EC2, таблиц Amazon DynamoDB, инстансов Amazon RDS DB, а также для мониторинга пользовательских метрик приложений и сервисов и любых логов ваших приложений. Можно использовать Amazon CloudWatch для получения сводной информации о системе, включающей в себя информацию об используемых ресурсах, производительности приложений и общем состоянии системы. Эти данные применяются для оперативного реагирования и обеспечения стабильной работы приложений.

Установка terraform в Unix/Linux

Установка крайне примитивная и я описал как это можно сделать тут:

Установка terraform в Unix/Linux

Так же, в данной статье, я создал скрипт для автоматической установки данного ПО. Он был протестирован на CentOS 6/7, Debian 8 и на Mac OS X. Все работает должным образом!

Чтобы получить помощь по использованию команд, выполните:

$ terraform
Usage: terraform [--version] [--help] <command> [args]

The available commands for execution are listed below.
The most common, useful commands are shown first, followed by
less common or more advanced commands. If you're just getting
started with Terraform, stick with the common commands. For the
other commands, please read the help and docs before usage.

Common commands:
    apply              Builds or changes infrastructure
    console            Interactive console for Terraform interpolations
    destroy            Destroy Terraform-managed infrastructure
    env                Workspace management
    fmt                Rewrites config files to canonical format
    get                Download and install modules for the configuration
    graph              Create a visual graph of Terraform resources
    import             Import existing infrastructure into Terraform
    init               Initialize a Terraform working directory
    output             Read an output from a state file
    plan               Generate and show an execution plan
    providers          Prints a tree of the providers used in the configuration
    push               Upload this Terraform module to Atlas to run
    refresh            Update local state file against real resources
    show               Inspect Terraform state or plan
    taint              Manually mark a resource for recreation
    untaint            Manually unmark a resource as tainted
    validate           Validates the Terraform files
    version            Prints the Terraform version
    workspace          Workspace management

All other commands:
    debug              Debug output management (experimental)
    force-unlock       Manually unlock the terraform state
    state              Advanced state management

Приступим к использованию!

Работа с AWS CloudWatch и Terraform в Unix/Linux

У меня есть папка terraform, в ней у меня будут лежать провайдеры с которыми я буду работать. Т.к в этом примере я буду использовать AWS, то создам данную папку и перейду в нее. Далее, в этой папке, стоит создать:

$ mkdir examples modules

В папке examples, я буду хранить так званые «плейбуки» для разварачивания различных служб, например — zabbix-server, grafana, web-серверы и так далее. В modules директории, я буду хранить все необходимые модули.

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

$  mkdir modules/cloudwatch

Переходим в нее:

$ cd modules/cloudwatch

Открываем файл:

$ vim cloudwatch.tf

В данный файл, вставляем:

#---------------------------------------------------
# Create AWS CloudWatch metric alarm
#---------------------------------------------------
resource "aws_cloudwatch_metric_alarm" "cw_metric_alarm" {
    count               = "${var.alarm_name != "" ? 1 : 0}"

    alarm_name          = "${var.alarm_name}"
    comparison_operator = "${var.comparison_operator}"
    evaluation_periods  = "${var.evaluation_periods}"
    metric_name         = "${var.metric_name}"
    namespace           = "${var.namespace}"
    period              = "${var.period}"
    threshold           = "${var.threshold}"

    datapoints_to_alarm = "${var.datapoints_to_alarm}"
    actions_enabled     = "${var.actions_enabled}"
    dimensions          = "${var.dimensions}"

    alarm_description = "${var.alarm_description}"
    alarm_actions     = ["${var.alarm_actions}"]

    insufficient_data_actions   = "${var.insufficient_data_actions}"
    ok_actions                  = "${var.ok_actions}"

    #extended_statistic                      = "${var.extended_statistic}"
    #evaluate_low_sample_count_percentiles   = "${var.evaluate_low_sample_count_percentiles}"
    statistic                               = "${var.statistic}"
    treat_missing_data                      = "${var.treat_missing_data}"
}
#---------------------------------------------------
# Create AWS CloudWatch event permission
#---------------------------------------------------
resource "aws_cloudwatch_event_permission" "cw_event_permission" {
    count       = "${var.principal_for_event_permission != "" ? 1 : 0}"

    principal    = "${var.principal_for_event_permission}"
    statement_id = "${var.statement_id_for_event_permission}"
    action      = "${var.action_for_event_permission}"
}
#---------------------------------------------------
# Create AWS CloudWatch event rule
#---------------------------------------------------
resource "aws_cloudwatch_event_rule" "cw_event_rule" {
    count       = "${var.arn_for_cloudwatch_event_target != "" ? 1 : 0}"
    name        = "capture-aws-sign-in"
    description = "Capture each AWS Console Sign In"

    event_pattern = <<PATTERN
        {
            "detail-type": [
                "AWS Console Sign In via CloudTrail"
            ]
        }
    PATTERN
    is_enabled  = "${var.is_enabled_for_event_rule}"
}

resource "aws_cloudwatch_event_target" "cloudwatch_event_target" {
    count   = "${var.arn_for_cloudwatch_event_target != "" ? 1 : 0}"

    rule      = "${aws_cloudwatch_event_rule.cw_event_rule.name}"
    target_id = "${var.target_id_for_cloudwatch_event_target}"
    arn       = "${var.arn_for_cloudwatch_event_target}"
}
#---------------------------------------------------
# Create AWS CloudWatch Create AWS dashboard
#---------------------------------------------------
resource "aws_cloudwatch_dashboard" "cloudwatch_dashboard" {
    count           = "${var.cloudwatch_dashboard_name !="" ? 1 : 0}"

    dashboard_name  = "${var.cloudwatch_dashboard_name}"
    dashboard_body  = <<EOF
 {
   "widgets": [
       {
          "type":"metric",
          "x":0,
          "y":0,
          "width":12,
          "height":6,
          "properties":{
             "metrics":[
                [
                   "AWS/EC2",
                   "CPUUtilization",
                   "InstanceId",
                   "i-012345"
                ]
             ],
             "period":300,
             "stat":"Average",
             "region":"us-east-1",
             "title":"EC2 Instance CPU"
          }
       },
       {
          "type":"text",
          "x":0,
          "y":7,
          "width":3,
          "height":3,
          "properties":{
             "markdown":"Hello world"
          }
       }
   ]
 }
 EOF
}
#---------------------------------------------------
# Create AWS CloudWatch LOG group
#---------------------------------------------------
resource "aws_cloudwatch_log_group" "cw_log_group" {
    count               = "${var.name_for_cloudwatch_log_group !="" ? 1 : 0}"

    name                = "${var.name_for_cloudwatch_log_group}"
    retention_in_days   = "${var.retention_in_days_for_cloudwatch_log_group}"
    kms_key_id          = "${var.kms_key_id_for_cloudwatch_log_group}"


    tags {
        Name            = "${var.name}-cw-log-group-${var.environment}"
        Environment     = "${var.environment}"
        Orchestration   = "${var.orchestration}"
        Createdby       = "${var.createdby}"
    }
}
#---------------------------------------------------
# Create AWS CloudWatch LOG metric filter
#---------------------------------------------------
resource "aws_cloudwatch_log_metric_filter" "cloudwatch_log_metric_filter" {
    count          = "${var.name_for_cloudwatch_log_group !="" ? 1 : 0}"

    name           = "${var.name_for_cloudwatch_log_metric_filter}"
    pattern        = "${var.pattern_for_cloudwatch_log_metric_filter}"
    log_group_name = "${aws_cloudwatch_log_group.cw_log_group.name}"

    metric_transformation {
        name      = "${var.name_for_metric_transformation}"
        namespace = "${var.namespace_for_metric_transformation}"
        value     = "${var.value_for_metric_transformation}"
    }
}
#---------------------------------------------------
# Create AWS CloudWatch LOG stream
#---------------------------------------------------
resource "aws_cloudwatch_log_stream" "cloudwatch_log_stream" {
    count          = "${var.name_for_cloudwatch_log_stream !="" ? 1 : 0}"

    name           = "${var.name_for_cloudwatch_log_stream}"
    log_group_name = "${aws_cloudwatch_log_group.cw_log_group.name}"
}

Открываем файл:

$ vim variables.tf

И прописываем:

#-----------------------------------------------------------
# Global or/and default variables
#-----------------------------------------------------------
variable "name" {
  description = "Name to be used on all resources as prefix"
  default     = "TEST-RDS"
}

variable "region" {
  description = "The region where to deploy this code (e.g. us-east-1)."
  default     = "us-east-1"
}

variable "environment" {
    description = "Environment for service"
    default     = "STAGE"
}

variable "orchestration" {
    description = "Type of orchestration"
    default     = "Terraform"
}

variable "createdby" {
    description = "Created by"
    default     = "Vitaliy Natarov"
}

variable "alarm_name" {
  description = "The descriptive name for the alarm. This name must be unique within the user's AWS account"
  default     = ""
}

variable "comparison_operator" {
  description = "The arithmetic operation to use when comparing the specified Statistic and Threshold. The specified Statistic value is used as the first operand. Either of the following is supported: GreaterThanOrEqualToThreshold, GreaterThanThreshold, LessThanThreshold, LessThanOrEqualToThreshold."
  default     = "GreaterThanOrEqualToThreshold"
}

variable "evaluation_periods" {
    description = "The number of periods over which data is compared to the specified threshold."
    default     = "2"
}

variable "metric_name" {
    description = "The name for the alarm's associated metric (ex: CPUUtilization)"
    default     = "CPUUtilization"
}

variable "namespace" {
    description = "The namespace for the alarm's associated metric (ex: AWS/EC2)"
    default     = "AWS/EC2"
}

variable "period" {
    description = "The period in seconds over which the specified statistic is applied."
    default     = "120"
}

variable "statistic" {
    description = "The statistic to apply to the alarm's associated metric. Either of the following is supported: SampleCount, Average, Sum, Minimum, Maximum"
    default     = "Average"
}

variable "threshold" {
    description = "The value against which the specified statistic is compared"
    default     = "80"
}

variable "actions_enabled" {
    description = "Indicates whether or not actions should be executed during any changes to the alarm's state. Defaults to true."
    default     = "true"
}

variable "alarm_actions" {
    description = "The list of actions to execute when this alarm transitions into an ALARM state from any other state. Each action is specified as an Amazon Resource Number (ARN)."
    type        = "list"
    default     = []
}

variable "alarm_description" {
    description = "The description for the alarm."
    default     = ""
}

variable "datapoints_to_alarm" {
    description = "The number of datapoints that must be breaching to trigger the alarm."
    default     = "0"
}

variable "dimensions" {
    description = "List of the dimensions for the alarm's associated metric"
    type        = "list"
    default     = []
}

variable "insufficient_data_actions" {
    description = "The list of actions to execute when this alarm transitions into an INSUFFICIENT_DATA state from any other state. Each action is specified as an Amazon Resource Number (ARN)."
    type        = "list"
    default     = []
}

variable "ok_actions" {
    description = "The list of actions to execute when this alarm transitions into an OK state from any other state. Each action is specified as an Amazon Resource Number (ARN)."
    type        = "list"
    default     = []
}

variable "unit" {
    description = "The unit for the alarm's associated metric."
    default     = ""
}

variable "extended_statistic" {
    description = "The percentile statistic for the metric associated with the alarm. Specify a value between p0.0 and p100."
    default     = "p100"
}

variable "treat_missing_data" {
    description = "Sets how this alarm is to handle missing data points. The following values are supported: missing, ignore, breaching and notBreaching. Defaults to missing."
    default     = "missing"
}

variable "evaluate_low_sample_count_percentiles" {
    description = "Used only for alarms based on percentiles. If you specify ignore, the alarm state will not change during periods with too few data points to be statistically significant. If you specify evaluate or omit this parameter, the alarm will always be evaluated and possibly change state no matter how many data points are available. The following values are supported: ignore, and evaluate."
    default     = "ignore"
}

variable "principal_for_event_permission" {
    description = "The 12-digit AWS account ID that you are permitting to put events to your default event bus. Specify * to permit any account to put events to your default event bus."
    default     = ""
}

variable "statement_id_for_event_permission" {
    description = "An identifier string for the external account that you are granting permissions to."
    default     = "DevAccountAccess"
}

variable "action_for_event_permission" {
    description = "The action that you are enabling the other account to perform. Defaults to events:PutEvents."
    default     = "events:PutEvents"
}

variable "is_enabled_for_event_rule" {
    description = "Whether the rule should be enabled (defaults to true)."
    default     = "true"
}

variable "arn_for_cloudwatch_event_target" {
    description = "The Amazon Resource Name (ARN) of the rule."
    default     = ""
}

variable "target_id_for_cloudwatch_event_target" {
    description = "target ID"
    default     = "SendToSNS"
}

variable "cloudwatch_dashboard_name" {
    description = "The name of the dashboard."
    default     = ""
}
variable "name_for_cloudwatch_log_group" {
    description = "The name of the log group. If omitted, Terraform will assign a random, unique name."
    default     = ""
}

variable "retention_in_days_for_cloudwatch_log_group" {
    description = "Specifies the number of days you want to retain log events in the specified log group."
    default     = "0"
}

variable "kms_key_id_for_cloudwatch_log_group" {
    description = "The ARN of the KMS Key to use when encrypting log data. Please note, after the AWS KMS CMK is disassociated from the log group, AWS CloudWatch Logs stops encrypting newly ingested data for the log group. All previously ingested data remains encrypted, and AWS CloudWatch Logs requires permissions for the CMK whenever the encrypted data is requested."
    default     = ""
}

variable "name_for_cloudwatch_log_metric_filter" {
    description = "A name for the metric filter."
    default     = "metric-filter"
}

variable "pattern_for_cloudwatch_log_metric_filter" {
    description = "A valid CloudWatch Logs filter pattern for extracting metric data out of ingested log events."
    default     = ""
}

variable "name_for_metric_transformation" {
    description = "The name of the CloudWatch metric to which the monitored log information should be published (e.g. ErrorCount)"
    default     = "ErrorCount"
}

variable "namespace_for_metric_transformation" {
    description = "The destination namespace of the CloudWatch metric."
    default     = "NameSpace"
}

variable "value_for_metric_transformation" {
    description = "What to publish to the metric. For example, if you're counting the occurrences of a particular term like 'Error', the value will be '1' for each occurrence. If you're counting the bytes transferred the published value will be the value in the log event."
    default     = "1"
}

variable "name_for_cloudwatch_log_stream" {
    description = "The name of the log stream. Must not be longer than 512 characters and must not contain :"
    default     = ""
}

Собственно в этом файле храняться все переменные. Спасибо кэп!

Открываем последний файл:

$ vim outputs.tf

И в него вставить нужно следующие строки:

output "cw_metric_alarm_ids" {
    description = ""
    value       = "${aws_cloudwatch_metric_alarm.cw_metric_alarm.*.id}"
}

output "cw_event_permission_ids" {
    description = ""
    value       = "${aws_cloudwatch_event_permission.cw_event_permission.*.id}"
}

output "cw_event_rule_ids" {
    description = ""
    value       = "${aws_cloudwatch_event_rule.cw_event_rule.*.id}"
}

output "cw_event_rule_names" {
    description = ""
    value       = "${aws_cloudwatch_event_rule.cw_event_rule.*.name}"
}

output "cloudwatch_dashboard_ids" {
    description = ""
    value       = "${aws_cloudwatch_dashboard.cloudwatch_dashboard.*.id}"
}

output "cloudwatch_dashboard_names" {
    description = ""
    value       = "${aws_cloudwatch_dashboard.cloudwatch_dashboard.*.name}"
}

output "cw_log_group_ids" {
    description = ""
    value       = "${aws_cloudwatch_log_group.cw_log_group.*.id}"
}

output "cw_log_group_names" {
    description = ""
    value       = "${aws_cloudwatch_log_group.cw_log_group.*.name}"
}

output "cloudwatch_log_metric_filter_ids" {
    description = ""
    value       = "${aws_cloudwatch_log_metric_filter.cloudwatch_log_metric_filter.*.ids}"
}

output "cloudwatch_log_metric_filter_names" {
    description = ""
    value       = "${aws_cloudwatch_log_metric_filter.cloudwatch_log_metric_filter.*.names}"
}

output "cloudwatch_log_stream_ids" {
    description = ""
    value       = "${aws_cloudwatch_log_stream.cloudwatch_log_stream.*.id}"
}

output "cloudwatch_log_stream_names" {
    description = ""
    value       = "${aws_cloudwatch_log_stream.cloudwatch_log_stream.*.name}"
}

Переходим теперь в папку aws/examples и создадим еще одну папку для проверки написанного чуда:

$ mkdir cloudwatch && cd $_

Внутри созданной папки открываем файл:

$ vim main.tf

И вставим в него следующий код:

#
# MAINTAINER Vitaliy Natarov "vitaliy.natarov@yahoo.com"
#
terraform {
  required_version = "> 0.9.0"
}
provider "aws" {
    region  = "us-east-1"
    profile = "default"
}
module "cloudwatch" {
    source                  = "../../modules/cloudwatch"

    dimensions = [
        {
          AutoScalingGroupName = ""
          #AutoScalingGroupName = "${aws_autoscaling_group.bar.name}"
        }
    ]

    alarm_name          = "My first alarm"
    #alarm_description  = "Test description"
    #alarm_actions      = "${aws_autoscaling_policy.bat.arn}"

    #
    #principal_for_event_permission  = "XXXXXXXXXXXXXXX"

    #arn_for_cloudwatch_event_target = "arn:aws:sns:us-east-1:XXXXXXXXXXXXXXX:test-sns-sns-prod"
    #
    #name_for_cloudwatch_log_group   = "test-log-group"
    #
    #name_for_cloudwatch_log_stream  = "test-log-steam"
}

Еще полезности:

Работа с AWS IAM и Terraform в Unix/Linux

Работа с AWS VPC и Terraform в Unix/Linux

Работа с AWS S3 и Terraform в Unix/Linux

Работа с AWS EC2 и Terraform в Unix/Linux

Работа с AWS ASG(auto scaling group) и Terraform в Unix/Linux

Работа с AWS ELB и Terraform в Unix/Linux

Работа с AWS Route53 и Terraform в Unix/Linux

Работа с AWS RDS и Terraform в Unix/Linux

Работа с AWS SNS и Terraform в Unix/Linux

Работа с AWS SQS и Terraform в Unix/Linux

Работа с AWS KMS и Terraform в Unix/Linux

Работа с AWS NLB и Terraform в Unix/Linux

Все уже написано и готово к использованию. Ну что, начнем тестирование. В папке с вашим плейбуком, выполняем:

$ terraform init

Этим действием я инициализирую проект. Затем, подтягиваю модуль:

$ terraform get

PS: Для обновление изменений в самом модуле, можно выполнять:

$ terraform get -update

Проверим валидацию:

$ terraform validate

Запускем прогон:

$ terraform plan

Мне вывело что все у меня хорошо и можно запускать деплой:

$ terraform apply

Как видно с вывода, — все прошло гладко! Чтобы удалить созданное творение, можно выполнить:

$ terraform destroy

Весь материал аплоаджу в github аккаунт для удобства использования:

$ git clone https://github.com/SebastianUA/terraform.git

Вот и все на этом. Данная статья «Работа с AWS CloudWatch и Terraform в Unix/Linux» завершена.

The post Работа с AWS CloudWatch и Terraform в Unix/Linux first appeared on linux-notes.org.]]>
https://linux-notes.org/rabota-s-aws-cloudwatch-i-terraform-v-unix-linux/feed/ 0