《Puppet实战手册》——1.7 使用cron运行Puppet

    xiaoxiao2024-07-08  99

    本节书摘来自异步社区《Puppet实战手册》一书中的第1章,第1.7节,作者:【英】John Arundel著,更多章节内容可以访问云栖社区“异步社区”公众号查看

    1.7 使用cron运行Puppet

    通过已有的配置,已经可以做很多事情,包括在团队中管理Puppet清单,通过GitHub同步变更,使用papply脚本在机器上手动应用配置变更。

    然而,截至目前还是需要手动登录到每台机器上更新Git仓库并重新运行Puppet。如果每台机器可以自动更新并应用变更,就更方便了。这样,只需要将修改推送至仓库,所有机器就会在一定时间范围内自动完成配置的变更。

    做到这一点最简单的方法就是使用cron作业,定期从仓库更新配置文件并在有变更时运行Puppet。

    准备工作首先,需要在前面的1.4节和1.5节中设置的Git仓库以及1.6节中的papply脚本。

    然后,还需要创建一个SSH秘钥,每台机器使用它进行认证,从Git仓库拉取变更。创建SSH秘钥可参考如下步骤。

    1. 运行以下命令,创建密钥文件。

    ubuntu@cookbook:~/puppet$ ssh-keygen -f ubuntu Generating public/private rsa key pair. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in ubuntu. Your public key has been saved in ubuntu.pub. The key fingerprint is: ae:80:48:1c:14:51:d6:b1:73:4f:60:e2:cf:3d:ce:f1 ubuntu@cookbook The key's randomart image is: +--[ RSA 2048]----+ | ++o.o.o     | |   +        | |   +       | |   = +      | | o   oS=      | |    o +     | |     o E     | |          | |          | +-----------------+

    2. 打印ubuntu.pub文件的内容。

    ubuntu@cookbook:~/puppet$ cat ubuntu.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC8EsdLAZHIg1nnMzJuIQ5jEcFL1W  I5AVhml6Z3Gw4zc4xw6F1Citomc+3DexcaD+y3VrD3WEOGcXweCsxJF0EGyJoc4RbP  AJaP3D4V/+9FQVZcH90GukasvtIrfJYy2KFfRBROKtrfckMbBlWF7U2U+FwaalMOtg  LzZeECSDU4eYuheN3UVcyg9Zx87zrLYU5EK1JH2WVoZd3UmdH73/rwPJWtSEQ3xs9A  2wMr0lJsCF4CcFCVwrAIoEf5WzIoHbhWyZaVyPR4gHUHd3wNIzC0rmoRiYwE5uYvVB  ObLN10uZhn7zGPWHEc5tYU7DMbz61iTe4NLtauwJkZxmXUiPJh ubuntu@cookbook

    复制上面的内容并将其作为部署密钥添加至GitHub仓库(参考GitHub关于这部分内容的操作指南)。这样,会授权这个密钥可以从GitHub中克隆Puppet仓库。

    操作步骤具体步骤如下。

    1. 移动公钥文件到puppet模块。

    ubuntu@cookbook:~/puppet$ mv ubuntu.pub  modules/puppet/files/ubuntu.pub

    2. 不要将私钥放进Puppet仓库(需要通过其他通道来分发私钥到那些需要检出仓库的机器中)。

    3. 参照下面的内容,创建modules/puppet/files/pull-updates.sh文件。

    #!/bin/sh cd /home/ubuntu/puppet git pull && /usr/local/bin/papply

    4. 参照下面的内容,修改modules/puppet/manifests/init.pp文件。

    class puppet {   file { '/usr/local/bin/papply':    source => 'puppet:///modules/puppet/papply.sh',    mode  => '0755',  }  file { '/usr/local/bin/pull-updates':    source => 'puppet:///modules/puppet/pull-updates.sh',    mode  => '0755',  }  file { '/home/ubuntu/.ssh/id_rsa':    source => 'puppet:///modules/puppet/ubuntu.priv',    owner  => 'ubuntu',    mode  => '0600',  }  cron { 'run-puppet':    ensure => present,    user   => 'ubuntu',    command => '/usr/local/bin/pull-updates',    minute => '*/10',    hour   => '*',  } }

    5. 运行Puppet。

    ubuntu@cookbook:~/puppet$ papply Notice: /Stage[main]/Puppet/Cron[run-puppet]/ensure: created Notice: /Stage[main]/Puppet/File[/usr/local/bin/pull-updates]/ensure:    defined content as'{md5}20cfc6cf2a40155d4055d475a109137d' Notice: /Stage[main]/Puppet/File[/home/ubuntu/.ssh/id_rsa]/ensure: defined content as '{md5}db19f750104d3bf4e2603136553c6f3e' Notice: Finished catalog run in 0.27 seconds

    6. 测试新的SSH密钥是否已经正确获得GitHub授权。

    ubuntu@cookbook:~/puppet$ ssh git@github.com PTY allocation request failed on channel 0 Hi bitfield/cookbook! You've successfully authenticated, but  GitHub does not provide shell access. Connection to github.com closed.

    7. 检查pull-updates脚本是否正常工作。

    ubuntu@cookbook:~/puppet$ pull-updates Already up-to-date. Notice: Finished catalog run in 0.16 seconds

    工作原理到现在为止,已经实现了从被管理的服务器上通过SSH认证访问GitHub(使用SSH代理转发),但是如果不登录到服务器并执行相关命令,服务器就不能自动拉取更新。所以,此处创建了一个新的SSH密钥对,将公钥作为部署密钥添加到GitHub,使拥有密钥文件的服务器可以访问仓库。

    将这个私钥作为ubuntu用户默认的SSH密钥。

    file { '/home/ubuntu/.ssh/id_rsa':   source => 'puppet:///modules/puppet/ubuntu.priv',   owner  => 'ubuntu',   mode  => '0600', }

    这使得用户ubuntu可以在puppet目录运行git pull命令。此外,还增加了pull-updates脚本来执行这条命令,并在有任何配置更改时运行Puppet。

    #!/bin/sh cd /home/ubuntu/puppet git pull && papply

    将这个脚本部署到所有的Puppet主机上:

    file { '/usr/local/bin/pull-updates':   source => 'puppet:///modules/puppet/pull-updates.sh',   mode  => '0755', }

    最后,创建一个定期运行pull-updates的cron作业(每10分钟一次,但是可以根据自己的需求去修改)。

    cron { 'run-puppet':   ensure  => present,   command => '/usr/local/bin/pull-updates',   minute  => '*/10',   hour   => '*', }

    更多参考恭喜,你现在拥有了一个全自动化的Puppet基础设施!只要在一台新机器上检出仓库代码并应用了配置清单,这台机器就会自动的定期拉取新的变化并应用这些变更。

    举一个例子,如果需要在所有机器上添加一个新用户,需要做的就是将用户添加到配置清单的工作副本中,提交并推送到GitHub。等待10分钟,它就会自动应用到所有Puppet机器上。

    这是非常方便的,但是,有时人们希望能够将变更立刻应用到特定的机器,而无须等待cron作业的执行。此时,可以使用Rake工作实现这个功能。在下一节中,本书将介绍如何来实现这些。

    相关资源:敏捷开发V1.0.pptx
    最新回复(0)