Consegui colocar um servidor de desenvolvimento local em execução com Vagrant , provisionando-o com Salt em uma configuração sem mestre . Agora, estou tentando aproveitar os estados salt existentes para provisionar um servidor de produção, mas até agora não descobri como fazer isso.
Consegui criar um droplet Digital Ocean com Terraform e agora gostaria de provisioná-lo com Salt , de preferência usando os mesmos .sls
arquivos usados para provisionar a máquina de desenvolvimento. No Vagrant, isso é bastante trivial, pois basta declará-lo em Vagrantfile
, assim:
config.vm.provision :salt do |salt|
salt.minion_config = "salt/minion"
salt.run_highstate = true
Depois é só criar uma árvore de estados apontando para os nossos arquivos de estado, onde declaramos os pacotes que gostaríamos que nossa máquina fosse provisionada, os arquivos que gostaríamos de sincronizar, etc.
No Terraform
entanto, parece não haver uma maneira semelhante de fazê-lo. A documentação do Terraform sobre provisionadores é bastante escassa. Além de invocar um Chef Client ou declarar os arquivos que queremos copiar diretamente em um provisioner
, ou invocar um script, não consegui encontrar nenhuma referência sobre como invocar o Salt para provisionar uma instância. Eu me pergunto se é mesmo possível?
Aqui está o meu 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
}
Segue meu droplet.tf
arquivo:
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")}"
}
E, finalmente, meu dns_records.tf
arquivo:
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
}
Agradecemos antecipadamente por qualquer ajuda!
ATUALIZAR
Eu adicionei os dois provisioner
blocos a seguir:
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"
]
}
O /salt
diretório está sendo copiado com sucesso /etc/salt
e o salt também está sendo instalado, mas estou recebendo uma Script exited with non-zero exit status: 127
mensagem antes que qualquer estado seja aplicado. Por que exatamente, ainda não sei.
Publiquei um exemplo para configurar um Salt master com Terraform no DigitalOcean, e a partir daí iniciar alguns minions . Esteja ciente de que algumas partes do exemplo assumem que o terraform foi iniciado em uma máquina Windows (mas não nas listadas abaixo).
Os bits essenciais de
saltmaster.tf
:copie seus arquivos SLS para o novo servidor usando terraform
copie um arquivo de inicialização para o novo servidor
O conteúdo do complete-bootstrap.sh:
instalar salt minion e master
Isso deve fornecer a você um Salt master em execução no DO iniciado no Terraform.
Dizer
salt-minion
para procurar a árvore de estado no sistema de arquivos local e executar nossosalt-minion
com osalt-call
comando parece funcionar:No
minion
arquivo, diga ao sal para olhar para o diretório de arquivo local em vez dosalt master
, que é a configuração padrão (isso executará o minion no modo sem mestre). Também é necessário apontar o diretório raiz do ambiente base para onde nosso top.sls está localizado:Embora esta seja uma pergunta antiga, para a posteridade, gostaria de mencionar que contribuí com o provisionador sem sal para o Terraform:
https://github.com/hashicorp/terraform/pull/14720
Ele foi mesclado e implantado na versão v0.10.2. Por qualquer motivo, parece que o documento ainda não foi carregado no site, no entanto, você pode acessar o arquivo bruto do documento aqui: https://github.com/hashicorp/terraform/commit/08670763aa9b3f0a22ebf73f859f3b73a36351e2#diff-29ecd8bdf326c94e4f13d83497bc63e8
Deve ser semelhante em uso ao provisionador salt-masterless do Packer (não posso postar outro link devido à reputação).
Foi daí que copiei o código inicialmente.