Как установить и использовать CFEngine Community Edition в Ubuntu 20.04
Автор выбрал программу Write for DOnations.
Введение
Устройства Интернета вещей (IoT).
В этом руководстве вы установите CFEngine Community Edition 3.21 на Ubuntu 20.04, напишете примеры файлов политик и автоматизируете выполнение политик.
Предпосылки
Для выполнения этого урока вам понадобятся:
- Один сервер Ubuntu 20.04 с пользователем
sudo
без полномочий root. Чтобы настроить это, следуйте нашему руководству Initial Server Setup with Ubuntu 20.04. - Способ запуска команд оболочки (включая
sudo
), напримерssh
. - Текстовый редактор. В этом руководстве используется
nano
.
Шаг 1 — Установка CFEngine
На этом шаге вы установите CFEngine, используя apt
и репозитории пакетов. Основное преимущество использования apt
для установки заключается в том, что вы можете использовать apt
для последующего обновления CFEngine.
Существуют и другие способы установки CFEngine для различных вариантов использования:
cf-remote
– это гибкий вариант, который поддерживает установку на нескольких компьютерах, различные версии CFEngine и ночные сборки.- Сценарий оболочки
quick-install
— хороший выбор для одной машины. Вы можете установить, скопировав одну команду в терминал. - Вы также можете загрузить пакеты прямо с веб-сайта.
Если вы используете один из этих вариантов для установки CFEngine Community или Enterprise, перейдите к шагу 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
.
Без аргумента sh
и параметра -c
эта команда получит ошибку Отказано в доступе
, поскольку перенаправление вывода не выполняется судо
. Чтобы решить эту проблему, вы используете sh
для запуска оболочки с sudo
и даете ей команду с помощью параметра -c
.
Теперь запустите команду update
, чтобы apt
мог видеть новые пакеты из репозитория CFEngine:
- sudo apt update
Установка пакета с помощью apt
Теперь, когда пакет CFEngine зарегистрирован в apt
, вы можете использовать apt
для установки CFEngine:
- sudo apt install cfengine-community
Если вы получили предупреждение о том, что пакет собирается для другой (старой) операционной системы, вы можете его проигнорировать. Пакет до сих пор работает.
Проверка установки
Когда установка будет завершена, вы увидите компоненты, из которых состоит CFEngine, в /var/cfengine/bin
. Из всех перечисленных агент (cf-agent
) — это тот, с которым вы будете взаимодействовать большую часть времени. Этот двоичный файл оценивает написанную вами политику, вносит изменения в систему и записывает информацию о том, что она сделала. По умолчанию агент просыпается каждые пять минут, при необходимости получает новую политику и применяет ее.
Используйте следующую команду, чтобы убедиться, что агент был успешно установлен:
- sudo cf-agent --version
Номер версии будет напечатан на экране:
OutputCFEngine Core 3.21.0
Примечание. На момент написания этой статьи текущая версия — 3.21.0
. Ваш номер версии может отличаться.
Если команда cf-agent
не работает, убедитесь, что /var/cfengine/bin/
находится в вашей переменной PATH
и что cf-agent
существует в этом каталоге.
Шаг 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, вы создаете файл политики, написанный в собственной справочной документации CFEngine по CFEngine.
Файлы политик отличаются от скриптов тем, что они декларативны: вы описываете желаемое состояние системы, а CFEngine проверит, так ли оно уже есть, и внесет изменения только в случае необходимости. Некоторые примеры вещей, которые вы, возможно, захотите отразить в политике:
- Убедитесь, что пользователь
sammy
существует. - Обновляйте (и устанавливайте) пакет
curl
. - Убедитесь, что
telnet
не установлен. - Визуализация файла сценария из шаблона и некоторых данных.
- Остановить процесс, например
httpd
, если он запущен. - Применить строгие разрешения для папки
/usr/bin
.
Во всех этих случаях вы должны написать политику и поместить ее в правильное место на вашем сервере (/var/cfengine/masterfiles). Затем CFEngine:
- Автоматизируйте распространение файла политики, передав его на другие загруженные хосты.
- Регулярно применяйте свои требования (по умолчанию запускайте политику каждые пять минут). Например, если кто-то удалил пользователя
sammy
или изменил разрешения на/usr/bin
, эти изменения будут восстановлены автоматически в течение пяти минут. - Вносите изменения, такие как запись в файл, только в случае необходимости (то есть, если состояние уже не соответствует желаемому).
- Обработка многих различий между платформами (например, команды, используемые для установки пакетов, создания пользователей и других операций, различаются в зависимости от операционной системы).
На этом шаге вы создадите политику «Hello World» для вывода текста «Hello!» к терминалу.
Используйте nano
или ваш любимый текстовый редактор, чтобы создать новый файл ~/hello_world.cf
:
- nano ~/hello_world.cf
В файле добавьте следующее:
bundle agent main
{
reports:
"Hello!";
}
Политика CFEngine является декларативной и не оценивается сверху вниз.
На языке политик CFEngine каждое утверждение, которое вы делаете о том, чем вы управляете, называется пакетами. Пакеты полезны, потому что они позволяют вам выбирать, какие части политики будут выполняться (а какие нет) и в каком порядке они будут выполняться.
В этой политике последовательность пакетов указывает пакеты для оценки. По умолчанию он включает в себя пакет main
, поэтому вам не нужно его менять.
Сохраните и закройте файл. Используя nano
, нажмите CTRL+X
, чтобы выйти, Y
, чтобы сохранить, и ENTER
, чтобы подтвердить имя файла и закрыть файл.
Поскольку CFEngine обычно запускается от имени пользователя root, он пытается предотвратить несанкционированные изменения в системе, требуя строгих разрешений для файлов политик. (Разрешение другим пользователям редактировать политику запуска CFEngine позволит им вносить изменения в систему в качестве привилегированного пользователя). Вы можете использовать chmod
для редактирования прав доступа к файлу и, таким образом, запретить другим пользователям редактировать этот файл:
- chmod 600 hello_world.cf
Чтобы запустить политику, используйте следующую команду:
- sudo cf-agent ~/hello_world.cf
Агент CFEngine находит ваш пакет (из-за имени main
), просматривает промисы внутри него и оценивает их. При оценке промисов агент проверяет, нужно ли ему вносить изменения в систему. В этом случае было только одно обещание, и агент определил, что ему нужно напечатать сообщение на терминал, чтобы выполнить его.
Вы получите следующий вывод:
OutputR: 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
.
Поскольку эта политика управляет файлами, тип обещания — 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
.
Параметр --info
заставляет CFEngine печатать информационные сообщения об изменениях, которые он вносит в систему.
Вывод этой команды будет содержать информацию об этих изменениях:
Outputinfo: 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-файл дополнений, чтобы указать, где находится файл политики и какой пакет следует запускать:
- 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
OutputHello, 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, например, с этим руководством по управлению файлами: создание, изменение и удаление файлов.
Если у вас есть какие-либо вопросы или вам нужна помощь, не стесняйтесь размещать сообщения в разделе вопросов и ответов в обсуждениях CFEngine на GitHub.