Резервное копирование веб-сервера Ansible: извлекайте другие переменные хоста для создания сценариев резервного копирования.
Я использую Ansible для управления группой разнородных облачных серверов Linux. Я создал сценарий, который переносит резервные копии на сервер резервного копирования через rync через ssh. Все переменные хоста управляются вhost_vars/example.com.yml
файлы, каждый из которых содержит следующее:
ansible_host: example.com
ansible_user: user
ansible_port: 22
ansible_ssh_private_key_file: "~/.ssh/id_ed25519"
Они сгруппированы вhosts
файл такой:
[webservers]
example.com
foo.com
bar.com
[backup]
backupserver.domain.com
У меня есть роль резервного копирования для группы резервного копирования, содержащей сервер backupserver.domain.com, содержащий сценарии rsync, но мне нужно вручную реплицировать ansible host_vars в эту роль резервного копирования, чтобы создать конфигурацию SSH, содержащую всю информацию, уже содержащуюся вhost_vars/*.yml
файлы.
Итак, мой вопрос: можно ли внутри роли перебирать переменные хоста другого хоста за пределами текущего хоста и группы? Что-то вроде:
{% for item in var_hosts_group %}
Host {{ item.ansible_host }}
Hostname {{ item.ansible_host }}
User {{ item.ansible_user }}
Port {{ item.ansible_port }}
IdentityFile {{ item.ansible_ssh_private_key_file }}
{% endfor %}
Тогда сценарий rsync будет таким:
{% for item in var_hosts_group %}
rsync -a {{ item.ansible_host }}:/remotebackup /localbackup
{% endfor %}
Это позволило бы мне генерировать необходимые шаблоны/скрипты для веб-серверов на резервном сервере и сохранять все в порядке и СУХОМ. Это возможно? Спасибо!
1 ответ
Вопрос: « Можно ли перебирать переменные хоста другого хоста за пределами текущего хоста и групп? »
(Я изменился
group/groups
. Хост может быть членом нескольких групп.)
А: Да. Возможно. Hostvars — это словарь всех хостов и их переменных в игре, например
{% for item in ansible_play_hosts_all %}
Host {{ hostvars[item]['ansible_host'] }}
Hostname {{ hostvars[item]['ansible_host'] }}
User {{ hostvars[item]['ansible_user'] }}
Port {{ hostvars[item]['ansible_port'] }}
IdentityFile {{ hostvars[item]['ansible_ssh_private_key_file'] }}
{% endfor %}
- Такой хост должен быть членом ansible_play_hosts_all . Цитирование
«Список всех хостов, на которых нацелена игра»
Если хост не является целью игры, Ansible, конечно, ничего об этом не знает.
Вы, очень вероятно, захотите
delegate_to
иrun_once
такая задача.