AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / server / Perguntas / 762673
Accepted
nunop
nunop
Asked: 2016-03-10 08:51:44 +0800 CST2016-03-10 08:51:44 +0800 CST 2016-03-10 08:51:44 +0800 CST

Terraform, como provisionar droplet com salt-minion (sem mestre)

  • 772

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 .slsarquivos 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 Terraformentanto, 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.tfarquivo:

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.tfarquivo:

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 provisionerblocos 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 /saltdiretório está sendo copiado com sucesso /etc/salte o salt também está sendo instalado, mas estou recebendo uma Script exited with non-zero exit status: 127mensagem antes que qualquer estado seja aplicado. Por que exatamente, ainda não sei.

vagrant
  • 3 3 respostas
  • 1900 Views

3 respostas

  • Voted
  1. ahus1
    2016-03-14T09:00:20+08:002016-03-14T09:00:20+08:00

    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:

    1. copie seus arquivos SLS para o novo servidor usando terraform

      provisioner "file" {
          source = "master/srv"
          destination = "/"
      }
      
    2. copie um arquivo de inicialização para o novo servidor

      provisioner "file" {
          source = "complete-bootstrap.sh"
          destination = "/tmp/complete-bootstrap.sh"
      }
      

      O conteúdo do 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
      
    3. instalar salt minion e master

      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"
          ]
      }
      

    Isso deve fornecer a você um Salt master em execução no DO iniciado no Terraform.

    • 1
  2. Best Answer
    nunop
    2016-03-15T09:50:27+08:002016-03-15T09:50:27+08:00

    Dizer salt-minionpara procurar a árvore de estado no sistema de arquivos local e executar nosso salt-minioncom o salt-callcomando parece funcionar:

    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"
        ]
    }
    

    No minionarquivo, diga ao sal para olhar para o diretório de arquivo local em vez do salt 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:

    # 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
    
    • 1
  3. Sevag
    2017-08-23T14:44:29+08:002017-08-23T14:44:29+08:00

    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.

    • 1

relate perguntas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Você pode passar usuário/passar para autenticação básica HTTP em parâmetros de URL?

    • 5 respostas
  • Marko Smith

    Ping uma porta específica

    • 18 respostas
  • Marko Smith

    Verifique se a porta está aberta ou fechada em um servidor Linux?

    • 7 respostas
  • Marko Smith

    Como automatizar o login SSH com senha?

    • 10 respostas
  • Marko Smith

    Como posso dizer ao Git para Windows onde encontrar minha chave RSA privada?

    • 30 respostas
  • Marko Smith

    Qual é o nome de usuário/senha de superusuário padrão para postgres após uma nova instalação?

    • 5 respostas
  • Marko Smith

    Qual porta o SFTP usa?

    • 6 respostas
  • Marko Smith

    Linha de comando para listar usuários em um grupo do Windows Active Directory?

    • 9 respostas
  • Marko Smith

    O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL?

    • 3 respostas
  • Marko Smith

    Como determinar se uma variável bash está vazia?

    • 15 respostas
  • Martin Hope
    Davie Ping uma porta específica 2009-10-09 01:57:50 +0800 CST
  • Martin Hope
    kernel O scp pode copiar diretórios recursivamente? 2011-04-29 20:24:45 +0800 CST
  • Martin Hope
    Robert ssh retorna "Proprietário incorreto ou permissões em ~/.ssh/config" 2011-03-30 10:15:48 +0800 CST
  • Martin Hope
    Eonil Como automatizar o login SSH com senha? 2011-03-02 03:07:12 +0800 CST
  • Martin Hope
    gunwin Como lidar com um servidor comprometido? 2011-01-03 13:31:27 +0800 CST
  • Martin Hope
    Tom Feiner Como posso classificar a saída du -h por tamanho 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent Como determinar se uma variável bash está vazia? 2009-05-13 09:54:48 +0800 CST

Hot tag

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve