Поиск по сайту:

Как установить и использовать 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 мог доверять пакетам из репозитория.

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

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

Затем используйте apt-key, чтобы добавить его:

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

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

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

  1. 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:

  1. sudo apt update

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

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

  1. sudo apt install cfengine-community

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

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

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

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

  1. sudo cf-agent --version

Номер версии будет напечатан на экране:

Output
CFEngine Core 3.21.0

Примечание. На момент написания этой статьи текущая версия — 3.21.0. Ваш номер версии может отличаться.

Если команда cf-agent не работает, убедитесь, что /var/cfengine/bin/ находится в вашей переменной PATH и что cf-agent существует в этом каталоге.

Шаг 2 — Запуск CFEngine

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

  1. 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:

  1. nano ~/hello_world.cf

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

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

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

На языке политик CFEngine каждое утверждение, которое вы делаете о том, чем вы управляете, называется пакетами. Пакеты полезны, потому что они позволяют вам выбирать, какие части политики будут выполняться (а какие нет) и в каком порядке они будут выполняться.

В этой политике последовательность пакетов указывает пакеты для оценки. По умолчанию он включает в себя пакет main, поэтому вам не нужно его менять.

Сохраните и закройте файл. Используя nano, нажмите CTRL+X, чтобы выйти, Y, чтобы сохранить, и ENTER, чтобы подтвердить имя файла и закрыть файл.

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

  1. chmod 600 hello_world.cf

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

  1. sudo cf-agent ~/hello_world.cf

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

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

Output
R: Hello!

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

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

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

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

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

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

  1. 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, в результате чего в конце файла появляется новая строка. .

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

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

  1. chmod 600 file_management.cf

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

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

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

Параметр --info заставляет CFEngine печатать информационные сообщения об изменениях, которые он вносит в систему.

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

Output
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, что делать в фоновом режиме, без необходимости запускать команды явно и вручную из командной строки.

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

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

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

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

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

  1. 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 с содержимым, указанным вами в файле политики.

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

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

  1. sudo rm /tmp/my_file.txt

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

  1. cat /tmp/my_file.txt
Output
Hello, CFEngine.

Кроме того, вы также можете ускорить создание файла:

  1. 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.