Рубрики
Uncategorized

Зерно и колонны в соль

В первой статье в этой серии была представлена пример того, как настроить управление конфигурацией соли … Tagged с солью, соленой, DevOps, IAC.

Автоматизация вашей ИТ -среды с помощью соли (серия 3 частей)

Первая статья в этой серии прошел пример того, как настроить Соль Инструмент управления конфигурацией для автоматизации компьютерной инфраструктуры.

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

Зерна и столб используются солью для хранения данных о миньоне, которым он контролирует. Они оба в конце концов, магазин ключевых значений. На самом деле это то, что называется в Python A Словарь (Если вы любите Perl или Ruby, они известны как хэш ).

Например, ниже приведен пример некоторых зерен на альпийском миньоне, который мы создали в первой статье в серии:

ipv4:
    - 127.0.0.1
    - 172.25.0.3
ipv6:
kernel:
    Linux
kernelrelease:
    4.15.0-65-generic

Если вы хотите проверить все зерна, вы можете выполнить следующую команду в контейнере Docker Docker соль (чтобы получить оболочку, введите это в том же каталоге, когда вы сохраняете свой Docker Compose: Docker-Compose Salt Salt Bash ):

salt 'locomotive-*' grains.items

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

salt 'locomotive-*' pillar.items

В результате вы ничего не получите:

locomotive-03f0f2574592:
    ----------

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

Зерна генерируются и/или хранятся на самих миньонах. Данные о столбах генерируются и/или хранятся на мастере соли.

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

С другой стороны, зерна полезны для информации, которую вы не обязательно знаете, когда настраиваете миньон, такие как IP -адреса, операционная система, информация о ЦП и т. Д. Это также могут быть произвольные данные, например, роль, которую вы хотите настроить и сохранить на самом миньоне.

Например, вы могли бы на машине создать зерно, называемое роль с стоимостью WebServer Анкет Затем Мастер Соли может поднять это зерно, и оттуда решить, как его настроить, не изменяя ничего в файлах конфигурации соли. Данные о столбах для этой машины могут затем включать такую информацию, как лицензии на программное обеспечение, необходимые для конкретного приложения, пользователям позволили войти в веб -серверы и т. Д.

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

Большинство зерен, которые вам обычно нуждаются, создаются автоматически. Однако, если вы когда -нибудь окажетесь в месте, где вы хотите их настроить, вы можете сохранить их в файле конфигурации Minion на машине. Местоположение зависит от операционной системы, например, от систем UNIX, которые вы найдете в /и т.д./соль/миньон За исключением FreeBSD, где он хранится в /usr/local/etc/salt/minion Анкет На машинах Windows конфигурация найдена в C: \ salt \ conf \ minion Анкет

Файл конфигурации — это файл YAML, и вы можете добавить зерна В качестве корневого элемента в файле конфигурации с зернами, которые вы хотите сохранить. Например, вы можете добавить это в конфигурацию Minion:

grains:
  roles:
    - webserver

Это сделало бы зерно Роли Доступно в списке в качестве его значения, содержащий роль WebServer (это не обязательно должен быть список строк Но я пытаюсь выбрать структуру данных, применимая к контексту, и сервер может иметь несколько ролей, поэтому я бы использовал список для ролей).

Другое место, где вы можете хранить зерна, — это /и т.д./соль/зерна Анкет Мне нравится явная Так что мне нравится это место больше, чем конфигурация Minion. Это файл yaml Но если вы хотите использовать /и т.д./соль/зерна Вам не нужен корень зерна элемент. Итак, эквивалент /и т.д./соль/зерна Файл к указанному выше:

roles:
  - webserver

Давайте адаптируем пример из первого поста в этой серии и настроем зерна для двух соли миньонов.

Давайте создадим два файла зерна, один для нашего альпийского контейнера, а другой для контейнера Ubuntu, определяя роли для машин. Создайте файл с именем alpine.grains в том же месте, что и ваш Docker-compose.yml Файл (мы собираемся установить его позже). Вот содержимое alpine.grains файл:

roles:
  - locomotive
  - fortuneteller

Создайте аналогичный файл для контейнера Ubuntu с именем Ubuntu.grains с этим содержимым:

roles:
  - cow
  - fortuneteller

