1. Создать скрипт expand-variables.sh, который считывает файл с шаблоном переданный через аргумент -f или же из стандартного потока ввода и выполняет интерполяцию переданного шаблона с использованием утилиты envsubst.
Описание аргументов командной строки скрипта: ./expand-variables.sh [-f <FILE>] <KEY_VALUE_PAIR> ...
2. Создать скрипт filter.sh, который считывает файл переданный через аргумент -f или же из стандартного потока ввода и выводит в стандартный поток вывода строки содержащие токен (или любой из токенов, если их было передано несколько) по заданному правилу. Для выполнения фильтрации использовать регулярные выражения.
3. Пишем свой Ansible 😎 Необходимо создать скрипт ansible-emulator.sh на Bash (либо ansible-emulator.py на Python, либо ansible-emulator.ps1 на PowerShell), который считывает файл с командами переданный через аргумент -f или же из стандартного потока ввода. В каждой строке входного файла находится по одной команде из следующего набора:
user --name <NAME> --password <PASSWORD> --state {present|absent} [--group <GROUP>] [--groups <GROUPS>] [--home <HOME>] [--shell <SHELL>] Eсли --state установлен в present и пользователя <NAME> не существует, то пользователь <NAME> создаётся с указанными параметрами. Eсли --state установлен в absent, то пользователь <NAME> удаляется.
package --name <NAME> --state {present|absent} Eсли --state установлен в present, то пакет <NAME> устанавливается. Eсли --state установлен в absent, то пакет <NAME> удаляется.
get_url --url <URL> --dest <DEST> [--checksum <CHECKSUM>] [--retries <RETRIES>] [--delay <DELAY>] [--force] Если файл <DEST> не существует или флаг --force передан, то файл <URL> скачивается в файл <DEST> и проверяется совпадение контрольной суммы скаченного файла с <CHECKSUM>. В случае ошибки через <DELAY> секунд скачивание повторяется до тех пор пока количество попыток не достигнет <RETRIES>. Соответственно, если флаг --force не передан и файл <DEST> существует, то файл не скачивается.
file --path <PATH> --state {touch|directory|absent} [--owner <OWNER>] [--mode <MODE>] Eсли --state установлен в touch/directory и файл/директория <PATH> не существует, то он/она создается. Eсли --state установлен в absent, то соответствующий файл/директория <PATH> удаляется.
unarchive --src <SRC> --dest <DEST> Tarball архив <SRC> всегда распаковывается в директорию <DEST>.
lineinfile --path <PATH> --regexp <REGEXP> --line <LINE> --state {present|absent} Eсли --state установлен в present, то строка соответствующая регулярному выражению <REGEXP> заменяется на <LINE>. Если несколько строк соответствуют регулярному выражению <REGEXP>, то заменяется только последняя. Eсли --state установлен в absent, то строка соответствующая регулярному выражению <REGEXP> удаляется.
Дедлайн: 22/03/2024
Для описания аргументов командной строки скриптов был использован Command-line syntax key стандарт (см. https://stackoverflow.com/a/47026846).
1. Создать скрипт
expand-variables.sh
, который считывает файл с шаблоном переданный через аргумент-f
или же из стандартного потока ввода и выполняет интерполяцию переданного шаблона с использованием утилитыenvsubst
.Описание аргументов командной строки скрипта:
./expand-variables.sh [-f <FILE>] <KEY_VALUE_PAIR> ...
Пример использования скрипта:
2. Создать скрипт
filter.sh
, который считывает файл переданный через аргумент-f
или же из стандартного потока ввода и выводит в стандартный поток вывода строки содержащие токен (или любой из токенов, если их было передано несколько) по заданному правилу. Для выполнения фильтрации использовать регулярные выражения.Описание аргументов командной строки скрипта:
./filter.sh [-f <FILE>] {contains|startswith|endswith} <TOKEN> ...
Пример использования скрипта:
3. Пишем свой Ansible 😎 Необходимо создать скрипт
ansible-emulator.sh
на Bash (либоansible-emulator.py
на Python, либоansible-emulator.ps1
на PowerShell), который считывает файл с командами переданный через аргумент-f
или же из стандартного потока ввода. В каждой строке входного файла находится по одной команде из следующего набора:user --name <NAME> --password <PASSWORD> --state {present|absent} [--group <GROUP>] [--groups <GROUPS>] [--home <HOME>] [--shell <SHELL>]
Eсли
--state
установлен вpresent
и пользователя<NAME>
не существует, то пользователь<NAME>
создаётся с указанными параметрами. Eсли--state
установлен вabsent
, то пользователь<NAME>
удаляется.package --name <NAME> --state {present|absent}
Eсли
--state
установлен вpresent
, то пакет<NAME>
устанавливается. Eсли--state
установлен вabsent
, то пакет<NAME>
удаляется.get_url --url <URL> --dest <DEST> [--checksum <CHECKSUM>] [--retries <RETRIES>] [--delay <DELAY>] [--force]
Если файл
<DEST>
не существует или флаг--force
передан, то файл<URL>
скачивается в файл<DEST>
и проверяется совпадение контрольной суммы скаченного файла с<CHECKSUM>
. В случае ошибки через<DELAY>
секунд скачивание повторяется до тех пор пока количество попыток не достигнет<RETRIES>
. Соответственно, если флаг--force
не передан и файл<DEST>
существует, то файл не скачивается.file --path <PATH> --state {touch|directory|absent} [--owner <OWNER>] [--mode <MODE>]
Eсли
--state
установлен вtouch
/directory
и файл/директория<PATH>
не существует, то он/она создается. Eсли--state
установлен вabsent
, то соответствующий файл/директория<PATH>
удаляется.unarchive --src <SRC> --dest <DEST>
Tarball архив
<SRC>
всегда распаковывается в директорию<DEST>
.lineinfile --path <PATH> --regexp <REGEXP> --line <LINE> --state {present|absent}
Eсли
--state
установлен вpresent
, то строка соответствующая регулярному выражению<REGEXP>
заменяется на<LINE>
. Если несколько строк соответствуют регулярному выражению<REGEXP>
, то заменяется только последняя. Eсли--state
установлен вabsent
, то строка соответствующая регулярному выражению<REGEXP>
удаляется.Пример использования скрипта:
4. Создать Pull Request (PR) содержащий 3 созданных скрипта.
5. (**) Убедиться, что все файлы в репозитории проходят валидацию.
** не обязательны к выполнению. Задачи на интерес_