Назад | Перейти на главную страницу

Как я могу решить проблемы с зависимостями с помощью установочного скрипта resolvconf / dnsmasq?

У меня есть следующий модуль Puppet:

class resolvconf {
    $packages = ['resolvconf', 'dnsmasq']
    package { $packages: ensure => installed, }

    file { '/etc/resolvconf/resolv.conf.d/base':
        ensure  => file,
        owner   => root,
        group   => root,
        content => '
nameserver 127.0.0.1
nameserver 8.8.8.8
nameserver 8.8.4.4',
    }

    service { 'dnsmasq':
        require   => Package[resolvconf],
        ensure    => running,
        subscribe => File['/etc/resolvconf/resolv.conf.d/base']
    }
}

Однако, когда я запускаю подготовку, я получаю следующую ошибку:

err: /Stage[mainpting/Resolvconf/File[/etc/resolvconf/resolv.conf.d/base ]/ensure: изменение с отсутствующего на файл не выполнено: не удалось установить 'файл при условии: нет такого файла или каталога - / etc / resolvconf / resolv.conf.d / base.puppettmp_4012 в /tmp/vagrant-puppet/modules-0/resolvconf/manifests/init.pp:13

Я понимаю это значит, что /etc/resolvconf/resolv.conf.d/base еще не существует или не может быть создан. Эта проблема, кажется, в конечном итоге исчезнет после ряда повторных инициализаций или перезагрузки, так что это может быть своего рода проблема зависимости, которую я мог бы решить с помощью соответствующей зависимости или оператора exec.

Кроме того, из-за этой неудачной зависимости следующее будет зависать на неопределенный срок:

notice: /Stage[main]/Resolvconf/Service[dnsmasq]: Dependency File[/etc/resolvconf/resolv.conf.d/base] has failures: true
warning: /Stage[main]/Resolvconf/Service[dnsmasq]: Skipping because of failed dependencies

или, по крайней мере, пока я не ударил CTRL-C.

Что мне нужно изменить в модуле или манифесте, чтобы сценарий работал правильно с первого раза?

Добавьте строку, чтобы запросить пакет в вашем файловом ресурсе, например:

file { '/etc/resolvconf/resolv.conf.d/base':
    ensure  => file,
    owner   => root,
    group   => root,
    content => '...
    require => Package['resolvconf'],
}

Использование require, по сути, принудительного марионетки для первой установки пакета.

Это, конечно, предполагает, что установка пакета resolvconf создает необходимые каталоги, что, как я считаю, действительно происходит.