Я использую Ansible для автоматизации конфигурации VM для некоторых из наших сред сборки, например. настраивая переменные PATH
и прокси-среды, устанавливая глобальные инструменты Node.js и т. д. Это отлично работает, и легко автоматизировать общие задачи настройки на нескольких хостах. Все задачи разделены на Ansible roles
для разделения обязанностей и дополнительного повторного использования.Как использовать Ansible для автоматизации одноразовых задач?
Теперь я столкнулся с следующим: при установке нового пакета мне нужно изменить переменную окружения 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
записей)? Или это слишком сложно?
Другая вещь, которую я думал (и наконец-то), чтобы создать одноразовую Playbook, который обновляет PATH
переменную во всех средах:
lineinfile:
dest: ~/.profile
backrefs: yes
regexp: "^export PATH=(.*)/opt/foo/bar/baz/bin[\\:]*(.*)"
line: "export PATH=\\1\\2"
Это обычный сценарий - создание playbooks для одно- выключения? Преимущество состоит в том, что playbook запускается на всех хостах и позволяет избежать ручной работы. Повторное использование вне этого минимально, поскольку я только ожидаю сделать это один раз.
Это правильный путь для этого, или есть лучший, более умный способ для выполнения таких задач?
Спасибо! Я идиот - не знаю, что я делаю неправильно. Вы правы, это работает так, как ожидалось. Я просмотрел свой реальный код (приведенный выше пример), сделал пару модификаций, и он начал работать. – nwinkler