zoukankan      html  css  js  c++  java
  • puppet

    puppet
    (chef cfengine SaltStack Ansible)
    假设管理100台服务器,现在我要去这100台上都执行一个事情,怎么做?
    1,一个个的ssh连上去,手动操作
    2,shell脚本做
    但有两个主要的问题:
    a,)密码的问题
    解决方法: ssh-keygen 空密钥
    expect 自动应答密码
    b,)循环的效率问题:
    100台服务器,假设每台服务器要做的事情需要10秒,则一共就得要1000秒了
    解决方法: shell并发执行
    #!/bin/bash
    for i in `seq 10`
    do
    echo $i
    let i++
    sleep 1
    done & --这里不加后台符号和加后台符号效果不一样,测试一下就知道了
    for j in `seq 11 20`
    do
    echo $j
    let j++
    sleep 1
    done
    ---------------------------------------------------------------
    3,自动化(集中化)配置管理工具
    puppet
    如果你管理的多台机器(可能操作系统不一样,或者版本不一样),puppet会有一个叫facter的包可以帮助判断管理机器的系统和版本。然后管理员在管理端写上类似下面的语法就可以实现差异化管理了
    if centos;then
    xxxx
    elif rhel;then
    xxxx
    elif suse;then
    xxxx
    fi
    puppet
    master touch /tmp/123
    rpm -ivh xxxx
    yum install xxxx
    server1 server2 server3 server4 ........
    --------------------------------------------------------------------------------------------------------
    安装前准备:一个server,两个client(centos7.3平台)
    1,主机名配置和主机名互相绑定
    # hostnamectl set-hostname --static vm1.cluster.com
    # vim /etc/hosts
    172.16.2.10 vm1.cluster.com
    172.16.2.11 vm2.cluster.com
    172.16.2.12 vm3.cluster.com
    2,时间同步
    3,静态IP
    4,关闭firwalld,selinux
    5,配置yum源 (本地iso源和163源,还要加上下面的官方源)
    # vim /etc/yum.repos.d/puppet.repo
    [puppet]
    name=puppet
    enabled=1
    gpgcheck=0
    [puppet-dependencies]
    name=puppet-dependencies
    enabled=1
    gpgcheck=0
    第一步:安装puppet
    在vm1上
    # yum install puppet-server
    # systemctl start vm1
    # systemctl status vm1
    # systemctl enable vm1
    # lsof -i:8140
    在所有的agent上
    # yum install puppet
    # systemctl start puppet
    # systemctl status puppet
    # systemctl enable puppet
    # systemctl start puppetagent
    # systemctl status puppetagent
    # systemctl enable puppetagent
    第二步:
    master与所有agent建立连接
    1,在所有的agent客户端配置
    # vim /etc/puppet/puppet.conf --在[main]配置段加上下面一句
    server = vm1.cluster.com --这是puppet服务器的主机名(别名会有问题,最好不用别名;必须绑定才能解析)
    发送验证请求给服务端
    # puppet agent --server=vm1.cluster.com --test --会产生创建ssl证书的信息
    # ls /var/lib/puppet/ssl/certs/ --此目录会产生ca.pem文件
    ca.pem
    2,在服务端(vm1)上操作
    列出验证请求
    # puppet cert list
    "vm2.cluster.com" (SHA256) 0D:FE:23:A0:BA:DC:59:74:95:A3:DD:0D:15:C3:68:1D:EC:9C:94:C5:49:9F:65:65:9A:1A:DB:EB:B4:C3:05:DD
    "vm3.cluster.com" (SHA256) 36:A4:39:46:9D:09:BF:E7:96:D4:AE:A3:51:3B:C0:07:1A:E9:A1:A1:58:FB:DE:2F:28:09:1A:CD:9E:96:3B:1C
    进行证书签名
    # puppet cert --sign --all --对所有请求进行签名
    3,再回到agent客户端操作(所有agent客户端都需要操作)
    # puppet agent --server=vm1.cluster.com --test --再次验证请求
    # ls /var/lib/puppet/ssl/certs/目录,又多了名为"主机名.pem"文件(如vm2.cluster.com上看到的是叫vm2.cluster.com.pem)
    第三步:
    测试
    1.服务端配置:
    # vim /etc/puppet/manifests/site.pp --此文件修改之后立即生效,无需重启vm1服务
    node default { --default节点,代表默认所有节点
    file { "/tmp/test.txt": --资源title,如果没有使用path参数,就默认使用这个为文件路径
    content=> "hello,world ", --指定文件内容,所以此文件不存在的话,也会帮你创建
    }
    }
    2.客户端查看是否成功创建文件
    由于puppet Agent端默认30分钟跟Master端进行同步配置文件,所以此处进行手动重启,查看是否成功
    如果需要修改同步时间,在客户端的/etc/puppet/puppet.conf 的[agent]下加入runinterval = 3 ,表示3秒后同步
    然后在agent上测试文件是否成功创建
    # cat /tmp/test.txt
    hello, world
    如果同步推送有问题,在agent端使用下面的命令手动同步一下,会有相关的报错
    # puppet agent --test --server vm1.cluster.com --daemon
    # puppet agent --test --server vm1.cluster.com --no-daemonize --verbose
    其它配置实例(参考语法文档路径为:http://docs.puppetlabs.com/references/latest/type.html)
    例1,为不同节点创建不同内容的不同文件
    node 'vm2.cluster.com' { --只针对vm2.cluster.com节点,需要单引号引起来
    file { "/tmp/test.txt":
    content=> "hahahaha ",
    }
    }
    node 'vm3.cluster.com' { --只针对vm3.cluster.com节点,需要单引号引起来
    file { "/tmp/test1.txt":
    content=> "hehehehe ",
    }
    }
    例2,为不同节点删除无用的文件
    node 'vm2.cluster.com' {
    file { "/tmp/test.txt":
    ensure=> absent, --表示保证此文件不存在,如果存在,则删除(如果是删除一个目录,还要加一个force=> yes,才可以成功)
    }
    }
    node 'vm3.cluster.com' {
    file { "/tmp/test1.txt":
    ensure=> absent,
    }
    }
    例3,使用正则表达式为有相似名字的主机统一做一个软链接(目前版本不支持通配符,只支持正则表达式)
    node /^vmd+.cluster.com/ { --代表vmX.cluster.com的所有节点(X代表任意数字);你也可以把前面的正则换成简单点如 /^vm/或/cluster.com$/
    file { "/tmp/fstab":
    ensure => link, --做软链接
    target => "/etc/fstab", --软链接的源文件为/etc/fstab
    }
    }
    例4,创建目录,并在目录内创建文件,并指定权限,owner,group等属性
    node /.cluster.com$/ {
    file { "/test/":
    ensure => directory,
    }
    file { "/test/abc":
    content => "haha ",
    mode => 4755,
    owner => bin,
    group => daemon,
    }
    }
    例5,在例4的基础上,把/test/abc的文件内容改成客户端的/etc/fstab的文件内容
    node /^vmd+.cluster.com/ {
    file { "/test/":
    ensure => directory,
    }
    file { "/test/abc":
    source => "/etc/fstab", --这里content改成了source
    mode => 4755,
    owner => bin,
    group => daemon,
    }
    }
    例6,创建user1用户(属性默认,就相当于在直接在agent客户机上useradd user1)
    node /^vmd+.cluster.com/ {
    user { "user1":
    ensure => present,
    managehome => true, --表示会创建家目录
    }
    }
    例7,删除user1用户,增加user2用户,增加group1组
    node /^vmd+.cluster.com/ {
    user { "user1":
    ensure => absent,
    managehome => true, --表示删除用户时会删除家目录
    }
    user { "user2":
    ensure => present,
    uid => 505, ----指定uid=505,这里不要写gid=505,因为如果不存在505这个组,就会出问题
    shell => "/sbin/nologin", ----指定shell 类型
    home => "/user/user2" -----指定家目录
    }
    group { "group1":
    ensure => present,
    gid => 520,
    }
    }
    例8,为客户端做crontab定时任务(客户端使用对应的用户crontab -l去验证)
    node /^vmd+.cluster.com/ {
    cron { "cron1": --一个注释的名称
    command => "/sbin/init 0", --时间任务要做的命令
    user => "root", --什么用户身份
    minute => "01",
    hour => "21", --这是表示21点01分,其它的不写都会默认以*代替
    }
    }
    例9:对客户端服务状态进行控制
    node /^vmd+.cluster.com/ {
    service { sshd:
    ensure => "stopped", --确认sshd服务要为关闭状态,启动了会帮你关闭
    enable => false, --相当于做成systemctl disable sshd
    }
    service { httpd:
    enable => true, --相当于做成systemctl enable httpd
    }
    }
    例10:创建一个简单的脚本,并使用exec资源来执行它
    node /^vmd+.cluster.com/ {
    file { "/shell/":
    ensure => directory,
    }
    file { "/shell/1.sh":
    content => "mkdir -p /test touch /test/{1..100} ",
    mode => 755,
    owner => root,
    group => root,
    }
    exec { "exec-shell":
    cwd => "/shell", --指定在哪个目录执行这个脚本
    command => "sh 1.sh", --因为上一条指定了在/shell目录,所以这里用相对路径
    user => "root", --执行这个脚本的身份
    path => "/bin:/sbin:/usr/local/bin:/usr/local/sbin:/usr/sbin:/usr/bin", --执行这个脚本时的命令(如sh)的路径
    }
    }
    例11:简单的推送yum配置文件,然后安装vsftpd软件包
    node /^vmd+.cluster.com/ {
    file { "/etc/yum.repos.d/rhel-source.repo":
    content => "[server] name=server baseurl=file:///yum enabled=1 gpgcheck=0 ",
    mode => 644,
    owner => root,
    group => root,
    }
    package { 'install vsftpd':
    provider => yum,
    name => vsftpd,
    ensure => installed,
    }
    }
    例12:指定一个块设备挂载到一个目录
    node default{
    mount { "/mnt": --title,没有name参数则就代表挂载点
    ensure=> mounted, --mounted表示此挂载不仅加到/etc/fstab,还会帮你挂载上去(还有present,unmounted,absent相关参数,自行参考文档)
    device=> "UUID=3f1de712-7864-47ea-b0b4-9fa5781b2e88", --挂载设备的UUID,也可以直接写/dev/sdax
    fstype=> ----挂载的文件类型
    }
    }
    例13:修改/etc/hosts里其中一条记录(主机名不变,修改绑定的IP或别名)
    node default{
    host { "vm2.cluster.com": --针对所有agent里的/etc/hosts文件里绑定的vm2.cluster.com来进行修改
    ip=> "20.1.1.4", --将其IP改为20.1.1.4(原来是20.1.1.4则保持不变)
    host_aliases=> "vm2haha", --将其别名改为vm2haha(原来是vm2haha则保持不变)
    }
    }
    例14:从配置yum,安装包,修改配置文件(要求拒绝匿名用户登录,所有普通用户支持chroot),启动服务并chkconfig on来实现vsftpd服务
    node /^vmd+.cluster.com/ {
    file { "/etc/yum.repos.d/abc.repo":
    content => "[server] name=server baseurl=file:///yum enabled=1 gpgcheck=0 ",
    mode => 644,
    owner => root,
    group => root,
    }
    package { 'install vsftpd':
    provider => yum,
    name => vsftpd,
    ensure => installed,
    }
    file { "/tmp/1.sh":
    content => "sed -i '/^anonymous_enable/s/YES/NO/' /etc/vsftpd/vsftpd.conf sed -i '/chroot_local_user=YES/s/#//' /etc/vsftpd/vsftpd.conf ",
    }
    exec { "exec-shell":
    cwd => "/tmp",
    command => "sh 1.sh; rm -rf 1.sh",
    user => "root",
    path => "/bin:/sbin:/usr/local/bin:/usr/local/sbin:/usr/sbin:/usr/bin",
    }
    service { vsftpd:
    ensure => true,
    enable => true,
    }
    }
    例15:用模块来实现/etc/sudoers文件的推送
    第一步:
    在vm1建立模块相应的结构目录
    # mkdir -p /etc/puppet/modules/sudo/{files,templates,manifests}
    第二步:
    在vm1上指定存放模块的路径
    # vim /etc/puppet/puppet.conf --在[main]配置段下增加下面一句,指定模块的目录路径
    modulepath = /etc/puppet/modules
    第三步:
    在vm1上指定相关的目录能被客户端访问的权限
    # vim /etc/puppet/fileserver.conf
    [sudo]
    path /etc/puppet/modules/sudo
    allow *
    第四步:
    在vm1上配置site.pp文件(指定要找的客户端资源)
    # vim /etc/puppet/manifests/site.pp --指定导入nodes.pp文件,并指定$puppetserver变量的值为服务端的域名
    import 'nodes.pp'
    $puppetserver="vm1.cluster.com"
    第五步:
    在vm1上配置与site.pp同目录下的nodes.pp文件(大量节点时,可以按正则表达式配置所有的节点在这里,然后可以被site.pp调用)
    # vim /etc/puppet/manifests/nodes.pp
    node /.cluster.com$/ {
    include sudo --这里表示.cluster.com$的所有节点要做的事情为sudo,它会调用下面配置的叫sudo的类
    }
    第六步:
    在vm1上配置sudo模块的核心文件init.pp,指定要做的事情
    --下面配置里的$operatingsystem变量的值会由facter返回
    # vim /etc/puppet/modules/sudo/manifests/init.pp
    class sudo{
    package{ sudo:
    provider => yum,
    name => sudo,
    ensure=> present,
    }
    if $operatingsystem in [ "RedHat","CentOS","Fedora" ] {
    file { "/etc/sudoers":
    owner => "root",
    group => "root",
    mode => 0440,
    source => "puppet://$puppetserver/sudo/files/etc/sudoers",
    require => package["sudo"],
    }
    } else {
    fail("Doesn't support this OS: $operatingsystem")
    }
    }
    第七步:
    在vm1上准备好将要发送到所有agent客户端上的真实资源,建立与上面配置对应的目录,并修改你要发送的内容和修改相应的权限
    # mkdir -p /etc/puppet/modules/sudo/files/etc
    # cp /etc/sudoers /etc/puppet/modules/sudo/files/etc/sudoers --将这个拷后的文件做一定的修改,修改的内容就是你要推送到所有agent上的内容
    # chown -R puppet /etc/puppet/modules/
    第8步:
    客户端验证
    # puppet agent --test --server vm1.cluster.com --no-daemonize --verbose
    或者直接去
    cat /etc/sudoers 查看是否有你在服务端修改的内容
    -----------------------------------------------------------------
    练习:
    按照上面的例15的方式做成一个模块,实现在所有的puppet的agent节点上实现:
    1,配置yum
    2,安装httpd*
    5,服务启动,并开机自动启动
  • 相关阅读:
    Codeforces Round #313 (Div. 2) D. Equivalent Strings 解题心得
    UVA
    2015 HUAS Summer Contest#1~A
    2015 HUAS Summer Training#2~D
    2015 HUAS Summer Training#2~C
    2015 HUAS Summer Training#2~E
    2015 HUAS Summer Training#2~A
    2015 HUAS Provincial Select Contest #1
    2015 HUAS Provincial Select Contest #1~F
    2015 HUAS Provincial Select Contest #2~A
  • 原文地址:https://www.cnblogs.com/skyzy/p/9201493.html
Copyright © 2011-2022 走看看