Что может быть возможным эквивалентом chef, если он помечен для использования в ansible? - PullRequest
0 голосов
/ 06 ноября 2019

Глядя, чтобы найти решение для использования тега Chef в ansible. Теги создаются на сервере chef с помощью команды ножа, и его можно вызывать в рецепте if-tagged.

Каков эквивалентный способ сделать это в ansible?

Итак, в приведенном ниже коде, если узел помечен как prod, он выбирает шаблон prod из поваренной книги и копирует впуть назначения узла.

if tagged?('prod')
  template '/etc/prod.yml' do
  source 'prod.erb'
  action :create
end
else
template '/etc/qa.yml' do
  source 'qa.erb'
  action :create
  end
end

1 Ответ

0 голосов
/ 07 ноября 2019

Не совсем уверен, «как» вы определяете / помечаете свои хосты, являются ли они рабочими или нет. Но вот пример использования соглашений об именах хостов.

  - set_fact: myenv="prod"
    when: ( ansible_hostname | search("-p$")) or ( ansible_hostname | search("-prod$") )

При этом анализируется имя хоста целевого сервера и, если имя хоста заканчивается на -p или -prod, переменная (факт) с именем myenv со значением prod создано. Конечно, вы также можете использовать другие переменные или проверить на цели наличие файлов или настроек конфигурации и т. Д.

Затем вы можете использовать модуль copy:

  - name: Copy PROD config on PROD hosts
    copy: src=/srv/ansible/configs/prod.yml dest=/etc/prod.yml owner=root group=root mode=0644
    when: myenv == "prod"

  - name: Copy QA config on non-PROD hosts
    copy: src=/srv/ansible/configs/qa.yml dest=/etc/qa.yml owner=root group=root mode=0644
    when: myenv is undefined

Примечание Iдобавлен when: myenv is undefined, потому что set_fact выше определяет переменную myenv только тогда, когда поиск имени хоста соответствует соглашению об именах prod. Для всех других хостов это не относится, и для ansible переменная не устанавливается в этом случае. Вы можете создать второй set_fact, где вы также определите свои qa хосты. В этом случае вы можете настроить условие when задачи «Копировать QA ..» на что-то вроде when: myenv is undefined or myenv != "prod".

Или использовать фиксированную переменную факта (без других сред в этом случае), проще, номенее динамичный:

  - set_fact: myprod=yes
    when: ( ansible_hostname | search("-p$")) or ( ansible_hostname | search("-prod$") )

  - name: Copy PROD config on PROD hosts
    copy: src=/srv/ansible/configs/prod.yml dest=/etc/prod.yml owner=root group=root mode=0644
    when: myprod is defined

  - name: Copy QA config on all other hosts
    copy: src=/srv/ansible/configs/qa.yml dest=/etc/qa.yml owner=root group=root mode=0644
    when: myprod is undefined
...