Ужасный подход. Это почти так же плохо, как поддержка Dell лучшего ядра в мире.
Вот как это делается, чтобы сохранить рассудок:
О Dell, если бы не тот факт, что я получил этот ноутбук бесплатно, вы бы не получили ни одного из моих денег, и вы не получите больше, пока не поддержите идеальную ОС.
Для создания RAM-диска объемом 1 МБ с помощьюtmpfs
:
mkdir /tmp/ramdisk
mount -t tmpfs -o size=1m myramdisk /tmp/ramdisk
Виртуальный диск ramfs
не выполняет подкачку, но подкачку можно включать и выключать при использовании tmpfs
Виртуального диска:swapoff -a
и swapon -a
соответственно, если необходимо убедиться, что во время использование RAM-диска tmpfs
. Размонтировать:
umount /tmp/ramdisk
Может я что-то упустил, но смысла в описании RAM-диска в /etc/fstab
не вижу; но, если это необходимо, чего-то вроде следующего должно быть достаточно, чтобы RAM-диск был доступен только root
пользователю(mode=0700
):
tmpfs /tmp/ramdisk tmpfs rw,mode=0700,size=1m
В дополнение к ответу @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-playbook
Vagrant. (На момент написания этого поста Debian Stretch
поставляется с ansible 2.2
, который не поддерживает этот аргумент.)
Затем запрашивается пароль хранилища с классом AnsibleVaultPassword
. После этого будет создан tmpfs
, а пароль будет передан сценарию vault-password.sh
для его сохранения на монтировании tmpfs
.
После этого ansible будет запрашивать пароль через сценарий vault-password.sh
в каждом плейбуке, предоставляющем зашифрованные данные хранилища.
И в конце сначала удалится пароль, потом размонтируется монтирование tmpfs
.
Я думаю, что это очень безопасное и надежное решение для предоставления пароля доступного хранилища через временное очищаемое хранилище памяти.Таким образом, работающая система может быть подготовлена, и перезагрузка больше не требуется.