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