Теперь давайте обновим наш Docker-compose.yml Нам просто нужно установить два файла, которые мы создали в /и т.д./соль/зерна На обеих машинах, так что Docker-compose.yml Файл должен выглядеть так:

version: "3"
services:
  salt:
    image: salt-master
    volumes:
      - ./master.config:/etc/salt/master
      - ./states:/srv/salt
  alpine-minion:
    image: alpine-minion
      - ./alpine.grains:/etc/salt/grains
  ubuntu-minion:
    image: ubuntu-minion
    volumes:
      - ./ubuntu.grains:/etc/salt/grains

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

docker-compose up -d

Все еще запускаете контейнеры первого сообщения?

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

Если вы все еще используете одни и те же контейнеры, вы должны увидеть обновления миньонов (воссозданных), но не The Sale Master (это обновлена).

Если вы попытаетесь проверить вещи с солью Master сейчас, вы заметите, что он больше не управляет вашими солевыми миньонами. Причина в том, что потому, что мы воссоздали контейнеры Docker, у них теперь есть новый идентификатор Minion (в основном это новая машина). Так что, если вы не следуете этому руководству и не хотите поиграть, вам придется принять ключи, как показано в первом сообщении в блоге в серии.

Теперь мы готовы как -то использовать эти недавно определенные роли.

Нацеливание миньонов

Зерна очень полезны для миньонов. Помните в первой статье, как мы нацелились на машины, используя идентификатор Minion? Мы также можем нацелиться на них с помощью зерен.

Давайте обновим файл конфигурации для Master для соли для цели на основе зерен вместо идентификаторов Minion. Сначала давайте создадим специальный файл состояния для Фортуна программа Снимите линию в обоих Cow.sls и Locomotive.sls где мы говорим Солм установить Фортуна упаковка. Затем создайте аналогичный файл состояния с именем Fortune.sls :

install fortuneteller tools:
  pkg.installed:
    - pkgs:
      - fortune

Хорошо. Теперь мы можем изменить top.sls Файл в цель на основе зерен вместо идентификаторов миньонов. Образец для этого — сказать Ключ: значение . Затем вы сможете, прежде чем перечислить, какие файлы состояния должны включить, начнем с того, чтобы рассказать о том, что вы хотите соответствовать своему шаблону (в нашем случае зерно).

Итак, чтобы применить apache.sls файл в машины с роли WebServer Вы бы написали что -то вроде этого:

'roles:webserver':
  - match: grain
  - apache

Обратите внимание на ' вокруг Роли: WebServer Анкет Это так, что файл YAML обрабатывается правильно. Существует сокращенная версия, чтобы достичь того же самого. Вместо этого вы можете написать это:

'G@roles:webserver':
  - apache

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

base:
  'roles:cow':
    - match: grain
    - cow
  'roles:fortuneteller':
    - match: grain
    - fortune
  'roles:locomotive':
    - match: grain
    - locomotive

Логика в файлах состояния

Зерна также могут быть полезны в самих файлах состояния. Например, мы можем проверить операционную систему и делать разные вещи на основе операционной системы. Вы увидите больше об этом, когда мы пройдемся через шаблон в файлах соли, но, чтобы дать вам вкус, давайте решим проблему, которую мы столкнулись в первой статье серии, где машина Ubuntu установила пакеты в /usr/games/ Анкет

Чтобы решить эту проблему, мы поместим оператор IF, который проверяет ОС Зерно, чтобы увидеть, является ли это операционной системой Ubuntu. Если это так, то мы делаем символическую ссылку на /usr/bin . Нам нужно изменить все файлы состояния, потому что Ubuntu делает это со всеми пакетами.

Прежде чем изменить файлы, давайте сначала посмотрим, как мы ищем значение зерна в файле состояния. Зерно, которое мы собираемся проверить операционную систему, — это ОС зерно. Он становится доступным как зерна ['os'] (Если вы знаете Python, вы поймете, что это просто поиск словаря).

Итак, хитрость заключается в том, чтобы добавить Python Если Заявление внутри { % %} Затем включите конфигурации состояния, которые вы хотите, прежде чем закончить с помощью { % endif %} Анкет Я покрою это лучше в более позднем посте, но для начала Cow.sls должен иметь этот контент сейчас:

install cow tools:
  pkg.installed:
    - pkgs:
      - cowsay

