[Перевод] Кунг-фу стиля Linux: синхронизация настроек

Одним из лучших качеств Linux и похожих на неё операционных систем является возможность их глубокой настройки. Если вам что-то не нравится — высоки шансы того, что вы легко сможете это изменить, подправив какой-нибудь файл. Например, рассмотрим bash — командную оболочку, по любым меркам, весьма популярную. Если вам нужно поменять приглашение командной строки — это вполне осуществимо. Если нужно, чтобы клавиша Tab позволяла бы автоматически дополнять имена файлов без учёта регистра — это тоже не проблема. Обычно подобные настройки выполняются в одном из так называемых «файлов профиля», вроде .bashrc, находящихся в домашней директории пользователя.

xevxkzrp7xrdb20jxdlpvgswuc8.jpeg

Если некто работает за единственным компьютером, то никаких проблем с настройками у него не возникает. Он вносит в файл .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" }}
# это попадёт лишь в ~/.bashrc компьютера 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-машинах?

8xzqbhb0at3_pjylb5c4366w_t8.png

oug5kh6sjydt9llengsiebnp40w.png

© Habrahabr.ru