目标

试验环境有两台主机(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. }

puppet practice的更多相关文章

  1. 关于Puppet不得不说的故事

    Puppet对于做DevOps的同学来说,是个熟悉的名字,但仍有许多人并不了解它.那么我先来简单介绍一下:Puppet是由Puppetlabs公司开发的系统管理框架和工具集,被用于IT服务的自动化管理 ...

  2. Pramp mock interview (4th practice): Matrix Spiral Print

    March 16, 2016 Problem statement:Given a 2D array (matrix) named M, print all items of M in a spiral ...

  3. Atitit 数据存储视图的最佳实际best practice attilax总结

    Atitit 数据存储视图的最佳实际best practice attilax总结 1.1. 视图优点:可读性的提升1 1.2. 结论  本着可读性优先于性能的原则,面向人类编程优先于面向机器编程,应 ...

  4. Puppet自动化部署-安装及配置(3)

    本文介绍Puppet Master及Agent相关的安装及配置. 一. 官网下载Puppet安装YUM源 [root@puppet-master ~]# rpm -ivh https://yum.pu ...

  5. Puppet自动化运维-资源介绍篇(4)

    1.什么是资源? 资源是Puppet最基础的元素,每个资源的定义都具有标题,类型,以及一系列的属性. 资源定义有如下的特性:   (1) Puppet使用title在编译时区分每个资源,使用命名变量在 ...

  6. Puppet自动化部署-前期环境准备(2)

    在安装Puppet环境之前需要配置好机器的基本配置,如规范网络地址IP.hostname,certname认证名称,ntp时间同步等配置完毕,完善的搭建自动化环境. 1.环境介绍 此处实现部署的环境是 ...

  7. Puppet自动化运维-C/S架构概念(1)

    1.Puppet工作模式 (1)采用C/S架构(即是server<=>client) (2)Master 会对自己形成自签名CA中心,对Agent端进行证书颁发,验证通过才允许Agent( ...

  8. Puppet简易入门

    一.查看官方提供的下载源 https://docs.puppet.com/guides/puppetlabs_package_repositories.html 二. 选择对应系统的下载源 因为本机是 ...

  9. The Practice of .NET Cross-Platforms

    0x01 Preface This post is mainly to share the technologies on my practice about the .NET Cross-Platf ...

随机推荐

  1. 【OpenGL】使用FreeType库加载字体并在GL中绘制文字

    FreeType用起来比较麻烦,这里写了一份简单的示例代码,仅供参考. 实现了FT库生成字符位图,并上传到GL纹理. 实现了字符位图缓存功能,多个字符图像保存在同一个纹理中. 实现了简单的字体管理框架 ...

  2. unity3D 涂涂乐使用shader实现上色效果

    unity3D 涂涂乐使用shader实现上色效果 之前我博文里面发过一个简单的通过截图方式来实现的模型上色方法,但是那个方法不合适商用,因为你需要对的很准确才可以把贴图完美截取下来,只要你手抖了一下 ...

  3. CVE-2017-16995 Ubuntu16.04本地提权漏洞复现

    0x01 前言 该漏洞由Google project zero发现.据悉,该漏洞存在于带有 eBPF bpf(2)系统(CONFIG_BPF_SYSCALL)编译支持的Linux内核中,是一个内存任意 ...

  4. Kerberos的黄金票据详解

    0x01黄金票据的原理和条件 黄金票据是伪造票据授予票据(TGT),也被称为认证票据.如下图所示,与域控制器没有AS-REQ或AS-REP(步骤1和2)通信.由于黄金票据是伪造的TGT,它作为TGS- ...

  5. Codeforces 585E. Present for Vitalik the Philatelist(容斥)

    好题!学习了好多 写法①: 先求出gcd不为1的集合的数量,显然我们可以从大到小枚举计算每种gcd的方案(其实也是容斥),或者可以直接枚举gcd然后容斥(比如最大值是6就用2^cnt[2]-1+3^c ...

  6. Spring MVC @CookieValue注解

    @CookieValue的作用 用来获取Cookie中的值 @CookieValue参数 1.value:参数名称 2.required:是否必须 3.defaultValue:默认值 @Cookie ...

  7. openssl生成https证书、转换证书格式的各种相关操作

    第一步:生成 private key.csr等文件 我们可能需要输入以下信息(交互式): --- Country Name (2 letter code) [AU]:US State or Provi ...

  8. C#微信开发系列笔记(1)入门指引

    (1)基本配置 这节具体的详情请看官方文档,我只提示一点,非常重要,非常容易忽视的,我是吃了苦头的... 在“修改配置”这个地方,如下图: 在URL处,一定要填写http://www.xxx.com/ ...

  9. [吴恩达机器学习笔记]13聚类K-means

    13.聚类 觉得有用的话,欢迎一起讨论相互学习~Follow Me 13.1无监督学习简介 从监督学习到无监督学习 在一个典型的监督学习中,我们有一个有标签的训练集,我们的目标是找到能够区分正样本和负 ...

  10. Asp.Net Core 依赖注入默认DI,Autofac注入

    使用默认DI 修改Startup类方法ConfigureServices如下: public void ConfigureServices(IServiceCollection services) { ...