Одним из лучших качеств Linux и похожих на неё операционных систем является возможность их глубокой настройки. Если вам что-то не нравится — высоки шансы того, что вы легко сможете это изменить, подправив какой-нибудь файл. Например, рассмотрим bash — командную оболочку, по любым меркам, весьма популярную. Если вам нужно поменять приглашение командной строки — это вполне осуществимо. Если нужно, чтобы клавиша Tab
позволяла бы автоматически дополнять имена файлов без учёта регистра — это тоже не проблема. Обычно подобные настройки выполняются в одном из так называемых «файлов профиля», вроде .bashrc
, находящихся в домашней директории пользователя.
Если некто работает за единственным компьютером, то никаких проблем с настройками у него не возникает. Он вносит в файл .bashrc
, и в другие подобные файлы, необходимые изменения, настраивает систему под себя, и работает в той среде, которая ведёт себя так, как ему того хочется. Проблемы появляются тогда, когда кому-то приходится пользоваться несколькими компьютерами. Возможно, речь идёт о веб-сервере, о настольном компьютере, о машине, играющей роль файрвола, и о нескольких десятках Raspberry Pi. Как настроить все эти системы одинаково? И как, после того, как они все одинаково настроены, поддерживать настройки в актуальном состоянии?
Несколько вариантов синхронизации настроек
На самом деле, существует несколько способов синхронизации настроек Linux-систем. Так как эти настройки обычно хранятся в каких-то файлах, для решения нашей задачи можно воспользоваться практически любым механизмом синхронизации. На это придётся потратить некоторое время, но в результате можно будет добиться желаемого. Предположим, можно положить все конфигурационные файлы в одну директорию, а затем поместить символьные ссылки на эти файлы в нужные места домашней директории. Далее, можно, используя rsync
, синхронизировать эту папку между различными системами.
Если вы знакомы с Git, то вы уже догадываетесь о ещё одном варианте решения этой задачи. Тут, кроме того, вдобавок к возможности синхронизации настроек, у вас будет ещё и возможность знать о том, что и когда менялось в ваших конфигурационных файлах. На самом деле, я, в материале о необычных способах использования Git, уже об этом рассказывал, демонстрируя мою систему синхронизации настроек, основанную на Git. Недавно, правда, я обнаружил, что появилась система, названная chezmoi, которая написана на Go, и в которой используется подход к синхронизации настроек, совершенно не похожий на мой.
Возможности chezmoi
В соответствии с данными из репозитория проекта, chezmoi
предлагает пользователю следующие возможности:
- Декларативное описание желаемого состояния файлов домашней директории.
- Использование шаблонов для создания файлов.
- Безопасность работы обеспечивается интеграцией с Bitwarden, с LastPass и с некоторыми программами для локального хранения ключей.
- Поддержка атомарной обработки обновлений. Это защищает систему от попадания в «промежуточное» состояние.
- Поддержка нескольких операционных систем.
- Пользователю сообщается о действиях, которые планируется выполнить, поддерживается режим «пробного запуска».
- Высокая скорость работы, возможность выбора используемой совместно с
chezmoi
системы контроля версий.
Выглядит всё это очень интересно. Порядок установки утилиты в разных операционных системах имеет собственные особенности, соответствующие инструкции можно найти в репозитории проекта.
Использование chezmoi
Исполняемый файл, дающий доступ к возможностям chezmoi
, что неудивительно, повторяет название проекта. Он поддерживает несколько команд, среди которых хотелось бы отметить следующие:
add
— добавление файла в состав файлов, которыми управляет система.edit
— редактирование файла.diff
— выяснение того, какие изменения, если таковые имеются, ожидают включения в рабочую версию файла.apply
— включение изменений, ожидающих одобрения, в рабочую версию файла.
Когда в систему добавляют новый файл, его копия помещается в директорию ~/.local/share/chezmoi
. Для обеспечения совместимости с системами контроля версий chezmoi
игнорирует файлы, находящиеся в этой директории, имя которых начинается с точки. Поэтому, если в систему добавить, например, файл .bashrc
, он будет автоматически переименован в dot_bashrc
.
Если бы только этим возможности chezmoi
и ограничивались, то в этой утилите не было бы ничего примечательного. Самое интересное тут — это синхронизация копий файлов. Для решения данной задачи chezmoi
использует внешнюю систему контроля версий. А что происходит в том случае, если на некоторых компьютерах, настройки которых синхронизируются, нужны некие особенные параметры?
Поддержка особенных настроек
Представим, что на настольном компьютере вам нужно использовать особенное приглашение командной строки. А на сервере, на файрволе и на Raspberry Pi-компьютерах вас устроит обычное приглашение. Это значит, что на каждом из компьютеров, в файле .bashrc
, должно присутствовать особое значение параметра PS1
.
Сделать это можно, добавив соответствующие записи в раздел data
файла chezmoi.yaml
. На самом деле, тут можно использовать различные форматы, в частности — JSON
и TOML
. Этот файл уникален для каждого компьютера. Он позволяет вносить изменения в шаблонные файлы. Например, chezmoi.yaml
настольного компьютера может содержать запись о PS1String
, описывающую сложные настройки приглашения командной строки, а в таком же файле для Raspberry Pi похожая запись будет уже устроена гораздо проще.
Для того чтобы добавить в систему некий файл, который будет использоваться в качестве шаблона (например — файл .bashrc
), нужно воспользоваться опцией -T
команды add
. Файл шаблона, основанного на .bashrc
будет иметь имя dot_bashrc.tmpl
. Благодаря стандартным механизмам шаблонизации Go в распоряжении пользователя chezmoi
имеется множество опций. Кроме того, chezmoi
позволяет пользоваться переменными, которые, например, позволяют работать с именем компьютера и с именем пользователя, с идентификаторами ОС и архитектуры.
Благодаря возможностям используемого в chezmoi
языка шаблонов, у пользователя есть гораздо больше свободы, чем простое использование переменных. В шаблонах, в частности, можно пользоваться условными конструкциями. Выглядеть это, например, может так:
# общие настройки
export EDITOR=vi
# настройки, зависящие от имени компьютера
{{- if eq .chezmoi.hostname "work-laptop" }}
# это попадёт лишь в ~/<code>.bashrc</code> компьютера work-laptop
{{- end }}
Безопасность
Chezmoi
распознаёт приватные файлы и соответствующим образом их обрабатывает. Так, приватной является директория chezmoi
, система использует префикс private_
при назначении имён приватным файлам (например, имя такого файла может выглядеть как private_dot_bashrc
).
Предполагается, что для организации синхронизации файлов будет использоваться некая система контроля версий. Другими словами, настраивая новый компьютер или обновляя настройки некоей машины вы производите синхронизацию содержимого директории chezmoi
с копией настроек, хранящейся в системе контроля версий. Затем всё что нужно настраивается в конфигурационном файле и применяются изменения, возможно — с предварительной проверкой того, какие именно изменения будут применены.
Это значит, конечно, что хранимые файлы будут настолько «приватными», насколько это позволяет система контроля версий. Если вы опубликуете свои конфигурационные файлы в общедоступной системе — это значит, что ни о какой «приватности» речи уже не идёт. Один из способов решения этой проблемы заключается в использовании системы шаблонизации, и в том, чтобы не обрабатывать с помощью системы контроля версий конфигурационный файл. А он, так как уникален для каждого компьютера, в любом случае не должен обрабатываться с помощью системы контроля версий. Это, кроме прочего, означает, что его нужно хранить не так, как другие файлы.
Предположим, в вашем конфигурационном файле имеется такая запись:
hackaday:
password: 0xdeadbeef
Пароль надо хранить в секрете. А в общедоступных файлах может использоваться такая конструкция:
password = {{ .hackaday.password }}
При работе с chezmoi
ещё можно пользоваться конфигурационными файлами, зашифрованными с помощью gpg
.
Система контроля версий
Если говорить о системах контроля версий, то в chezmoi
имеются команды для отправки материалов в поддерживаемые системы контроля версий и, соответственно, команды для загрузки данных. По умолчанию используется git
, но есть и другие варианты, вроде hg
. Соответствующие настройки выполняются в конфигурационном файле.
Есть и команды, позволяющие просто получить полный набор конфигурационных файлов или экспортировать конфигурацию. Почитать об этих командах можно в репозитории проекта. По умолчанию вся работа ведётся в домашней директории, но, если надо, можно настроить программу и на работу с другой целевой директорией.
Итоги
В целом можно отметить, что chezmoi
кажется хорошо продуманным проектом. Но я не увидел здесь чего-то такого, что заставило бы меня перейти на chezmoi
с моей системы синхронизации настроек. Если бы я наткнулся на chezmoi
тогда, когда только размышлял о способе решения рассматриваемой задачи, то я, вероятно, воспользовался бы именно этим проектом, а не создавал бы собственный. Я не спорю с тем, что система шаблонизации chezmoi
очень хороша, но моя система достигает похожего эффекта, выбирая разные файлы в зависимости от окружения.
Уникальный файл с настройками chezmoi
сложно обрабатывать с помощью системы контроля версий. Да пользователи обычно и не стремятся этого делать. Если репозиторий, используемый для хранения настроек, является приватным, или если приватную информацию не включают в конфигурационные файлы, можно поместить в эту систему и варианты файла с настройками chezmoi
(скажем, там может быть вариант этого файла для Raspberry Pi и для обычных компьютеров). Затем, при первоначальной настройке компьютера, можно переименовать подходящий файл. Но более вероятно то, что файл с настройками системы будут просто копировать. У подхода, в соответствии с которым конфигурационный файл chezmoi
не обрабатывают средствами системы контроля версий, есть преимущество, заключающееся в том, что, если всё правильно настроить, то для хранения данных можно безопасно использовать общедоступный репозиторий.
А для работы моей системы очень важно применение именно приватного репозитория — если только того, кто ей пользуется, не волнует попадание его конфигурационных файлов в общий доступ. Но при этом все файлы обрабатываются с помощью системы контроля версий. Система позволяет быть в курсе всех изменений без необходимости использования шаблонов, на освоение которых нужно определённое время. Достаточно лишь расположить настройки в соответствующих файлах. Единственная возможность, которую я вполне могу добавить в свою систему, вдохновившись chezmoi
, это возможность добавления в неё новых файлов, за которыми осуществляется наблюдение. Хотя моя система и позволяет синхронизировать настройки, сейчас файлы в неё надо добавлять вручную. Файл перемещают в особую директорию, после чего добавляют записи о файле в систему и создают символическую ссылку.
Но этим и хороша Linux. Тут имеется множество способов решения одной и той же задачи. Если не нравится что-то одно — можно найти что-то другое. А если ничего не нравится — можно без особых сложностей создать что-то своё. Это же, правда, создаёт определённые проблемы при использовании Linux многими обычными людьми, которые не привыкли к подобному. Они не стремятся выбирать из множества вариантов, им нужно простое и понятное рабочее решение. А в сообществе, сложившемся вокруг Linux, наоборот, принято постоянно всё со всем сравнивать и с жаром спорить о том, что лучше — emacs
или vi
, C или Python.
Как вы синхронизируете настройки на разных Linux-машинах?
Автор: ru_vds