Управление файлами конфигурации. Домашний каталог. Chezmoi

Использование chezmoi для управления файлами конфигурации домашнего каталога пользователя.

Содержание

1 Общая информация

2 Установка

  • Установка бинарного файла. Скрипт определяет архитектуру процессора и операционную систему и скачивает необходимый файл:
    • с помощью curl:

      1sh -c "$(curl -fsLS chezmoi.io/get)"
      
    • с помощью wget:

      1sh -c "$(wget -qO- chezmoi.io/get)"
      
    • с помощью PowerShell:

      1(iwr -UseBasicParsing https://chezmoi.io/get.ps1).Content | powershell -c -
      
  • Linux
    • Gentoo
    • Fedora
      • Установка через Snap:
        • Установите Snap:
          1dnf install snapd
          
        • Либо выйдите из системы, либо снова войдите в нее, либо перезагрузите систему, чтобы убедиться, что пути snap обновлены правильно.
        • Включите поддержку классического варианта snap:
          1ln -s /var/lib/snapd/snap /snap
          
        • Установите chezmoi:
          1snap install chezmoi --classic
          
  • Windows

3 Конфигурация chezmoi

3.1 Рабочие файлы

  • Состояние файлов конфигурации сохраняется в каталоге
    1~/.local/share/chezmoi
    
  • Он является клоном вашего репозитория dotfiles.
  • Файл конфигурации ~/.config/chezmoi/chezmoi.toml (можно использовать также JSON или YAML) специфичен для локальной машины.
  • Файлы, содержимое которых одинаково на всех ваших машинах, дословно копируются из исходного каталога.
  • Файлы, которые варьируются от машины к машине, выполняются как шаблоны, обычно с использованием данных из файла конфигурации локальной машины для настройки конечного содержимого, специфичного для локальной машины.
  • При запуске
    1chezmoi apply
    
    вычисляется желаемое содержимое и разрешения для каждого файла, а затем вносит необходимые изменения, чтобы ваши файлы соответствовали этому состоянию.
  • По умолчанию chezmoi изменяет файлы только в рабочей копии.

3.2 Автоматически создавать файл конфигурации на новой машине

  • При выполнении chezmoi init также может автоматически создать файл конфигурации, если он еще не существует.

  • Если ваш репозиторий содержит файл с именем .chezmoi.$FORMAT.tmpl, где $FORMAT есть один из поддерживаемых форматов файла конфигурации (json, toml, или yaml), то chezmoi init выполнит этот шаблон для создания исходного файла конфигурации.

  • Например, пусть ~/.local/share/chezmoi/.chezmoi.toml.tmpl выглядит так:

    1{{- $email := promptStringOnce . "email" "Email address" -}}
    2
    3[data]
    4    email = {{ $email | quote }}
    
    • При выполнении chezmoi init будет создан конфигурационный файл ~/.config/chezmoi/chezmoi.toml.
    • promptStringOnce — это специальная функция, которая запрашивает у пользователя значение, если оно еще не установлено в разделе data конфигурационного файла.
  • Чтобы протестировать этот шаблон, используйте chezmoi execute-template с флагами --init и --promptString, например:

    1chezmoi execute-template --init --promptString email=me@home.org < ~/.local/share/chezmoi/.chezmoi.toml.tmpl
    

3.3 Пересоздание файл конфигурации

  • Если вы измените шаблон файла конфигурации, chezmoi предупредит вас, если ваш текущий файл конфигурации не был сгенерирован из этого шаблона.
  • Вы можете повторно сгенерировать файл конфигурации, запустив:
    1chezmoi init
    

4 Шаблоны

4.1 Общая информация

  • Шаблоны используются для изменения содержимого файла в зависимости от среды.
  • Используется синтаксис шаблонов Go.
  • Файл интерпретируется как шаблон, если выполняется одно из следующих условий:
    • имя файла имеет суффикс .tmpl;
    • файл находится в каталоге .chezmoitemplates.

4.2 Данные шаблона

  • Полный список переменных шаблона:
    1chezmoi data
    
  • Источники переменных:
    • файлы .chezmoi, например, .chezmoi.os;
    • файлы конфигурации .chezmoidata.$FORMAT. Форматы (json, jsonc, toml, yaml) читаются в алфавитном порядке;
    • раздел data конфигурационного файла.

4.3 Способы создания файла шаблона

  • При первом добавлении файла передайте аргумент --template:
    1chezmoi add --template ~/.zshrc
    
  • Если файл уже контролируется chezmoi, но не является шаблоном, можно сделать его шаблоном:
    1chezmoi chattr +template ~/.zshrc
    
  • Можно создать шаблон вручную в исходном каталоге, присвоив ему расширение .tmpl:
    1chezmoi cd
    2$EDITOR dot_zshrc.tmpl
    
  • Шаблоны в каталоге .chezmoitemplates должны создаваться вручную:
    1chezmoi cd
    2mkdir -p .chezmoitemplates
    3cd .chezmoitemplates
    4$EDITOR mytemplate
    

4.4 Редактирование файла шаблона

  • Используйте chezmoi edit:
    1chezmoi edit ~/.zshrc
    
  • Чтобы сделанные вами изменения сразу же применялись после выхода из редактора, используйте опцию --apply:
    1chezmoi edit --apply ~/.zshrc
    

4.5 Тестирование шаблонов

  • Тестирование с помощью команды chezmoi execute-template.
  • Тестирование небольших фрагментов шаблонов:
    1chezmoi execute-template '{{ .chezmoi.hostname }}'
    
  • Тестирование целых файлов:
    1chezmoi cd
    2chezmoi execute-template < dot_zshrc.tmpl
    

4.6 Синтаксис шаблона

  • Действия шаблона записываются внутри двойных фигурных скобок, {{ }}.
  • Действия могут быть переменными, конвейерами или операторами управления.
  • Текст вне действий копируется буквально.
  • Переменные записываются буквально:
1{{ .chezmoi.hostname }}
  • Условные выражения могут быть записаны с использованием if, else if, else, end:
1{{ if eq .chezmoi.os "darwin" }}
2# darwin
3{{ else if eq .chezmoi.os "linux" }}
4# linux
5{{ else }}
6# other operating system
7{{ end }}

4.6.1 Удаление пробелов

  • Для удаления проблем в шаблоне разместите знак минус и пробела рядом со скобками:
    1HOSTNAME={{- .chezmoi.hostname }}
    
  • В результате получим:
    1HOSTNAME=myhostname
    

4.6.2 Отладка шаблона

  • Используется подкоманда execute-template:
    1chezmoi execute-template '{{ .chezmoi.os }}/{{ .chezmoi.arch }}'
    
  • Интерпретируются любые данные, поступающие со стандартного ввода или в конце команды.
  • Можно передать содержимое файла этой команде:
    1cat foo.txt | chezmoi execute-template
    

4.6.3 Логические операции

  • Возможно выполнение логических операций.
  • Если имя хоста машины равно work-laptop, текст между if и end будет включён в результат:
    1# common config
    2export EDITOR=vi
    3
    4# machine-specific configuration
    5{{- if eq .chezmoi.hostname "work-laptop" }}
    6# this will only be included in ~/.bashrc on work-laptop
    7{{- end }}
    
  1. Логические функции

    • eq: возвращает true, если первый аргумент равен любому из остальных аргументов, может принимать несколько аргументов;
    • not: возвращает логическое отрицание своего единственного аргумента;
    • and: возвращает логическое И своих аргументов, может принимать несколько аргументов;
    • or: возвращает логическое ИЛИ своих аргументов, может принимать несколько аргументов.
  1. Целочисленные функции

    • len: возвращает целочисленную длину своего аргумента;
    • eq: возвращает логическую истину arg1 == arg2;
    • ne: возвращает логическое значение arg1 != arg2;
    • lt: возвращает логическую истину arg1 < arg2;
    • le: возвращает логическую истину arg1 <= arg2;
    • gt: возвращает логическую истину arg1 > arg2;
    • ge: возвращает логическую истину arg1 >= arg2.

4.7 Переменные шаблона

  • Чтобы просмотреть переменные, доступные в вашей системе, выполните:
    1chezmoi data
    
  • Чтобы получить доступ к переменной chezmoi.kernel.osrelease в шаблоне, используйте:
    1{{ .chezmoi.kernel.osrelease }}
    

5 Использование chezmoi

5.1 Первоначальная настройка на первичном хосте

  • Инициализируйте chezmoi командой:
    1chezmoi init
    
  • Это создаст новый локальный репозиторий git в ~/.local/share/chezmoi.
  • Добавьте в репозиторий первый файл с помощью chezmoi:
    1chezmoi add ~/.bashrc
    
  • Команда скопирует ~/.bashrc в ~/.local/share/chezmoi/dot_bashrc.
  • Можно отредактировать файл:
    1chezmoi edit ~/.bashrc
    
  • Откроется ~/.local/share/chezmoi/dot_bashrc в редакторе, заданном переменной $EDITOR.
  • Внесите некоторые изменения и сохраните файл.
  • Посмотрите, какие изменения внес бы chezmoi:
    1chezmoi diff
    
  • Примените изменения:
    1chezmoi -v apply
    
  • Все команды chezmoi принимают флаг -v (подробная информация) и флаг -n (пробный запуск, демонстрирующий, но не вносящий изменения).

5.2 Репозиторий на github

  • Создайте репозиторий dotfiles для хранения конфигурационных файлов.
  • Для определённости будем использовать https://github.com.
  • Поддерживается хранение ваших конфигурационных файлов как в общедоступных, так и в частных репозиториях.
  • Создать репозиторий можно вручную или из командной строки (см. github: утилиты командной строки):
    1gh repo create dotfiles --private
    
  • Откройте оболочку в исходном каталоге, чтобы зафиксировать изменения:
    1chezmoi cd
    2git add .
    3git commit -m "Initial commit"
    
  • Подключите репозиторий и выгрузите файлы:
    1git remote add origin git@github.com:username/dotfiles.git
    2git push --set-upstream origin master
    3git push -u origin
    
  • Выйдите из оболочки chezmoi:
    1exit
    

5.3 Использование chezmoi на нескольких машинах

  • На второй машине инициализируйте chezmoi с вашим репозиторием dotfiles:
    1chezmoi init https://github.com/<username>/dotfiles.git
    
  • Или через ssh:
    1chezmoi init git@github.com:<username>/dotfiles.git
    
  • Проверьте, какие изменения внесёт chezmoi в домашний каталог, запустив:
    1chezmoi diff
    
  • Если вас устраивают изменения, внесённые chezmoi, запустите:
    1chezmoi apply -v
    
  • Если вас не устраивают изменения в файле, отредактируйте его с помощью:
    1chezmoi edit file_name
    
  • Также можно вызвать инструмент слияния, чтобы объединить изменения между текущим содержимым файла, файлом в вашей рабочей копии и измененным содержимым файла:
    1chezmoi merge file_name
    
  • При существующем каталоге chezmoi можно получить и применить последние изменения из вашего репозитория:
    1chezmoi update -v
    

5.4 Настройка новой машины с помощью одной команды

  • Можно установить свои dotfiles на новый компьютер с помощью одной команды:
    1chezmoi init --apply https://github.com/<username>/dotfiles.git
    
  • Через ssh:
    1chezmoi init --apply git@github.com:<username>/dotfiles.git
    

5.5 Ежедневные операции c chezmoi

5.5.1 Извлеките последние изменения из репозитория и примените их

  • Можно извлечь изменения из репозитория и применить их одной командой:
    1chezmoi update
    
  • Это запускается git pull --autostash --rebase в вашем исходном каталоге, а затем chezmoi apply.

5.5.2 Извлеките последние изменения из своего репозитория и посмотрите, что изменится, фактически не применяя изменения

  • Выполните:
    1chezmoi git pull -- --autostash --rebase && chezmoi diff
    
  • Это запускается git pull --autostash --rebase в вашем исходном каталоге, а chezmoi diff затем показывает разницу между целевым состоянием, вычисленным из вашего исходного каталога, и фактическим состоянием.
  • Если вы довольны изменениями, вы можете применить их:
    1chezmoi apply
    

5.5.3 Автоматически фиксируйте и отправляйте изменения в репозиторий

  • Можно автоматически фиксировать и отправлять изменения в исходный каталог в репозиторий.
  • Эта функция отключена по умолчанию.
  • Чтобы включить её, добавьте в файл конфигурации ~/.config/chezmoi/chezmoi.toml следующее:
    1[git]
    2    autoCommit = true
    3    autoPush = true
    
  • Всякий раз, когда в исходный каталог вносятся изменения, chezmoi фиксирует изменения с помощью автоматически сгенерированного сообщения фиксации и отправляет их в ваш репозиторий.
  • Будьте осторожны при использовании autoPush. Если ваш репозиторий dotfiles является общедоступным, и вы случайно добавили секрет в виде обычного текста, этот секрет будет отправлен в ваш общедоступный репозиторий.

Дмитрий Сергеевич Кулябов
Дмитрий Сергеевич Кулябов
Профессор кафедры теории вероятностей и кибербезопасности

Мои научные интересы включают физику, администрирование Unix и сетей.

Похожие