Puppet 4.8 分发的本地时间错误

Puppet 4.8 分发的本地时间错误

我在 Puppet 中的模块时区中遇到了一些问题。

简而言之,我正在实习,我的老板给了我一个任务:修复虚拟机的自动创建问题。

创建时使用 .yaml 文件,其中包含有关 VM 内部的详细信息(CPU、RAM、IP、备份等...),然后使用包含 VM 和 xenconf(cfg 文件)详细信息的 makefile 制作 html 页面。

当创建虚拟机时,会有一个脚本来安装一些包(其 puppet)。

现在我遇到了一些问题:

VM 没有正确的时间,它们都是 UTC,而我们希望它们与巴黎(欧洲)的当地时间一致。首先,我尝试直接分发文件,但经过一番研究后,这种方法行不通,我尝试使用链接,但链接不正确,我有一个指向 UTC 而不是欧洲/巴黎的符号链接。这是我的时区类的 init.pp 文件:

#
# config de ntpd
#
# $Id: init.pp 5149 2015-07-01 16:11:29Z k***.a**** $
#
# Configuration de la timezone

class timezone {

    # Fichier de configuration
    file { 'timezone':
        path => '/etc/timezone',
        ensure => file,
        source => 'puppet:///modules/timezone/timezone',
    }

   ## Fichier de configuration
   # file { 'localtime':
   #   path => '/etc/localtime',
   #   ensure => file,
   #   source => 'puppet:///modules/timezone/Europe/Paris',
   # }

    file { '/etc/localtime':
    require => Package["tzdata"],
    ensure => link,
    force  => yes,
    target => '/usr/share/zoneinfo/Europe/Paris',
}

    exec { 'update_date':
        command => 'dpkg-reconfigure -f noninteractive tzdata',
        path    => '/usr/local/bin/:/bin/',
        #refreshonly => true,
    }

}

我尝试了一些命令来检查我的符号链接:

ls -F  : localtime@

root@testcreationvm:/etc# file localtime 
localtime: symbolic link to /usr/share/zoneinfo/Etc/UTC

我对该模块还有一个问题,那就是如何执行上述命令(dpkg-reconfigure -f noninteractive tzdata),在创建时执行一次,之后每次修改文件或链接时执行一次。

提前谢谢 :)

PS:所有 VM 都是 Debian(从 7 到 9)。

答案1

Forge 及其贡献者(我就是其中之一)已经为社区创建模块付出了很多努力,这样像你和你的“导师”这样的人就不必再付出努力了。使用模块是使用 Puppet(或任何自动化工具)的主要优势之一。我自己很久以前就学会了利用 Forge 的强大功能,而不是编写自己的 Puppet 代码库。

Forge 模块(总体上)经过测试和验证,可以正常工作。您的代码需要花费相当长的时间才能编写完成,(我认为)测试结果不如 Forge 模块好,因此(我认为)不会像值得信赖作为 Forge 模块。这并不是说你(或其他人)编写的代码不是好代码,并且不能按预期工作,但“站在巨人的肩膀上”应该可以让你更有效地利用时间完成你应该作为一名系统工程师或开发人员,可以做的事情很多,而不是执行琐碎的配置任务。

你的经理应该珍惜你的时间,如果你想学习 Puppet,你可以随时在 GitHub 上查看一些 Forge 模块来了解它们的工作原理,或者尝试修复一些错误并向维护人员提交 Pull 请求。

本着这种精神,正确的解决方案是使用 Forge 模块,例如saz/时区

安装模块后,只需将类分配给节点并在 Hiera 中添加此配置,然后让模块处理其余工作即可。您根本不需要查看模块的代码。

例如:

---
classes:
  - timezone

timezone::timezone: 'Europe/Paris'

如果您的经理有任何疑问,请随时向他指出这个答案。

答案2

我发现了它不起作用的原因,在生产环境中,模块时区没有在 hieradata 文件夹中的 common.yaml 中正确声明。

这是我的 common.yaml 文件(部分):

base:
    - adminkey
    - apt
    - assimilate
    - cacti
    - exim4
    - facteraddon
    - fsck
    - initramfs
    - locales
    - monit
    - motd
    - nagios
    - needrestart
    - ntpd
    - puppet
    - rc
    - resolv
    - root
    - snmpd
    - sshd
    - sudo
    - timezone
    - users

dom0:
    - hostsfile
    - kernels
    - xen_tools
etc ...

这是我的班级时区:

class timezone {

    # Fichier de configuration
    file { 'timezone':
        path => '/etc/timezone',
        ensure => file,
        source => 'puppet:///modules/timezone/timezone',
    }

    file { '/etc/localtime':
        ensure => link,
        target => '/usr/share/zoneinfo/Europe/Paris',
        force  => yes,
    }
}

相关内容