Site icon 8HOST.COM

Установка и настройка CFEngine Community Edition

CFEngine — это масштабируемая утилита для управления конфигурацией IT-инфраструктуры. Она позволяет использовать один и тот же язык утилит и политик для управления всем в вашей инфраструктуре: Linux, Mac, Windows, BSD, Solaris, IBM AIX, HP-UX и другими. Вы устанавливаете агент (написанный на языке C) на каждую машину, которой хотите управлять. CFEngine поддерживает множество платформ и полезен для окружений с ограниченными ресурсами, таких как крупные инфраструктуры или устройства Интернета вещей (Internet of Things, IoT).

В этом мануале мы установим CFEngine Community Edition в Ubuntu, напишем примеры файлов политик и автоматизируем их запуск.

Требования

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

1: Установка CFEngine

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

Есть и другие способы установки CFEngine под разные задачи:

Если вы используете один из альтернативных способов инсталляции CFEngine Community или Enterprise, перейдите к этапу 2 — Запуск CFEngine или к этапу 3 — Создание первой политики.

Добавление открытого ключа CFEngine

Чтобы установить CFEngine с помощью apt, необходимо, чтобы у apt был доступ к репозиторию. Сначала добавим открытый GPG-ключ CFEngine в коллекцию ключей apt, чтобы apt мог доверять пакетам из репозитория.

Загрузите ключ с помощью этой команды:

wget https://cfengine.com/pub/gpg.key -O ~/cfengine-gpg.key

Затем при помощи apt-key добавьте его:

sudo apt-key add ~/cfengine-gpg.key

Добавление репозиториев пакетов CFEngine

Далее с помощью следующей команды нужно добавить репозиторий CFEngine в качестве источника для apt:

sudo sh -c "echo 'deb https://cfengine-package-repos.s3.amazonaws.com/pub/apt/packages stable main' > /etc/apt/sources.list.d/cfengine-community.list"

Эта команда добавит репозиторий CFEngine в файл в директории apt sources list.

Если вы запустите эту команду без аргумента sh и опции -c, то вы получите ошибку Permission denied, поскольку sudo не сможет выполнить перенаправление вывода. Чтобы решить эту проблему, запустите оболочку с sudo с помощью sh и передайте ей команду опцией -c.

Теперь запустите команду update, чтобы apt обнаружил новые пакеты из репозитория CFEngine:

sudo apt update

Установка пакета с помощью apt

После того, как пакет зарегистрирован в apt, можно инсталлировать CFEngine с помощью apt:

sudo apt install cfengine-community

Если вы получите предупреждение, что пакет собран на другой (более старой) операционной системе, то можете пропустить его. Он все равно будет работать.

Проверка установки

После завершения установки в каталоге /var/cfengine/bin вы увидите компоненты, из которых состоит CFEngine. Из всех этих компонентов наиболее часто вы будете работать с агентом (cf-agent). Этот двоичный файл оценивает политику, вносит изменения в систему и записывает информацию о проделанной работе. По умолчанию агент просыпается каждые пять минут, при необходимости получает новую политику и применяет ее.

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

sudo cf-agent --version

Команда выведет номер версии:

CFEngine Core 3.21.0

Примечание: на момент написания этой статьи последняя версия — 3.21.0. У вас номер версии может отличаться.

Если команда cf-agent не работает, проверьте, что /var/cfengine/bin/ находится в переменной PATH и в ней есть cf-agent. Вы также можете проверить файл лога установки в /var/log/CFEngine-Install.log для получения подсказок о том, что пошло не так.

2: Запуск CFEngine

Чтобы запустить CFEngine, необходимо загрузить агент. Для этого выполните следующую команду:

sudo cf-agent --bootstrap 127.0.0.1

Эта команда указывает агенту запустить компоненты CFEngine и получить политику с этой машины, 127.0.0.1.

В будущем вам может понадобиться, чтобы несколько машин загружали политику с одного и того же сервера. В этом случае 127.0.0.1 нужно будет заменить IP-адресом этого сервера. Но для начала работы и изучения CFEngine в этом мануале вы будете использовать одну машину и 127.0.0.1.

Теперь CFEngine установлен и работает на вашем сервере. Следующий этап — написание политики.

3: Создание политики

Чтобы автоматизировать задачи системного администрирования с помощью CFEngine, нужно создать файл политики, который написан на предметно-ориентированном языке (Domain Specific Language). Чтобы узнать больше о языке политики, его структуре и о том, что он может делать, см. документацию CFEngine.

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

