Назад | Перейти на главную страницу

Terraform, как снабдить каплю соляным миньоном (без мастера)

Мне удалось запустить локальный сервер разработки с Бродяга, снабжая его Поваренная соль в конфигурация без мастера. Теперь я пытаюсь воспользоваться существующими солевыми состояниями для подготовки рабочего сервера, но пока не понимаю, как это сделать.

Мне удалось создать Цифровая капля океана с участием Terraform, а теперь я хотел бы снабдить его Поваренная соль, в идеале используя тот же .sls файлы, используемые для подготовки машины для разработки. В Vagrant это довольно тривиально, нужно просто объявить это в Vagrantfile, как это:

config.vm.provision :salt do |salt|
salt.minion_config = "salt/minion"
salt.run_highstate = true

После этого остается лишь создать дерево состояний указывая на наши файлы состояния, где мы объявляем пакеты, которыми мы хотим, чтобы наша машина была подготовлена, файлы, которые мы хотели бы синхронизировать, и т. д.

С участием Terraform однако похоже, что нет аналогичного способа сделать это. Terraform's документация на провизорах довольно мало. Помимо вызова 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
}

Заранее благодарю за любую помощь!


ОБНОВИТЬ

Я добавил следующие два 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 сообщение перед применением любого состояния. Почему именно, пока не знаю.

Хотя это старый вопрос, для потомков я хотел бы упомянуть, что я внес в Terraform провайдер без соли:

https://github.com/hashicorp/terraform/pull/14720

Он был объединен и развернут в выпуске v0.10.2. По какой-то причине кажется, что документ еще не загружен на веб-сайт, однако вы можете получить доступ к необработанному файлу документа здесь: https://github.com/hashicorp/terraform/commit/08670763aa9b3f0a22ebf73f859f3b73a36351e2#diff-29ecd8bdf326c94e4f13d83497bc63e8

Он должен быть похож по использованию на провайдер Packer salt-masterless (я не могу опубликовать другую ссылку из-за репутации).

Вот откуда я изначально скопировал код.

Рассказывая 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 master, что является конфигурацией по умолчанию (при этом миньон будет работать в режиме без мастера). Также необходимо указать корневой каталог для базовой среды, где находится наш файл 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

Я опубликовал пример для настройки мастера соли с Terraform на DigitalOcean, а затем для запуска нескольких миньонов. Помните, что некоторые части примера предполагают, что terraform запущен на машине с Windows (но не на тех, которые перечислены ниже).

Важнейшие биты из saltmaster.tf:

  1. скопируйте ваши файлы SLS на новый сервер с помощью terraform

    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. установить соляной миньон и мастер

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

Это должно дать вам работающий Salt master в DO, запущенный из Terraform.