AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 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,如何使用 salt-minion 提供液滴(无主控)

  • 772

我设法让本地开发服务器运行Vagrant,并在无主配置中使用Salt对其进行配置。现在,我正在尝试利用现有的盐状态来配置生产服务器,但到目前为止还没有弄清楚如何去做。

我已经设法用Terraform创建了一个Digital Ocean 液滴,现在我想用Salt来配置它,理想情况下使用用于配置开发机器的相同文件。在 Vagrant 中,这是相当简单的,因为只需要在 中声明它,如下所示:.slsVagrantfile

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具体为什么,我还不知道。

vagrant
  • 3 3 个回答
  • 1900 Views

3 个回答

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

    我已经发布了一个示例,在 DigitalOcean 上使用 Terraform 设置 Salt Master,并从那里开始一些 minions。请注意,示例的某些部分假设 terraform ist 在 Windows 机器上启动(但不是下面列出的机器)。

    来自saltmaster.tf:

    1. 使用 terraform 将 SLS 文件复制到新服务器

      provisioner "file" {
          source = "master/srv"
          destination = "/"
      }
      
    2. 将启动文件复制到新服务器

      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
      
    3. 安装 salt minion 和 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"
          ]
      }
      

    这应该会给你一个从 Terraform 开始的 DO 运行的 Salt Master。

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

    告诉salt-minion在本地文件系统中查找状态树并使用命令运行我们salt-minion的salt-call命令似乎可以解决问题:

    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,这是默认配置(这将在 masterless 模式下运行 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
    
    • 1
  3. Sevag
    2017-08-23T14:44:29+08:002017-08-23T14:44:29+08:00

    虽然这是一个老问题,但为了后人,我想提一下,我将 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 相似(由于声誉问题,我无法发布另一个链接)。

    那是我最初复制代码的地方。

    • 1

相关问题

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

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

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve