Vagrant: конфиги nginx с символической ссылкой не могут быть загружены при запуске гостя

Условия

  • Бродяга 2.0.1
  • Бродячая коробка: ubuntu / xenial64
  • Provisioning: доступный

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 отдельных конфигурации (включенные сайты) из гостевой системы в мою хост-систему с помощью ansible, который будет равен

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

Когда я впервые vagrant up мой Box, сайты доступны, потому что в конце подготовки я перезапускаю службу nginx. Но как только я останавливаю ящик и снова включаю его, сайты недоступны, но служба nginx работает. Затем я могу перезапустить службу nginx в оболочке, и тогда все будет работать нормально.

Причина

Я обнаружил, что на момент запуска службы nginx синхронизированная папка /vagrant не была смонтирована. Служба nginx по-прежнему запускается правильно, независимо от того, могут ли быть разрешены конфиги, связанные с символическими ссылками, или нет.

Вопрос

Я мог бы настроить постоянно работающий сценарий оболочки, который перезапускает службу nginx каждый vagrant up. Но это не то решение, которое я ищу.

Есть ли способ обработать триггер в гостевой системе, как только папка /vagrant будет смонтирована? Я могу представить, что есть какая-то xyz.d папка, в которую я могу поместить сценарии, которые будут выполняться со всеми необходимыми аргументами для идентификации бродячего монтирования.


Изменить (2018-04-25)

Я не хочу полагаться на механизмы Vagrant, такие как плагины или сценарии дальнейшей подготовки. Недавно я перешел с подготовки сценариев оболочки на Ansible, в то время как хочу использовать такую ​​же подготовку для Docker или других механизмов развертывания. И я мог представить ту же проблему с монтированием в Docker.


Изменить (2018-04-27)

Запуск служб после монтирования Vagrant

Я обнаружил, что эта статья @razius имеет точно такую ​​же проблему. Решение устарело, и мне посоветовали поискать systemd эквивалент его решения. Но я не знаком с этим. Так что можно мне помочь.


person codekandis    schedule 25.04.2018    source источник
comment
смотрели ли вы на плагин бродячих триггеров, чтобы можно было запустить триггер после запуска экземпляра   -  person Frederic Henri    schedule 25.04.2018
comment
Спасибо за упоминание. Пожалуйста, прочтите мою правку выше.   -  person codekandis    schedule 25.04.2018


Ответы (1)


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

Я нашел решение, указанное выше, но мне пришлось внести изменения в соответствии со стандартами и рекомендациями systemd.

  • systemd изменения модуля не относятся к /lib/systemd, хотя эти изменения могут быть перезаписаны обновлениями пакетов и / или дистрибутивов в любое время. Изменения единиц измерения должны производиться в копиях единиц в /etc/systemd.
  • скопировать
    /lib/systemd/system/nginx.service
    в
    /etc/systemd/system/nginx.service
  • измените параметр WantedBy в разделе [Install] на vagrant.mount
  • Имейте в виду, что имя vagrant.mount зависит от пути, установленного бродягой в ящик. Если вы монтируете vagrant/somepath, то монтируете имя vagrant-somepath.mount.
  • Выполните следующие команды, чтобы перезаписать целевые файлы модуля и другие необходимые зависимости:
    systemctl daemon-reload
    systemctl disable nginx.service
    systemctl enable nginx.service

Это приводит к моему доступному обработчику следующим образом:

- 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
person codekandis    schedule 04.05.2018