{% if grains['os'] == 'Ubuntu' %}
make cowsay available on Ubuntu:
  file.symlink:
    - name: /usr/bin/cowsay
    - target: /usr/games/cowsay
{% endif %}

Чтобы немного рассказать об этом, сначала вы видите состояние, которое мы определили в первом посте серии и изменили несколько минут назад (чтобы удалить fortune ). Затем мы создаем наш оператор, который проверяет, если ОС Зерно равно Ubuntu . Если это так, то мы создаем состояние под названием Сделайте Cowsay доступным на Ubuntu Анкет В этом состоянии используется модуль состояния файла для создания символической ссылки на /usr/games/cowsay (цель) в /usr/bin/cowsay (определяется по имени символикой). Затем мы закрываем оператор IF.

Fortune.sls будет похожим

install fortuneteller tools:
  pkg.installed:
    - pkgs:
      - fortune

{% if grains['os'] == 'Ubuntu' %}
make fortune available on Ubuntu:
  file.symlink:
    - name: /usr/bin/fortune
    - target: /usr/games/fortune
{% endif %}

Так будет Locomotive.sls

install locomotive tools:
  pkg.installed:
    - pkgs:
      - sl

{% if grains['os'] == 'Ubuntu' %}
make sl available on Ubuntu:
  file.symlink:
    - name: /usr/bin/sl
    - target: /usr/games/sl
{% endif %}

Попробуйте конфигурацию на основе зерна

