Я хочу объединить Ansible с Terraform, чтобы Terraform создавала машины, а Ansible предоставит их. Используя terraform-provisioner-ansible , можно объединить их без проблем. Но я обнаружил отсутствие обнаружения изменений, которое не происходит, когда Ansible работает автономно.
TL; DR : Как применить изменения, внесенные в Ansible, в плагин Terraform Ansible? Или, по крайней мере, запускать плагин ansible при каждом обновлении, чтобы Ansible мог сам справиться с этим?
Пример использования
Рассмотрим эту пьесу, которая устанавливает несколько пакетов
- name: Ansible install package test
hosts: all
tasks:
- name: Install cli tools
become: yes
apt:
name: "{{ tools }}"
update_cache: yes
vars:
tools:
- nnn
- htop
, который интегрирован в Terraform с помощью плагина
resource "libvirt_domain" "ubuntu18" {
# ...
connection {
type = "ssh"
host = "192.168.2.2"
user = "ubuntu"
private_key = "${file("~/.ssh/id_rsa")}"
}
provisioner "ansible" {
plays {
enabled = true
become_method = "sudo"
playbook = {
file_path = "ansible-test.yml"
}
}
}
}
будет отлично работать при первом запуске. Но позже я заметил, что какой-то пакет пропал
- name: Ansible install package test
hosts: all
tasks:
- name: Install cli tools
become: yes
apt:
name: "{{ tools }}"
update_cache: yes
vars:
tools:
- nnn
- htop
- vim # This is a new package
При запуске terraform plan
Я получу No changes. Infrastructure is up-to-date.
Мой новый пакет vim
никогда не будет установлен! Таким образом, Ansible не запустился, потому что, если Ansible запустится, он установит новый пакет.
Кажется, проблема в самом провайдере :
Поставщики времени создания запускаются только во время создания, а не во время обновления или любого другого жизненного цикла. Они предназначены для выполнения начальной загрузки системы.
Но как правильно применять обновления? Я попытался null_ressource
со ссылкой depends_on
на мой ресурс vm, но Terraform также не обнаруживает изменений в части Ansible. Кажется, отсутствие обнаружения изменений из плагина Terraform.
В документе я нашел только провайдеров уничтожения времени. Но не для обновлений. Я мог уничтожить и воссоздать машину. Это сильно замедлит ход событий. Мне нравится Ansible подход к проверке того, что предвидится, и применять только те изменения, которых еще нет, это кажется хорошим способом обеспечения.
Разве нельзя сделать что-то подобное с Terraform?
С моим текущим опытом (более Ansible, чем Terraform) я не вижу другого способа, как сбросить красивый плагин и выполнить Ansible самостоятельно. Но это также отбросило бы хорошую интеграцию. Поэтому мне нужно создавать файлы инвентаризации самостоятельно или даже вручную (что на мой взгляд не соответствует подходу автоматизации).
source_code_hash может быть вариантом, но негибким: при наличии нескольких пьес / ролей мне нужно делать это вручную для каждого отдельного файла, который легко подвержен ошибкам.