2015-04-28 3 views
1

Я использую 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 запускается на всех хостах и ​​позволяет избежать ручной работы. Повторное использование вне этого минимально, поскольку я только ожидаю сделать это один раз.

Это правильный путь для этого, или есть лучший, более умный способ для выполнения таких задач?

ответ

2

Какая версия анзибль вы используете ? Поскольку то, что вы описываете, выглядит как ошибка, потому что модуль lineinfile должен обнаружить, что строка изменилась и обновила ее.Я просто скопировал первую задачу (просто изменил путь к файлу), и все работает так, как должно.

Вот первый запуск:

➜ ~ % ansible-playbook test.yml 

PLAY [all] ******************************************************************** 

TASK: [lineinfile ] *********************************************************** 
changed: [localhost] => (item={'regexp': 'PATH', 'line': 'PATH=:~/bin:~/node_modules/.bin:$PATH'}) 

PLAY RECAP ******************************************************************** 
localhost     : ok=1 changed=1 unreachable=0 failed=0 

Чем я удалил ~/bin с пути и побежал снова все это:

➜ ~ % ansible-playbook test.yml 

PLAY [all] ******************************************************************** 

TASK: [lineinfile ] *********************************************************** 
changed: [localhost] => (item={'regexp': 'PATH', 'line': 'PATH=:~/node_modules/.bin:$PATH'}) 

PLAY RECAP ******************************************************************** 
localhost     : ok=1 changed=1 unreachable=0 failed=0 

Как вы можете видеть модуль обнаружил, что я изменил переменной, и он обновил файл. Так что все работает так, как должно.

+0

Спасибо! Я идиот - не знаю, что я делаю неправильно. Вы правы, это работает так, как ожидалось. Я просмотрел свой реальный код (приведенный выше пример), сделал пару модификаций, и он начал работать. – nwinkler

0

Я не совсем уверен, что я полностью понимаю ваш вопрос, но будет либо из этих работ ...

(1) Иметь единый по выделенной линии в .profile для пути, который вы добавляете удалить. Таким образом, в дополнение ко всем вашим другим PATH вещи в .profile, у вас есть линия

export PATH=~/foo/removable:$PATH # ANSIBLE MANAGED 

, что вы используете line_in_file модуль для добавления и удаления.

(2) Сделать использование каталога /etc/profile.d, а затем добавить (через copy или template) and remove a file /etc/profile.d/temporary-path.sh заявление that contains your temporary export`.

Смежные вопросы