Я использую Ansible для автоматизации настройки виртуальных машин для некоторых наших сред сборки, например. настройка переменных среды PATH
и прокси, установка глобальных инструментов Node.js и т. д. Это прекрасно работает, и можно легко автоматизировать общие задачи настройки на нескольких хостах. Все задачи разделены по Ansible roles
для разделения обязанностей и дополнительного повторного использования.
Теперь я столкнулся со следующим: с новым установленным пакетом мне нужно изменить переменную среды PATH
— ей больше не нужна запись, которую я ранее добавил как часть установки Ansible.
Поэтому, естественно, я пошел дальше и обновил задачу Ansible, которую я использую для настройки переменной PATH для новых сред, и удалил пользовательскую запись (я использовал задачу lineinfile
для создания записи PATH).
lineinfile:
dest: ~/.profile
regexp: "^export {{ item.regexp }}"
line: "export {{ item.line }}"
create: yes
with_items:
- { regexp: 'PATH', line: 'PATH=:~/bin:~/node_modules/.bin:$PATH' }
Я удалил одну запись из приведенной выше line
части элемента. Как видите, задача lineinfile
только проверяет наличие записи export PATH
в файле, а если нет, то создает ее с export PATH=:~/bin:~/node_modules/.bin:$PATH
.
Теперь мой вопрос: поскольку задача lineinfile только проверяет существование записи, но не проверяет полное значение, мне нужно убедиться, что все существующие среды обновлены. Как мне это сделать?
Есть ли способ сделать оператор lineinfile
достаточно умным, чтобы также проверить содержимое строки, т.е. убедиться, что именно та строка, которую я хочу, присутствует (в то же время избегая дублирования записей PATH
)? Или это слишком сложно?
Еще одна вещь, о которой я подумал (и, наконец, сделал), — это создать одноразовый плейбук, который обновляет переменную PATH
во всех средах:
lineinfile:
dest: ~/.profile
backrefs: yes
regexp: "^export PATH=(.*)/opt/foo/bar/baz/bin[\\:]*(.*)"
line: "export PATH=\\1\\2"
Является ли это распространенным сценарием — создание плейбуков для разовых задач? Преимущество заключается в том, что playbook запускается на всех хостах и позволяет избежать ручной работы. Возможность повторного использования за пределами этого минимальна, так как я ожидаю сделать это только один раз.
Это правильный способ сделать это, или есть лучший, более разумный способ для выполнения таких задач?