代码之家  ›  专栏  ›  技术社区  ›  codekandis

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

  •  0
  • codekandis  · 技术社区  · 6 年前

    条件

    • 流浪汉2.0.1
    • 漫游框:ubuntu/xenial64
    • 设置:ansible

    流浪者档案

    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
    

    问题

    可以看到,我的guest上运行了3台nginx主机。我使用ansible将这3个单独的配置(启用的站点)从来宾系统符号链接到主机系统,ansible等于

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

    当我第一次 vagrant up 我的盒子站点是可访问的,因为在资源调配结束时,我会重新启动 nginx 服务但一旦我停下盒子,再次打开它,网站就无法访问,但 nginx公司 服务正在运行。然后,我可以重新启动 nginx公司 壳牌的服务和一切都很好。

    原因

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

    问题

    我可以设置一个始终运行的provision shell脚本,该脚本将重新启动 nginx公司 在每个 流浪者向上 .但这不是我想要的解决方案。

    是否有一种方法可以在 /流浪汉 文件夹是否已装入?我可以想象 xyz.d 我可以在文件夹中放置脚本,脚本将使用所有必要的参数执行,以识别流浪装载。


    编辑(2018-04-25)

    我不想依赖Vagrant的机制,如插件或进一步的配置脚本。我最近从配置shell脚本更改为Ansible,同时我希望对Docker或其他部署机制使用相同的配置。我可以想象Docker的坐骑也有同样的问题。


    编辑(2018-04-27)

    Launching services after Vagrant mount

    我发现@razius的这篇文章也有同样的问题。解决方案不是最新的,我得到提示,要寻找 systemd 相当于他的解决方案。但我对它不熟悉。所以有人可以帮我。

    1 回复  |  直到 6 年前
        1
  •  0
  •   codekandis    6 年前

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

    我找到了上面链接的解决方案,但由于 systemd 标准和建议。

    • 系统D 单位更改不属于 /lib/systemd 而这些更改可以随时被包和/或分发更新覆盖。单位变更必须以单位副本的形式进行 /etc/systemd
    • 复制
      /lib/systemd/system/nginx.service

      /etc/systemd/system/nginx.service
    • 更改设置 WantedBy 在节中 [Install] vagrant.mount
    • 请注意,名称 流浪汉攀登 取决于流浪者装进箱子的路径。如果您安装 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