我已经设法得到一个本地开发服务器运行与Vagrant ,configuration与Salt在无主configuration 。 现在,我试图利用现有的盐状态来configuration一个生产服务器,但到目前为止还没有弄清楚如何去做。
我设法用Terraform创build了一个数字海洋液滴 ,现在我想用Saltconfiguration它,最好使用与开发机器configuration相同的.sls文件。 在stream浪,这是相当微不足道的,因为只需要在Vagrantfile声明它,就像这样:
config.vm.provision :salt do |salt| salt.minion_config = "salt/minion" salt.run_highstate = true
之后,只需要创build一个指向我们状态文件的状态树 ,在这里我们声明我们希望我们的机器configuration的包,我们想要同步的文件等。
然而, Terraform似乎没有类似的方法来做到这一点。 Terraform关于提供者的文档相当稀less。 除了调用Chef Client,或者直接在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 }
提前感谢任何帮助!
UPDATE
我已经添加了以下两个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 ,salt也被安装,但是我得到了一个Script exited with non-zero exit status: 127的Script exited with non-zero exit status: 127在应用任何状态之前的Script exited with non-zero exit status: 127消息。 为什么呢,我还不知道。
我已经发布了一个例子,在DigitalOcean上用Terraform设置一个Salt master,然后从那里开始一些奴才 。 请注意,本示例的某些部分假定terraform是在Windows机器上启动的(但不是下面列出的)。
来自saltmaster.tf的重要saltmaster.tf :
使用terraform将您的SLS文件复制到新服务器
provisioner "file" { source = "master/srv" destination = "/" }
将启动文件复制到新的服务器
provisioner "file" { source = "complete-bootstrap.sh" destination = "/tmp/complete-bootstrap.sh" }
complete-bootstrap.sh的内容:
#!/bin/bash -x # create the minion's key pair and accept it on the master mkdir -p /etc/salt/pki/master/minions salt-key --gen-keys=minion --gen-keys-dir=/etc/salt/pki/minion mkdir -p /etc/salt/pki/minion cp /etc/salt/pki/minion/minion.pub /etc/salt/pki/master/minions/master service salt-master start salt-call -l debug state.highstate service salt-minion start
安装盐仆人和主人
provisioner "remote-exec" { inline = [ # install salt-minion and salt-master, but don't start services "curl -L https://bootstrap.saltstack.com | sh -s -- -M -X -A localhost", # work around possible missing executable flag "cat /tmp/complete-bootstrap.sh | sh -s" ] }
这应该给你一个在Terraform开始的DO运行的Salt主人。
让salt-minion在本地文件系统中查找状态树,用salt-call命令来运行我们的salt-minion似乎有诀窍:
provisioner "remote-exec" { inline = [ # install salt-minion "wget -O - http://bootstrap.saltstack.org | sudo sh" ] } provisioner "remote-exec" { inline = [ # tell salt-minion to look for the state tree in # the local file system, with the --local flag. "salt-call --local state.highstate" ] }
在minion文件中,告诉salt查看本地文件目录,而不是salt master ,这是默认configuration(这将在无主模式下运行minion)。 我们还需要将基本环境的根目录指向我们的top.sls所在的位置:
# Tell salt-minion to not look for a master. # Default configuration is file_client: remote file_client: local # Set the root directory for the base environment # to where our top.sls is located. file_roots: base: - /etc/salt/roots
虽然这是一个古老的问题,但为了后代,我想提一下,我把这个salt-masterless provisioner贡献给了Terraform:
https://github.com/hashicorp/terraform/pull/14720
它已经在v0.10.2发行版中合并和部署。 无论出于何种原因,它看起来像文档尚未上传到网站上,但是您可以访问原始doc文件在这里: https : //github.com/hashicorp/terraform/commit/08670763aa9b3f0a22ebf73f859f3b73a36351e2#diff-29ecd8bdf326c94e4f13d83497bc63e8
它应该与Packer salt-masterless provisioner类似(我不能因为声誉而发布另一个链接)。
这就是我从最初复制代码的地方。