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

Условия

  • Бродяга 2.0.1
  • Vagrant Box: 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 отдельных конфига (enabled-sites) из гостевой системы в мою хост-систему с 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 эквивалент его решения. Но я не знаком с этим. Так что можно мне помочь.

1 Ответ

0 голосов
/ 04 мая 2018

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 в коробку. Если вы монтируете 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
...