【发布时间】:2019-06-03 20:51:38
【问题描述】:
我想将 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 运行,它会安装新包。
问题好像是the provisioner itself:
创建时供应商仅在创建期间运行,而不是在更新或任何其他生命周期期间运行。它们是一种执行系统引导的方法。
但是应用更新的正确方法是什么?我尝试使用depends_on 链接到我的vm 资源的null_ressource,但Terraform 也没有检测到Ansible 部分的更改。似乎是来自 Terraform 插件的lack of change detection。
在文档中,我只找到了销毁时间供应商。但没有更新。我可以摧毁并重新创造这台机器。这会使事情变慢很多。我喜欢 Ansible 检查什么是存在的方法,只应用不存在的更改,这似乎是一种很好的配置方式。
难道不能用 Terraform 做类似的事情吗?
根据我目前的经验(比 Terraform 更 Ansible),我认为没有其他方法可以放弃漂亮的插件并自行执行 Ansible。但这也会放弃良好的集成。所以我需要自己甚至手动生成库存文件(在我看来这错过了自动化方法)。
source_code_hash 可能是一个选项,但不灵活:当有多个播放/角色时,我需要为每个文件手动执行此操作,这很容易出错。
【问题讨论】:
标签: ansible terraform provisioning