Во всех этих случаях вы должны написать политику и поместить ее в нужное место на вашем сервере (/var/cfengine/masterfiles). Затем CFEngine будет:

На этом этапе мы создадим политику “Hello World” для вывода текста “Hello!” в терминал.

С помощью nano или любого другого текстового редактора создайте новый файл ~/hello_world.cf:

nano ~/hello_world.cf

Добавьте в него следующее:

bundle agent main
{
  reports:
    "Hello!";
}

Политика CFEngine является декларативной и оценивается сверху вниз.

В языке политики CFEngine каждое утверждение, которое вы делаете о том, чем вы управляете, называется promise (промисы, или обещания) и они организованы в bundles (бандлы). Бандлы удобны, потому что позволяют выбирать, какие части политики будут выполнены (а какие нет) и в каком порядке.

В этой политике reports — это тип promise, отвечающий за вывод сообщения в терминал. Ключевое слово agent после bundle означает, что этот бандл предназначен для компонента cf-agent. Имя бандла — main. Последовательность бандлов указывает на порядок их оценки. По умолчанию она включает main bundle, поэтому менять ее не нужно.

Сохраните и закройте файл. В nano для этого нажмите CTRL+X, Y и ENTER.

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

chmod 600 hello_world.cf

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

sudo cf-agent ~/hello_world.cf

Агент CFEngine находит бандл (по имени), просматривает в нем промисы и оценивает их. При их оценке агент проверяет, нужно ли ему вносить изменения в систему. В данном случае был только один промис и агент определил, что для его выполнения нужно вывести сообщение в терминал.

Вы получите следующий вывод:

R: Hello!

По умолчанию CFEngine отслеживает, что было сделано, и пропускает недавно оцененные обещания (в течение последней минуты). Если вы попытаетесь повторно запустить политику, то она ничего не выведет. Вы можете отключить эту блокировку с помощью опции командной строки –no-lock:

sudo cf-agent --no-lock hello_world.cf

Вы создали и запустили свою первую политику. Однако эта политика на самом деле не меняет систему. Мы сделаем это на следующем этапе.

4: Написание политики для управления содержимым текстового файла

Ранее мы создали политику для вывода сообщения в терминал. Однако давайте взглянем на более реальный случай использования: допустим, нам нужно, чтобы файл с определенным содержимым был на всех хостах инфраструктуры. Сейчас мы напишем политику, которая создает текстовый файл (/tmp/my_file.txt) с содержимым Hello, CFEngine!.

Откройте новый файл политики ~/file_management.cf:

nano ~/file_management.cf

Добавьте в файл следующее:

bundle agent manage_my_file
{
  files:
    "/tmp/my_file.txt"
      content => "Hello, CFEngine!$(const.n)";
}

Имя бандла — manage_my_file, а не main. При написании большего количества политик следует давать каждому бандлу уникальное и описательное имя. В системе может быть только один main bundle.

Поскольку эта политика управляет файлами, тип промиса будет files. Атрибут content используется для промисов files и указывает, каким должно быть содержимое этого файла. Последняя часть строки, — $(const.n), — расширяет специальную переменную const.n, что добавляет новую строку в конце файла.

Сохраните и закройте файл.

Установите строгие разрешения для файла политики:

chmod 600 file_management.cf

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

sudo cf-agent --no-lock --info ~/file_management.cf --bundle manage_my_file

Указать бандл с помощью –bundle manage_my_file необходимо, так как main bundle больше нет.

Опция –info позволяет CFEngine выводить информацию об изменениях, которые он вносит в систему.

Вывод этой команды будет содержать информацию об этих изменениях:

info: Using command line specified bundlesequence
info: Created file '/tmp/my_file.txt', mode 0600
info: Updated file '/tmp/my_file.txt' with content 'Hello, CFEngine!

Этот вывод показывает, что CFEngine создал текстовый файл под названием my_file.txt в каталоге /tmp с содержимым Hello, CFEngine!.

Если вы выполните ту же команду еще раз, то сообщения о создании и обновлении файла больше не будут отображаться. CFEngine распознает, что содержимое файла уже корректно, и не внесет никаких изменений.

Примечание: –no-lock и –info обычно используются вместе при написании и тестировании файлов политик. Чтобы сократить набор команд, доступны ярлыки; -KI для –no-lock –info.

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

