流浪者:符号链接的nginx配置无法在来宾启动时加载



条件

  • Vagrant 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主机。我将这3个单独的配置(启用座位(从客座系统链接到了我的主机系统中,该系统将等于

sudo ln -s /vagrant/path/to/dist.conf /etc/nginx/sites-enabled/dist.conf

我第一次vagrant up我的盒子时,站点是可触及的,因为在配置结束时,我重新启动了nginx服务。但是,一旦我停止盒子并再次上盒子,这些站点就无法到达,但是nginx服务正在运行。然后,我可以在外壳上重新启动nginx服务,然后一切正常。

原因

我发现当时nginx服务启动同步/vagrant文件夹尚未安装。nginx服务仍然可以正常启动,无论是否可以解决符号链接配置。

问题

我可以始终设置运行的Provision Shell脚本,该脚本会在每个vagrant up上重新启动nginx服务。但这不是我正在寻找的解决方案。

一旦安装了/vagrant文件夹,是否有一种方法可以处理来宾系统中的触发器?我可以想象,我可以将脚本放入其中的某种xyz.d文件夹,其中将使用所有必要参数来识别Vagrant Mount。


编辑(2018-04-25(

我不想依靠流浪者的机制,例如插件或进一步的配置脚本。最近,我想将相同的配置用于Docker或其他部署机制,从而将Shell脚本改为Ansible。我可以想象Docker中的安装座也存在同样的问题。


编辑(2018-04-27(

启动服务后启动服务

我发现@razius的这篇文章遇到了完全相同的问题。该解决方案不是最新的,我有提示要寻找相当于他的解决方案的systemd。但是我不熟悉它。所以可以帮助我。

https://stackoverflow.com/a/38559856/2323764

我找到了上面链接的解决方案,但是由于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

最新更新