Давайте проверим нашу новую конфигурацию на основе зерна. Сначала давайте остановим и удалите все наши контейнеры Docker, потому что мы хотим свежий сланец (таким образом, мы также рассмотрим новые идентификаторы Minion, обсуждаемые ранее и легко удалили более старые контейнеры.

Введите эти команды Docker-Compose, чтобы получить контейнеры для остановки, удалить их, запустить новые и, наконец, введите оболочку Bash на мастер Соли (отвечая «да», когда его подсказывают):

docker-compose stop
docker-compose rm
docker-compose up -d
docker-compose exec salt bash

После того, как вы ввели оболочку Bash на новом соли Master, примите клавиши Minion с помощью этой команды (нажимая Enter для да, когда будет предложено):

salt-key -A

Теперь мы готовы проверить наше зерновое таргетинг в top.sls . Давайте применим штаты на все машины (нацеливая на них на глобус * ):

salt '*' state.apply

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

Нацеливание в командной строке

Другое место, которое вы можете использовать для цели на основе зерен, находится в командной строке. Вместо использования идентификатора глобуса или миньона, когда вы запускаете соль Команда на солевом мастере, вы можете нацелить на зерно, используя -G вариант.

Например, давайте запустим команду Fortune на всех миньонах Fortuneteller (как Ubuntu, так и альпийские контейнеры). Запустить команду через соль Команда на солевом мастере вы введите cmd.run вместо state.apply Мы использовали ранее, а затем вы говорите соль, какую команду выполняют (в нашем случае fortune ). Идите вперед и введите это в раковине вашего солевого мастера:

salt -G roles:fortuneteller cmd.run fortune

Как видите, мы даем соль -G Опция, сопровождаемая ключом зерна и значением, на которое мы хотим нацелиться (так же, как мы нацеливались на них в файле top.sls . Тогда мы говорим Солм запустить Фортуна командовать с cmd.run Fortune Анкет Вывод должен быть некоторыми хорошими словами мудрости:

cow-e54f99c12817:
    Don't feed the bats tonight.
locomotive-68af4abb8a98:
    Put no trust in cryptic comments.

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

salt -G os:Alpine cmd.run fortune

Это возвращает только одну мудрость, потому что зерно соответствовало только одному миньону:

locomotive-68af4abb8a98:
    The meek shall inherit the earth -- they are too weak to refuse.

ХОРОШО. Этого достаточно о зернах, давайте быстро повернем к столпу.

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

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

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

Настройка столба — это смесь между состояниями и зернами. У нас есть top.sls Файл для столба, где мы делаем таргетинг. Там мы включаем файлы, которые должны возвращать структуру данных, аналогичную зернам.

Файлы конфигурации столба

Начнем с создания папки под названием столб . Эта папка мы собираемся установить на нашем солевом мастере. Это папка, которая будет держать наши данные о столбах. Давайте сначала создадим файлы для каждой роли. Корневой элемент в каждом файле будет Пакеты (Может быть, что мы хотим, но мы хотим, чтобы это было явным, верно?). Затем следует название программы в качестве ключа со значением, которое является лишь описанием пакета, который мы установили. Что-то вроде этого:

packages:
  package-name: package description

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

Итак, сначала создайте файл с именем Cow.sls С этим контентом:

packages:
  cowsay: A program with a cow

Второй файл называется fortuneteller.sls С этим контентом:

packages:
  fortune: A program for a fortune teller

Наконец, создайте третий файл с именем Locomotive.sls С этим контентом:

packages:
  sl: Tech Model Railroad Club

Наконец нам нужны наши top.sls файл. Это будет точно так же, как наш файл штата (вы можете скопировать его, если хотите). Сначала мы определяем среду, в которой мы хотим, чтобы она использовалась, а затем нацелены на роли и включаем файлы SLS, которые мы только что создали. Так что давай и создай top.sls С этим контентом:

base:
  'roles:cow':
    - match: grain
    - cow
  'roles:fortuneteller':
    - match: grain
    - fortune
  'roles:locomotive':
    - match: grain
    - locomotive

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

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

Настройка мастера

Затем мы перенастроем нашего соли Мастера, чтобы прочитать из нашего недавно созданного каталога столбов. Для этого мы должны установить каталог столбов с помощью Docker Compose и настроить мастер для чтения файлов столбов из этого каталога. Начнем с изменения мастер -конфигурации.

Нам нужно только добавить новую переменную конфигурации с именем pillar_roots что похоже на ранее существование file_roots . В какой папке мы храним файлы столбов для определенной среды (в нашем случае base ).

Мы установим каталог с данными о столбах в /srv/pillar Анкет Обновите Master.config Файл и добавьте pillar_root и укажите базовую среду на /SRV/столб , так что ваш Master.config Файл должен выглядеть так:

file_roots:
  base:
    - /srv/salt/
pillar_roots:
  base:
    - /srv/pillar

Тогда нам нужно изменить наш Docker-compose.yml Файл, чтобы установить наш новый столб каталог в /srv/pillar Анкет

version: "3"
services:
  salt:
    image: salt-master
    volumes:
      - ./master.config:/etc/salt/master
      - ./states:/srv/salt
      - ./pillar:/srv/pillar
  alpine-minion:
    image: alpine-minion
    volumes:
      - ./alpine.grains:/etc/salt/grains
  ubuntu-minion:
    image: ubuntu-minion
    volumes:
      - ./ubuntu.grains:/etc/salt/grains

Вот и все. Это все, что вам нужно.

Давайте посмотрим на созданные нами данные о столбах. Опять же, мы хотим начать с чистого сланца, поэтому мы останавливаем наши контейнеры Docker и удалили их (нажмите Y, когда вы будете предложены, если мы уверены, что хотим удалить их). Затем мы снова раскручиваем их обратно и прикрепляем к оболочке соли мастера:

docker-compose stop
docker-compose rm
docker-compose up -d
docker-compose exec salt bash

Как только мы привязаны к мастеру соли, мы принимаем соляные клавиши для новых миньонов (нажмите Enter, чтобы принять их при запросе):

salt-key -A

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

salt '*' pillar.items

Теперь вы должны увидеть пакеты, перечисленные на основе ролей машин. Что-то вроде этого:

cow-e9e01577bbd8:
    ----------
    packages:
        ----------
        cowsay:
            A program with a cow
        fortune:
            A program for a fortune teller
locomotive-023378ead2d9:
    ----------
    packages:
        ----------
        fortune:
            A program for a fortune teller
        sl:
            Tech Model Railroad Club

Мы все еще не используем эти данные о столбах. Чтобы сделать это правильно, нам придется погрузиться в следующую часть этой серии: шаблон (Хотя я немного дразнил это в этой статье).

Понемногу мы получим лучшее понимание многих особенностей Salt.

Эта работа лицензирована в соответствии с Creative Commons Attribution-Sharealike 4.0 Международная лицензия Анкет

Изображение обложки Yair Aronshtam: Соленый столб в Мертвое море, Израиль

Автоматизация вашей ИТ -среды с помощью соли (серия 3 частей)

Оригинал: «https://dev.to/trickvi/grains-and-pillars-in-salt-15aa»