zoukankan      html  css  js  c++  java
  • puppet practice

    目标

    试验环境有两台主机(VM)构成,一台是master,一台是agent,完成以下工作:

    1. 新建用户newuser;
    2. 安装 ubuntu-cloud-keyring package,更改文件/etc/apt/sources.list.d/cloudarchive-kilo.list,添加新包源并更新系统;
    3. 安装 ntp package。

    根据上面的目标,可以分为三个模块- addusersysupntp。当然你也可以用一个模块实现,但是那样不利于维护,也没有很好的体现puppet之模块的概念。

    模块一 adduser

    首先在目录modules 下按照puppet的要求新建一个目录adduser,并在其下创建manifests/init.pp

    1. |-- adduser
    2. ||-- files
    3. ||-- manifests
    4. ||`-- init.pp
    5. | `-- templates

    filestemplates在这个例子中暂时没有用到。

    在写init.pp之前,需要思考,增加一个用户需要做哪些事情,这个用户属于哪个组,如果这个组在目标机器上没有怎么办(查看/etc/group)?如果这个用户已经在某些机器上存在怎么办?(查看/etc/passwd)等等。
    一般的,用户不可以重复存在,在新建用户之前,保险的做法是先删除。那么有了这些思考,那么写出的程序就有了一定的可靠性而不单单只是实现了功能。

    1. # /etc/puppet/modules/adduser/manifests/init.pp
    2. class adduser{
    3. # create new group if no
    4. group{"newgroup":
    5. ensure=>"present",
    6. allowdupe=>false,
    7. gid=>888,
    8. }
    9. user{"newuser":
    10. ensure=>"present",
    11. uid=>888,
    12. gid=>888,
    13. # need use grup_md5_crypt to create password
    14. password=>'$1$PzftN$XANlscGctdGF3VjXH3k9q0',
    15. home=>"/home/newuser",
    16. shell=>"/bin/bash",
    17. managehome=>true,
    18. }
    19. # need to create file resoure for new user
    20. file{"/home/newuser":
    21. group=>888,
    22. owner=>888,
    23. mode=>755,
    24. ensure=>directory,
    25. }
    26. }

    当然,要使puppet能够执行该新增用户的操作,还必须在nodes/client.pp文件下添加:

    1. node 'client'
    2. {
    3. include adduser
    4. }

    注意,下面的模块也要记得修改client.pp

    模块二 sysup

    同样的,在/etc/puppet/modules目录下新建目录sysup,然后新建manifests/init.pp文件。
    这个模块需要考虑的两个重要问题是

    • 如何修改目标文件,而不是覆盖原有文件?
    • 如何保证在更新包源之后才进行系统更新和升级?

    对于第一个问题,因为puppet自有的file资源不具有更新文件的功能,依据其content属性,会将目标文件原有内容覆盖。
    可以使用file_line资源,不过需要预先添加stdlib模块。
    对于第二个问题,实际上puppet已经帮我们想好了,合理使用资源共有属性(官网谓之为元属性beforerequire等可以办到。

    1. # /etc/puppet/modules/sysup/manifests/init.pp
    2. class sysup{
    3. package{"ubuntu-cloud-keyring":
    4. ensure=>installed,
    5. }
    6. file_line{"add repo":
    7. path=>"/etc/apt/sources.list.d/cloudarchive-kilo.list",
    8. line=>"deb http://ubuntu-cloud.archive.canonical.com/ubuntu/ trusty-updates/kilo main",
    9. }
    10. exec{"apt-get update && apt-get dist-upgrade":
    11. cwd=>"/root",
    12. path=>"/usr/bin",
    13. require=>File_line["add repo"],
    14. }
    15. }

    模块三 ntp

    模块三比较简单,但是安装ntp后我们需要修改配置文件/etc/ntp.conf,一般配置文件中存在大量的注释行和空行,不便于查找相应位置。
    于是写了个脚本simf.sh,主要作用是删除目标文件的注释和空行:

    1. #!/bin/bash
    2. cp $1 $1.bak
    3. cat $1.bak | grep -v '^#'| grep -v '^$'> $1

    现在需要把该脚本复制到各个client上。(这里我另写了个模块simf

    1. class sim{
    2. file {"/home/andy/simf.sh":
    3. ensure=> present,
    4. source=>"puppet:///files/simf.sh",
    5. mode=>755;}
    6. file {"/usr/sbin/simf":
    7. ensure=> link,
    8. links => follow,
    9. target =>"/home/andy/simf.sh",
    10. }
    11. }

    然后把写好的脚本放到/etc/puppet/files下。
    但是仅仅如此还不够,需要修改/etc/puppet/fileserver.conf如下:

    1. [files]
    2. path /etc/puppet/files
    3. allow *

    回归正题,模块ntp的代码如下:

    1. class ntp
    2. {
    3. package{"ntp":
    4. ensure=>installed,
    5. }
    6. file_line {"add server":
    7. path=>"/etc/ntp.conf",
    8. line=>"server 0.cn.pool.ntp.org iburst",
    9. require=>Package["ntp"],
    10. }
    11. }





  • 相关阅读:
    沙县小吃炖罐做法 114沙县小吃配料网
    党参_百度百科
    EF架构~通过EF6的DbCommand拦截器来实现数据库读写分离~续~添加事务机制
    EF架构~通过EF6的DbCommand拦截器来实现数据库读写分离
    知方可补不足~Sqlserver中的几把锁和.net中的事务级别
    面对大数据,我们应该干的事~大话开篇
    EF架构~在T4模版中自定义属性的getter和setter
    SurfaceView的一个小应用:开发示波器
    Jetty入门
    ios ARC
  • 原文地址:https://www.cnblogs.com/zeweiwu/p/4751005.html
Copyright © 2011-2022 走看看