Vagrant:无法在来宾启动时加载符号链接的 nginx 配置
Vagrant: symlinked nginx configs cannot be loaded on guest's start
条件
- 流浪汉 2.0.1
- Vagrant 盒子:ubuntu/xenial64
- 配置:ansible
Vagrantfile
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/xenial64"
config.vm.box_download_insecure = true
config.vm.define "foobar"
config.vm.provider "virtualbox" do |provider|
provider.name = "foobar"
provider.customize [ "modifyvm", :id, "--uartmode1", "disconnected" ]
end
config.vm.network "private_network", ip: "192.168.5.4"
config.vm.hostname = "foobar.dev"
config.hostsupdater.aliases = ["pma.foobar.dev","readis.foobar.dev"]
config.vm.synced_folder ".", "/vagrant", type: "nfs"
config.vm.provision "Installing 'vagrant'", type: "ansible_local" do |provisioner|
provisioner.playbook = "/vagrant/env/ansible/install-vagrant.yml"
provisioner.inventory_path = "/vagrant/env/ansible/inv/integration/hosts"
provisioner.limit = "localhost"
end
end
问题
正如你所看到的,我的来宾上有 3 个 nginx 主机 运行。我使用 ansible 将这 3 个单独的配置(启用站点)从访客系统符号链接到我的主机系统,这将等于
sudo ln -s /vagrant/path/to/dist.conf /etc/nginx/sites-enabled/dist.conf
当我第一次 vagrant up
我的 Box 时,网站是可以访问的,因为在配置结束时我重新启动了 nginx
服务。但是,一旦我停止并再次打开它,这些站点就无法访问,但是 nginx
服务是 运行。然后我可以在 shell 上重新启动 nginx
服务,然后一切正常。
原因
我发现在 nginx
服务启动时,同步的 /vagrant
文件夹尚未安装。 nginx
服务仍然正常启动,无论是否可以解析符号链接配置。
问题
我可以设置一个规定 shell 脚本 运行 始终在每个 vagrant up
上重新启动 nginx
服务。但这不是我正在寻找的解决方案。
有没有办法在挂载 /vagrant
文件夹后立即处理来宾系统中的触发器?我可以想象有某种 xyz.d
文件夹,我可以将脚本放入其中,这些脚本将使用所有必要的参数执行以识别 vagrant mount。
编辑 (2018-04-25)
我不想依赖 Vagrant 的机制,例如插件或进一步的配置脚本。我最近从配置 shell 脚本更改为 Ansible,同时我想对 Docker 或其他部署机制使用相同的配置。我可以想象 Docker.
中的安装有同样的问题
编辑 (2018-04-27)
Launching services after Vagrant mount
我发现@razius 的这篇文章有完全相同的问题。该解决方案不是最新的,我得到了寻找与他的解决方案等效的 systemd
的提示。但我不熟悉它。所以可能有人可以帮助我。
我找到了上面链接的解决方案,但由于 systemd
标准和建议,我不得不进行修改。
systemd
单元更改不属于 /lib/systemd
,而这些更改可以随时被包和/或分发更新覆盖。必须在 /etc/systemd
. 中的单位副本中更改单位
- 复制
/lib/systemd/system/nginx.service
至
/etc/systemd/system/nginx.service
- 将
[Install]
部分中的设置 WantedBy
更改为 vagrant.mount
- 请注意,名称
vagrant.mount
取决于 vagrant 安装到框中的路径。如果挂载 vagrant/somepath
则挂载名为 vagrant-somepath.mount
.
- 运行命令如下重写单元的目标文件和其他必要的依赖:
systemctl daemon-reload
systemctl disable nginx.service
systemctl enable nginx.service
这导致我的 ansible 处理程序如下:
- name: Stopping the service 'nginx.service'
listen: "restart service 'nginx.service'"
systemd:
name: "nginx.service"
state: stopped
- name: Copying the service unit 'nginx.service'
listen: "restart service 'nginx.service'"
copy:
src: "/lib/systemd/system/nginx.service"
dest: "/etc/systemd/system/nginx.service"
force: yes
- name: Configuring the service unit 'nginx.service' dependency to 'vagrant.mount'
listen: "restart service 'nginx.service'"
replace:
path: "/etc/systemd/system/nginx.service"
regexp: "^WantedBy=(.*)$"
replace: "WantedBy=vagrant.mount"
- name: Running 'daemon-reload'
listen: "restart service 'nginx.service'"
systemd:
daemon-reload: yes
- name: Disabling service 'nginx.service'
listen: "restart service 'nginx.service'"
systemd:
name: "nginx.service"
enabled: no
- name: Enabling service 'nginx.service'
listen: "restart service 'nginx.service'"
systemd:
name: "nginx.service"
enabled: yes
- name: Starting service 'nginx.service'
listen: "restart service 'nginx.service'"
systemd:
name: "nginx.service"
state: started
条件
- 流浪汉 2.0.1
- Vagrant 盒子:ubuntu/xenial64
- 配置:ansible
Vagrantfile
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/xenial64"
config.vm.box_download_insecure = true
config.vm.define "foobar"
config.vm.provider "virtualbox" do |provider|
provider.name = "foobar"
provider.customize [ "modifyvm", :id, "--uartmode1", "disconnected" ]
end
config.vm.network "private_network", ip: "192.168.5.4"
config.vm.hostname = "foobar.dev"
config.hostsupdater.aliases = ["pma.foobar.dev","readis.foobar.dev"]
config.vm.synced_folder ".", "/vagrant", type: "nfs"
config.vm.provision "Installing 'vagrant'", type: "ansible_local" do |provisioner|
provisioner.playbook = "/vagrant/env/ansible/install-vagrant.yml"
provisioner.inventory_path = "/vagrant/env/ansible/inv/integration/hosts"
provisioner.limit = "localhost"
end
end
问题
正如你所看到的,我的来宾上有 3 个 nginx 主机 运行。我使用 ansible 将这 3 个单独的配置(启用站点)从访客系统符号链接到我的主机系统,这将等于
sudo ln -s /vagrant/path/to/dist.conf /etc/nginx/sites-enabled/dist.conf
当我第一次 vagrant up
我的 Box 时,网站是可以访问的,因为在配置结束时我重新启动了 nginx
服务。但是,一旦我停止并再次打开它,这些站点就无法访问,但是 nginx
服务是 运行。然后我可以在 shell 上重新启动 nginx
服务,然后一切正常。
原因
我发现在 nginx
服务启动时,同步的 /vagrant
文件夹尚未安装。 nginx
服务仍然正常启动,无论是否可以解析符号链接配置。
问题
我可以设置一个规定 shell 脚本 运行 始终在每个 vagrant up
上重新启动 nginx
服务。但这不是我正在寻找的解决方案。
有没有办法在挂载 /vagrant
文件夹后立即处理来宾系统中的触发器?我可以想象有某种 xyz.d
文件夹,我可以将脚本放入其中,这些脚本将使用所有必要的参数执行以识别 vagrant mount。
编辑 (2018-04-25)
我不想依赖 Vagrant 的机制,例如插件或进一步的配置脚本。我最近从配置 shell 脚本更改为 Ansible,同时我想对 Docker 或其他部署机制使用相同的配置。我可以想象 Docker.
中的安装有同样的问题编辑 (2018-04-27)
Launching services after Vagrant mount
我发现@razius 的这篇文章有完全相同的问题。该解决方案不是最新的,我得到了寻找与他的解决方案等效的 systemd
的提示。但我不熟悉它。所以可能有人可以帮助我。
我找到了上面链接的解决方案,但由于 systemd
标准和建议,我不得不进行修改。
systemd
单元更改不属于/lib/systemd
,而这些更改可以随时被包和/或分发更新覆盖。必须在/etc/systemd
. 中的单位副本中更改单位
- 复制
/lib/systemd/system/nginx.service
至
/etc/systemd/system/nginx.service
- 将
[Install]
部分中的设置WantedBy
更改为vagrant.mount
- 请注意,名称
vagrant.mount
取决于 vagrant 安装到框中的路径。如果挂载vagrant/somepath
则挂载名为vagrant-somepath.mount
. - 运行命令如下重写单元的目标文件和其他必要的依赖:
systemctl daemon-reload
systemctl disable nginx.service
systemctl enable nginx.service
这导致我的 ansible 处理程序如下:
- name: Stopping the service 'nginx.service'
listen: "restart service 'nginx.service'"
systemd:
name: "nginx.service"
state: stopped
- name: Copying the service unit 'nginx.service'
listen: "restart service 'nginx.service'"
copy:
src: "/lib/systemd/system/nginx.service"
dest: "/etc/systemd/system/nginx.service"
force: yes
- name: Configuring the service unit 'nginx.service' dependency to 'vagrant.mount'
listen: "restart service 'nginx.service'"
replace:
path: "/etc/systemd/system/nginx.service"
regexp: "^WantedBy=(.*)$"
replace: "WantedBy=vagrant.mount"
- name: Running 'daemon-reload'
listen: "restart service 'nginx.service'"
systemd:
daemon-reload: yes
- name: Disabling service 'nginx.service'
listen: "restart service 'nginx.service'"
systemd:
name: "nginx.service"
enabled: no
- name: Enabling service 'nginx.service'
listen: "restart service 'nginx.service'"
systemd:
name: "nginx.service"
enabled: yes
- name: Starting service 'nginx.service'
listen: "restart service 'nginx.service'"
systemd:
name: "nginx.service"
state: started