puppet practice
目标
试验环境有两台主机(VM)构成,一台是master,一台是agent,完成以下工作:
- 新建用户newuser;
- 安装 ubuntu-cloud-keyring package,更改文件/etc/apt/sources.list.d/cloudarchive-kilo.list,添加新包源并更新系统;
- 安装 ntp package。
根据上面的目标,可以分为三个模块- adduser
,sysup
,ntp
。当然你也可以用一个模块实现,但是那样不利于维护,也没有很好的体现puppet之模块的概念。
模块一 adduser
首先在目录modules
下按照puppet的要求新建一个目录adduser
,并在其下创建manifests/init.pp
。
|-- adduser
||-- files
||-- manifests
||`-- init.pp
| `-- templates
files
和templates
在这个例子中暂时没有用到。
在写init.pp
之前,需要思考,增加一个用户需要做哪些事情,这个用户属于哪个组,如果这个组在目标机器上没有怎么办(查看/etc/group
)?如果这个用户已经在某些机器上存在怎么办?(查看/etc/passwd
)等等。
一般的,用户不可以重复存在,在新建用户之前,保险的做法是先删除。那么有了这些思考,那么写出的程序就有了一定的可靠性而不单单只是实现了功能。
# /etc/puppet/modules/adduser/manifests/init.pp
class adduser{
# create new group if no
group{"newgroup":
ensure=>"present",
allowdupe=>false,
gid=>888,
}
user{"newuser":
ensure=>"present",
uid=>888,
gid=>888,
# need use grup_md5_crypt to create password
password=>'$1$PzftN$XANlscGctdGF3VjXH3k9q0',
home=>"/home/newuser",
shell=>"/bin/bash",
managehome=>true,
}
# need to create file resoure for new user
file{"/home/newuser":
group=>888,
owner=>888,
mode=>755,
ensure=>directory,
}
}
当然,要使puppet能够执行该新增用户的操作,还必须在nodes/client.pp
文件下添加:
node 'client'
{
include adduser
}
注意,下面的模块也要记得修改
client.pp
。
模块二 sysup
同样的,在/etc/puppet/modules
目录下新建目录sysup
,然后新建manifests/init.pp
文件。
这个模块需要考虑的两个重要问题是
- 如何修改目标文件,而不是覆盖原有文件?
- 如何保证在更新包源之后才进行系统更新和升级?
对于第一个问题,因为puppet
自有的file
资源不具有更新文件的功能,依据其content
属性,会将目标文件原有内容覆盖。
可以使用file_line
资源,不过需要预先添加stdlib
模块。
对于第二个问题,实际上puppet
已经帮我们想好了,合理使用资源共有属性(官网谓之为元属性)before
,require
等可以办到。
# /etc/puppet/modules/sysup/manifests/init.pp
class sysup{
package{"ubuntu-cloud-keyring":
ensure=>installed,
}
file_line{"add repo":
path=>"/etc/apt/sources.list.d/cloudarchive-kilo.list",
line=>"deb http://ubuntu-cloud.archive.canonical.com/ubuntu/ trusty-updates/kilo main",
}
exec{"apt-get update && apt-get dist-upgrade":
cwd=>"/root",
path=>"/usr/bin",
require=>File_line["add repo"],
}
}
模块三 ntp
模块三比较简单,但是安装ntp后我们需要修改配置文件/etc/ntp.conf
,一般配置文件中存在大量的注释行和空行,不便于查找相应位置。
于是写了个脚本simf.sh
,主要作用是删除目标文件的注释和空行:
#!/bin/bash
cp $1 $1.bak
cat $1.bak | grep -v '^#'| grep -v '^$'> $1
现在需要把该脚本复制到各个client上。(这里我另写了个模块simf
)
class sim{
file {"/home/andy/simf.sh":
ensure=> present,
source=>"puppet:///files/simf.sh",
mode=>755;}
file {"/usr/sbin/simf":
ensure=> link,
links => follow,
target =>"/home/andy/simf.sh",
}
}
然后把写好的脚本放到/etc/puppet/files
下。
但是仅仅如此还不够,需要修改/etc/puppet/fileserver.conf
如下:
[files]
path /etc/puppet/files
allow *
回归正题,模块ntp的代码如下:
class ntp
{
package{"ntp":
ensure=>installed,
}
file_line {"add server":
path=>"/etc/ntp.conf",
line=>"server 0.cn.pool.ntp.org iburst",
require=>Package["ntp"],
}
}
puppet practice的更多相关文章
- 关于Puppet不得不说的故事
Puppet对于做DevOps的同学来说,是个熟悉的名字,但仍有许多人并不了解它.那么我先来简单介绍一下:Puppet是由Puppetlabs公司开发的系统管理框架和工具集,被用于IT服务的自动化管理 ...
- 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 ...
- Atitit 数据存储视图的最佳实际best practice attilax总结
Atitit 数据存储视图的最佳实际best practice attilax总结 1.1. 视图优点:可读性的提升1 1.2. 结论 本着可读性优先于性能的原则,面向人类编程优先于面向机器编程,应 ...
- Puppet自动化部署-安装及配置(3)
本文介绍Puppet Master及Agent相关的安装及配置. 一. 官网下载Puppet安装YUM源 [root@puppet-master ~]# rpm -ivh https://yum.pu ...
- Puppet自动化运维-资源介绍篇(4)
1.什么是资源? 资源是Puppet最基础的元素,每个资源的定义都具有标题,类型,以及一系列的属性. 资源定义有如下的特性: (1) Puppet使用title在编译时区分每个资源,使用命名变量在 ...
- Puppet自动化部署-前期环境准备(2)
在安装Puppet环境之前需要配置好机器的基本配置,如规范网络地址IP.hostname,certname认证名称,ntp时间同步等配置完毕,完善的搭建自动化环境. 1.环境介绍 此处实现部署的环境是 ...
- Puppet自动化运维-C/S架构概念(1)
1.Puppet工作模式 (1)采用C/S架构(即是server<=>client) (2)Master 会对自己形成自签名CA中心,对Agent端进行证书颁发,验证通过才允许Agent( ...
- Puppet简易入门
一.查看官方提供的下载源 https://docs.puppet.com/guides/puppetlabs_package_repositories.html 二. 选择对应系统的下载源 因为本机是 ...
- The Practice of .NET Cross-Platforms
0x01 Preface This post is mainly to share the technologies on my practice about the .NET Cross-Platf ...
随机推荐
- var和let使用上的对比
var和let比较 1. let没有预解析,不存在变量提升.在代码块中,只要let定义变量,在之前使用,都是报错.先定义完再使用. let a = 12; function fn(){ alert(a ...
- 51nod 1089最长回文子串V2 (manacher)
经典题 manacher是一种很神奇的算法, 算是动态规划的一种,不过利用的信息非常有效 #include <iostream> #include <cstdio> #incl ...
- JS中数组和字符串具有的方法,以及substring,substr和slice的用法与区别
String 对象属性 属性 描述 constructor 对创建该对象的函数的引用 length 字符串的长度 prototype 允许您向对象添加属性和方法 String 对象方法 方法 描述 ...
- 分治FFT
目录 分治FFT 目的 算法 代码 分治FFT 目的 解决这样一类式子: \[f[n] = \sum_{i = 0}^{n - 1}f[i]g[n - i]\] 算法 看上去跟普通卷积式子挺像的,但是 ...
- [JLOI2012]时间流逝 树上高斯消元 概率期望
题面 题意:(感觉题面写的题意是错的?)有\(n\)种能量不同的圈,设当前拥有的圈的集合为\(S\),则: 1,每天有\(p\)概率失去一个能量最小的圈.特别的,如果\(S = \varnothing ...
- 【BZOJ4709】柠檬(动态规划,单调栈)
[BZOJ4709]柠檬(动态规划,单调栈) 题面 BZOJ 题解 从左取和从右取没有区别,本质上就是要分段. 设\(f[i]\)表示前\(i\)个位置的最大值. 那么相当于我们枚举一个前面的位置\( ...
- 洛谷 P1233 木棍加工 解题报告
P1233 木棍加工 题目描述 一堆木头棍子共有n根,每根棍子的长度和宽度都是已知的.棍子可以被一台机器一个接一个地加工.机器处理一根棍子之前需要准备时间.准备时间是这样定义的: 第一根棍子的准备时间 ...
- 函数式编程(1)-高阶变成(1)-map/reduce
map/reduce Python内建了map()和reduce()函数. 如果你读过Google的那篇大名鼎鼎的论文“MapReduce: Simplified Data Processing on ...
- bzoj2314: 士兵的放置(树形DP)
0表示被父亲控制,1表示被儿子控制,2表示被自己控制.f表示最少士兵数,g表示方案数. 转移贼难写,写了好久之后写不下去了,看了一眼题解,学习了...原来还可以这么搞 比如求f[i][1]的时候,要在 ...
- bzoj2621: [Usaco2012 Mar]Cows in a Skyscraper(状压DP)
第一眼是3^n*n的做法...然而并不可行T T 后来发现对于奶牛的一个状态i,最优情况下剩下那个可以装奶牛的电梯剩下的可用重量是一定的,于是我们设f[i]表示奶牛状态为i的最小电梯数,g[i]为奶牛 ...