Мне удалось запустить локальный сервер разработки с Бродяга, снабжая его Поваренная соль в конфигурация без мастера. Теперь я пытаюсь воспользоваться существующими солевыми состояниями для подготовки рабочего сервера, но пока не понимаю, как это сделать.
Мне удалось создать Цифровая капля океана с участием 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
:
скопируйте ваши файлы SLS на новый сервер с помощью terraform
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"
]
}
Это должно дать вам работающий Salt master в DO, запущенный из Terraform.