Как конфигурация pkg -работает в спецфайлах RPM?

В дополнение к ответу @Christopher я хотел бы показать, как я интегрировал решение в свой Vagrantfile, чтобы заставить его работать с моим доступным предоставлением.

Пусть кто-нибудь наткнется на это.

Бродячий файл

Vagrant.configure("2") do |config|

    class AnsibleVaultPassword
        def to_s
            begin
                system 'stty -echo'
                print "Enter ansible vault password: "
                pass = STDIN.gets.chomp
                ensure
                system 'stty echo'
            end
            pass
        end
    end

    config.vm.box = "vendor/box-name"
    config.vm.box_version = ">=1.0"
    config.vm.box_url = "https://vagrant.example.com/vendor/box-name.json"
    config.vm.box_download_insecure = true

    config.vm.define "vendor-server-name"
    config.vm.provider "virtualbox" do |provider|
        provider.name = "vendor-server-name"
    end

    config.vm.network "private_network", ip: "192.168.0.42"

    config.vm.synced_folder ".", "/vagrant", type: "nfs"

    config.vm.provision "Provisioning the server `server-name` with the playbook `ansible`", type: "ansible_local" do |provisioner|
        provisioner.compatibility_mode = "2.0"
        provisioner.playbook = "/vagrant/ansible/ansible.yml"
        provisioner.inventory_path = "/vagrant/ansible/inv/integration/hosts"
        provisioner.limit = "localhost"
    end

    config.vm.provision "Requesting the ansible vault password", type: "shell" do |provisioner|
        provisioner.env = { "ansibleVaultPassword" => AnsibleVaultPassword.new }
        provisioner.inline = <<-END
            [[ ! -d "/mnt/ansible-tmp" ]] \
            && mkdir "/mnt/ansible-tmp"
            mountpoint -q "/mnt/ansible-tmp" \
            || mount -t tmpfs -o size=512 ansible-tmp "/mnt/ansible-tmp"
            /vagrant/env/ansible/scripts/vault-password.sh --save "${ansibleVaultPassword}"
        END
    end

    config.vm.provision "Provisioning the server `server-name` with the playbook `environment`", type: "ansible_local" do |provisioner|
        provisioner.compatibility_mode = "2.0"
        provisioner.playbook = "/vagrant/ansible/environment.yml"
        provisioner.raw_arguments = [ "--vault-id /vagrant/ansible/scripts/vault-password.sh" ]
        provisioner.inventory_path = "/vagrant/ansible/inv/integration/hosts"
        provisioner.limit = "localhost"
    end

    config.vm.provision "Provisioning the server `server-name` with the playbook `users`", type: "ansible_local" do |provisioner|
        provisioner.compatibility_mode = "2.0"
        provisioner.playbook = "/vagrant/ansible/users.yml"
        provisioner.raw_arguments = [ "--vault-id /vagrant/ansible/scripts/vault-password.sh" ]
        provisioner.inventory_path = "/vagrant/ansible/inv/integration/hosts"
        provisioner.limit = "localhost"
    end

    config.vm.provision "Deleting the ansible vault password", type: "shell" do |provisioner|
        provisioner.inline = <<-END
            /vagrant/env/ansible/scripts/vault-password.sh --delete
            mountpoint -q "/mnt/ansible-tmp" \
            && umount "/mnt/ansible-tmp"
            [[ -d "/mnt/ansible-tmp" ]] \
            && rm -r "/mnt/ansible-tmp"
        END
    end

end

/vagrant/ansible/scripts/vault -password.sh

#!/usr/bin/env bash

passwordFile="/mnt/ansible-tmp/vault-password"
case "${1}" in
    "-s" | "--save" )
        echo "${2}" > "${passwordFile}"
        ;;
    "-d" | "--delete" )
        unlink "${passwordFile}"
        ;;
    * )
        cat "${passwordFile}"
        ;;
esac

Пока это виртуальная машина Debian, я сначала запускаю playbook ansible, который добавляет репозиторий ansible из Ubuntu, а затем устанавливает последнюю ansible. Это необходимо, по крайней мере, для предоставления аргумента --vault-idвызову ansible-playbookVagrant. (На момент написания этого поста Debian Stretchпоставляется с ansible 2.2, который не поддерживает этот аргумент.)

Затем запрашивается пароль хранилища с классом AnsibleVaultPassword. После этого будет создан tmpfs, а пароль будет передан сценарию vault-password.shдля его сохранения на монтировании tmpfs.

После этого ansible будет запрашивать пароль через сценарий vault-password.shв каждом плейбуке, предоставляющем зашифрованные данные хранилища.

И в конце сначала удалится пароль, потом размонтируется монтирование tmpfs.

Я думаю, что это очень безопасное и надежное решение для предоставления пароля доступного хранилища через временное очищаемое хранилище памяти.Таким образом, работающая система может быть подготовлена, и перезагрузка больше не требуется.

0
12.06.2020, 10:21
0 ответов

Теги

Похожие вопросы