我正在使用 Ubuntu,并使用 Puppet 管理我的主机。直到一两台机器之前,我的主机解析为 hostname.backend.example.com。最后两台机器解析为 hostname.staging.internal。我对这些名字是如何得出的感到有些困惑。
# /etc/resolv.conf
nameserver 173.203.4.8
nameserver 173.203.4.9
domain backend.example.com
Run Code Online (Sandbox Code Playgroud)
和
# /etc/hosts
10.182.230.38 web01.staging.internal web01
127.0.0.1 localhost localhost.localdomain
Run Code Online (Sandbox Code Playgroud)
/bin/hostname 回复如下:
# hostname -a
web01
# hostname -A
108-166-97-91.static.cloud-ips.com web01.staging.internal
# hostname -I
108.166.97.91 10.182.230.38
Run Code Online (Sandbox Code Playgroud)
存在将 108.166.97.91 映射到 web01.backend.example.com 的 DNS 记录。主机名为何、在何处以及如何获取 web01.staging.internal 而不是公共 DNS 记录?
我有以下定义:
class nginx::install{
...
}
class nginx::service{
...
}
class nginx::config{
...
}
class nginx{
include nginx::install, nginx::service, nginx::config
}
class jenkins::nginx{
include nginx
file{'/etc/nginx/sites-enabled/jenkins':
source => ...,
require => Class['nginx'],
}
}
Run Code Online (Sandbox Code Playgroud)
但是当我运行这个时,Puppet 告诉我我有一个循环:
err: Could not apply complete catalog: Found 1 dependency cycle:
(Class[Jenkins::Nginx] => File[/etc/nginx/sites-available/jenkins] => Class[Jenkins::Nginx])
Try the '--graph' option and opening the resulting '.dot' file in OmniGraffle or GraphViz
Run Code Online (Sandbox Code Playgroud)
jenkins::nginx 中对 nginx 的普通引用引用了自身。我如何告诉 Puppet 我依赖于顶级 nginx 类?
我试图将我的依赖项更改为Class['::nginx']
(就像我在 Ruby 中一样),现在 Puppet 告诉我它找不到依赖项。
我希望以下内容能够真正启动我的服务:
service{'legacy':
ensure => running,
start => "cd /vagrant/nginx-reverse-proxy/legacy && /usr/bin/bundle exec ruby app.rb -o 127.0.0.1 -e production -p ${port}",
provider => 'systemd',
}
Run Code Online (Sandbox Code Playgroud)
我知道并理解 start 命令不正确,但我不知道如何启动实际的 Ruby Sinatra 应用程序。我实际上希望这样的事情起作用:
service{'legacy':
ensure => running,
command => "cd /vagrant/nginx-reverse-proxy/legacy && /usr/bin/bundle exec ruby app.rb -o 127.0.0.1 -e production -p ${port}",
provider => 'systemd',
}
Run Code Online (Sandbox Code Playgroud)
有点像cron。我习惯了daemontools,systemd的模型完全不同。我必须自己创建单元文件吗?并链接单元文件?
我找到了如何使用 puppet 启用 systemd 实例化服务?它启动某种 USB 设备。我还发现了似乎管理 systemd 本身的camptocamp/puppet-systemd。Puppet 关于systemd 服务提供商的文档在细节上相当稀少。
如何使用 Puppet 创建一个 systemd 服务?
我使用 Puppet 挂载 Cloudfuse 以访问 Rackspace 的 Cloudfiles,但在新主机上,挂载运行过快,即使我需要整个类。在Pro Puppet 中,James 建议像这样拆分类定义:
class cloudfuse{
include cloudfuse::install, cloudfuse::service, cloudfuse::config
}
class cloudfuse::install{
# download and install
}
class cloudfuse::config{
file{'/root/.cloudfuse':
notify => Class['cloudfuse::service'],
}
}
class cloudfuse::service{
service{'cloudfuse':
ensure => running,
}
}
Run Code Online (Sandbox Code Playgroud)
这工作得很好。当我准备好挂载时,我需要顶级的父类,如下所示:
exec{'mount /data/cloudfiles':
command => "/usr/local/bin/cloudfuse /data/cloudfiles",
require => [
File['/data/cloudfiles'],
Class['cloudfuse'],
]
}
Run Code Online (Sandbox Code Playgroud)
问题是:
cloudfuse::install
而不是父母吗?我知道 requirecloudfuse::install
会解决我的问题,但是如果我有一个非常简单的类,也许我不会像这样分成三个,那么我必须猜测/查看清单才能知道如何声明依赖项。
鉴于这些文件:
# find /etc/puppetlabs/code -type f | grep -v modules | xargs head -n 100
==> /etc/puppetlabs/code/environments/production/hieradata/common.yaml <==
pgwatch:
password: "mypass1"
puppetdb:
password: "mypass2"
==> /etc/puppetlabs/code/environments/production/manifests/site.pp <==
node "todd.ca.seevibes.com" {
class { 'postgresql::globals':
encoding => 'UTF-8',
locale => 'en_US.UTF-8',
manage_package_repo => true,
version => '9.1',
} -> class{'postgresql::server':
} -> postgresql::server::db{'puppetdb':
user => 'puppetdb',
password => postgresql_password('puppetdb', hiera('puppetdb::password')),
} -> postgresql::server::db{'pgwatch':
user => 'pgwatch',
password => postgresql_password('pgwatch', hiera('pgwatch::password')),
}
postgresql::server::pg_hba_rule{'allow pgwatch from anywhere':
address => '0.0.0.0/32',
auth_method => 'md5',
database …
Run Code Online (Sandbox Code Playgroud)