5: Автоматизация выполнения политик

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

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

Выполните следующую команду, чтобы скопировать файл политики, созданный на предыдущем этапе, в рекомендуемое место:

sudo cp file_management.cf /var/cfengine/masterfiles/services/

Вся политика CFEngine находится в /var/cfengine/masterfiles/. Это включает политику, которую вы не писали, — она поставляется вместе с CFEngine. Чтобы отделить пользовательскую политику от стандартной, рекомендуется помещать файлы политик в подкаталог services/.

Когда агенты CFEngine получают новые файлы политик, они копируют их из этого каталога на хаб. Даже если вы используете только одну машину, агент работает одинаково: он ищет файлы в /var/cfengine/masterfiles и копирует их в /var/cfengine/inputs. Для новых пользователей лучше всего использовать эти пути. Кастомизация путей или размещение файлов политики в других местах требует больше работы, так как вам придется убедиться, что разрешения, копирование и поиск файлов работают правильно.

Затем создайте JSON-файл augments, чтобы указать, где находится файл политики и какой бандл следует запускать:

sudo nano /var/cfengine/masterfiles/def.json

Добавьте следующий код в этот файл:

{
  "inputs": [ "services/file_management.cf" ],
  "vars": {
    "control_common_bundlesequence_end": [ "manage_my_file" ]
  }
}

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

Ключ inputs в def.json указывает агенту, какие файлы политик следует читать. В этом случае агент прочитает политику, созданную на предыдущем этапе: file_management.cf.

Ключ vars можно использовать для определения переменных. Переменная control_common_bundlesequence_end используется в политике по умолчанию, поэтому любые имена бандлов, которые вы поместите туда, будут добавлены в конец bundlesequence и оценены после всех бандлов по умолчанию. Вместе эти две части информации означают, что cf-agent знает, какие файлы политик читать и какие бандлы в них оценивать, без необходимости указывать это в командной строке.

На этом этапе мы редактируем политику в /var/cfengine/masterfiles/, а автоматизация позаботится обо всем остальном. В частности, cf-agent периодически просыпается и извлекает новые файлы политик, которые вы написали. Агент будет читать и оценивать политику, применив все промисы и внося изменения на хосты по мере необходимости (например, редактирование файлов и создание пользователей).

На основе политики, которую мы написали в этом мануале, каждый запуск агента гарантирует наличие /tmp/my_file.txt с содержимым, которое указано в файле политики.

Сохраните и закройте файл.

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

sudo rm /tmp/my_file.txt

Через пять минут вы можете убедиться, что CFEngine повторно создал файл my_file.txt в фоновом режиме:

cat /tmp/my_file.txt

Вывод будет следующим:

Hello, CFEngine.

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

sudo rm /tmp/my_file.txt ; sudo cf-agent -Kf update.cf ; sudo cf-agent -KI

Команда rm удаляет файл, чтобы CFEngine увидел, что нужно внести изменения.

Первая команда cf-agent обновляет файл политики, копируя его из /var/cfengine/masterfiles в /var/cfengine/inputs.

Последняя команда cf-agent применяет политику, которая ищет файл /tmp/my_file.txt, создает и редактирует его при необходимости.

В этом случае вы запускаете агент сразу после удаления файла, поэтому cf-agent должен сообщить, что он создал файл. (Вероятность запуска агента в фоновом режиме между этими командами минимальна.)

Примечание: команда sudo cf-agent -Kf update.cf ; sudo cf-agent -KI аналогична команде, которую CFEngine выполняет по умолчанию каждые пять минут. Поэтому выполнение этой команды должно иметь тот же результат, что и пятиминутное ожидание, если CFEngine работает правильно. Первый запуск агента обновляет политику, а второй оценивает политику и вносит изменения в систему.

Вы автоматизировали первую задачу системного администрирования с помощью CFEngine. Хотя этот пример был сфокусирован на создании и редактировании файла, аналогичным образом вы можете создать и другие задачи: напишите политику, поместите ее в правильный каталог и обновите файл def.json соответствующим образом.

Подводим итоги

Мы установили и запустили CFEngine на сервере, написали первую политику и настроили ее на автоматический запуск.

Далее ознакомьтесь с официальной документацией CFEngine, например, с туториалом по управлению файлами: создание, изменение и удаление файлов.

Если у вас возникли вопросы или вам нужна помощь, не стесняйтесь писать в разделе Q&A на GitHub Discussions CFEngine.