Как да инсталирате и използвате CFEngine Community Edition на Ubuntu 20.04


Авторът е избрал програмата Write for DOnations.

Въведение

Интернет на нещата (IoT) устройства.

В този урок ще инсталирате CFEngine Community Edition 3.21 на Ubuntu 20.04, ще напишете примерни файлове с правила и ще автоматизирате изпълнението на вашите правила.

Предпоставки

За да завършите този урок, ще ви трябва:

  • Един Ubuntu 20.04 сървър с не-root потребител sudo. За да настроите това, следвайте нашето ръководство Първоначална настройка на сървъра с Ubuntu 20.04.
  • Начин за изпълнение на команди на обвивката (включително sudo), като ssh.
  • Текстов редактор. Този урок използва nano.

Стъпка 1 — Инсталиране на CFEngine

В тази стъпка ще инсталирате CFEngine с помощта на apt и хранилищата на пакети. Основното предимство на използването на apt за инсталиране е, че можете да използвате apt за актуализиране на CFEngine по-късно.

Има и други начини за инсталиране на CFEngine за различни случаи на употреба:

  • cf-remote е гъвкав избор, който се справя с инсталиране на множество машини, различни версии на CFEngine и нощни компилации.
  • Скриптът на обвивката за бързо инсталиране е добър избор за една машина. Можете да инсталирате, като копирате една команда в терминала.
  • Можете също да изтеглите пакетите директно от уебсайта.

Ако използвате една от тези алтернативи, за да инсталирате 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 тази команда ще получи грешка Разрешението е отказано, тъй като пренасочването на изхода не се извършва от sudo. За да разрешите този проблем, вие използвате 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) със съдържанието Здравей, 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. Докато пишете повече правила, трябва да дадете на всеки пакет уникално и описателно име. Може да има само един главен пакет.

Тъй като тази политика управлява файлове, типът обещание е 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 със съдържанието Здравей, 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, като този урок за управление на файлове: Създаване, промяна и изтриване на файлове.

Ако имате някакви въпроси или се нуждаете от помощ, не се колебайте да публикувате в секцията Въпроси и отговори на GitHub дискусиите на CFEngine.