我设法让本地开发服务器运行Vagrant,并在无主配置中使用Salt对其进行配置。现在,我正在尝试利用现有的盐状态来配置生产服务器,但到目前为止还没有弄清楚如何去做。
我已经设法用Terraform创建了一个Digital Ocean 液滴,现在我想用Salt来配置它,理想情况下使用用于配置开发机器的相同文件。在 Vagrant 中,这是相当简单的,因为只需要在 中声明它,如下所示:.sls
Vagrantfile
config.vm.provision :salt do |salt|
salt.minion_config = "salt/minion"
salt.run_highstate = true
之后,只需创建一个指向我们的状态文件的状态树,我们在其中声明我们希望为我们的机器提供的包,我们希望同步的文件等。
但是,Terraform
似乎没有类似的方法可以做到这一点。Terraform 关于供应商的文档相当稀缺。除了调用 Chef 客户端,或者直接在 a 上声明我们想要复制的文件provisioner
,或者调用脚本之外,我找不到任何关于如何调用 Salt 来配置实例的参考。我想知道这是否可能?
这是我的servers.tf
:
module "hosting" {
source = "./modules/server"
droplet_count = 1
droplet_image = "ubuntu-14-04-x64"
droplet_region = "nyc2"
droplet_size = "512mb"
dns_record_domain = "site.org"
droplet_backups = true
droplet_ipv6 = true
droplet_privatenet = true
}
以下是我的droplet.tf
文件:
provider "digitalocean" {
token = "${var.do_token}"
}
resource "digitalocean_droplet" "droplet" {
image = "${var.droplet_image}"
name = "${var.droplet_type}-${format("%02d", count.index+1)}"
region = "${var.droplet_region}"
size = "${var.droplet_size}"
ssh_keys = ["${var.ssh_fingerprint}"]
backups = "${var.droplet_backups}"
ipv6 = "${var.droplet_ipv6}"
private_networking = "${var.droplet_privatenet}"
}
resource "digitalocean_ssh_key" "default" {
name = "rsa-key-nopass"
public_key = "${file("./.ssh/rsa-key-nopass")}"
}
最后,我的dns_records.tf
文件:
provider "cloudflare" {
email = "${var.cf_email}"
token = "${var.cf_token}"
}
resource "cloudflare_record" "ipv4" {
count = "${var.droplet_count}"
domain = "${var.dns_record_domain}"
name = "${element(digitalocean_droplet.droplet.*.name, count.index)}"
value = "${element(digitalocean_droplet.droplet.*.ipv4_address, count.index)}"
type = "A"
ttl = 3600
}
resource "cloudflare_record" "ipv6" {
count = "${var.droplet_count}"
domain = "${var.dns_record_domain}"
name = "${element(digitalocean_droplet.droplet.*.name, count.index)}"
value = "${element(digitalocean_droplet.droplet.*.ipv6_address, count.index)}"
type = "AAAA"
ttl = 3600
}
提前感谢您的帮助!
更新
我添加了以下两个provisioner
块:
provisioner "file" {
source = "../salt"
destination = "/etc/salt"
}
provisioner "remote-exec" {
inline = [
# install and configure salt-minion
"curl -L https://bootstrap.saltstack.com -o install_salt.sh",
"sudo sh install_salt.sh",
"salt '*' state.apply"
]
}
该/salt
目录已成功复制并安装了盐,但在应用任何状态之前/etc/salt
我会收到一条消息。Script exited with non-zero exit status: 127
具体为什么,我还不知道。
我已经发布了一个示例,在 DigitalOcean 上使用 Terraform 设置 Salt Master,并从那里开始一些 minions。请注意,示例的某些部分假设 terraform ist 在 Windows 机器上启动(但不是下面列出的机器)。
来自
saltmaster.tf
:使用 terraform 将 SLS 文件复制到新服务器
将启动文件复制到新服务器
complete-bootstrap.sh 的内容:
安装 salt minion 和 master
这应该会给你一个从 Terraform 开始的 DO 运行的 Salt Master。
告诉
salt-minion
在本地文件系统中查找状态树并使用命令运行我们salt-minion
的salt-call
命令似乎可以解决问题:在
minion
文件上,告诉 salt 查看本地文件目录而不是salt master
,这是默认配置(这将在 masterless 模式下运行 minion)。还需要将基础环境的根目录指向我们的 top.sls 所在的位置:虽然这是一个老问题,但为了后人,我想提一下,我将 salt-masterless 供应商贡献给了 Terraform:
https://github.com/hashicorp/terraform/pull/14720
它已被合并并部署在 v0.10.2 版本中。无论出于何种原因,该文档似乎尚未上传到网站上,但是您可以在此处访问原始文档文件:https ://github.com/hashicorp/terraform/commit/08670763aa9b3f0a22ebf73f859f3b73a36351e2#diff-29ecd8bdf326c94e4f13d83497bc63e8
它的用法应该与 Packer salt-masterless Provisioner 相似(由于声誉问题,我无法发布另一个链接)。
那是我最初复制代码的地方。