Puppet核心资源类型浅析

痞子三分冷 提交于 2020-01-20 12:36:30

作者:刁冰雪
时间:2018-02-02


一、核心类型——PACKAGE

典型案例说明

1、使用latest将软件持续安装为最新版

使用yum源安装软件时,package类型提供了两种软件安装的方式,present和latest。使用present参数实现软件安装时,仅确保该软件存在即可,不关注版本,只有该软件不存在时才会进行安装。而使用latest参数实现软件安装时,当软件源中的安装包有版本更新时,latest则会自动将软件升级为最新的版本。对于工具类软件,建议使用latest保持最新版本;对于运行环境,如python、java则建议使用present避免自动升级可能发生的兼容性问题。

配置说明

class smallflow::test {
    package {
            ["tree"]:
            ensure  => "latest",
    }
}

在这里插入图片描述

2、使用provider属性通过rpm安装软件时,该软件包必须处于本地目录

source中的路径需为本机地址,因此若本地路径不存在该安装软件包时,需要通过file方法将安装包传递到agent本机。此处不可通过source指定master端的路径实现远程安装。

配置说明

class smallflow::test {
    file {"/tmp/tree-1.5.3-3.el6.x86_64.rpm":
            owner  => "root",
            group  => "root",
            mode   => "0644",
            source   => "puppet:///modules/smallflow/tree-1.5.3-3.el6.x86_64.rpm",
    }
    package {"tree":
            ensure   => "present",
            provider => "rpm",
            source   => "/tmp/tree-1.5.3-3.el6.x86_64.rpm",
    }
}

二、核心类型——FILE

典型案例说明

1、使用file类型传输文件时,file可以自己对文件是否存在做出判断,当agent端路径下存在相同文件时,file将不再执行文件传输的操作。

配置说明

class smallflow::tomcat {
    file {"/tmp/testfile.txt":
        ensure  =>  "present",
        owner   =>  "root",
        group   =>  "root",
        mode    =>  "0644",
        source  =>  "puppet:///modules/smallflow/testfile.txt",
    }
}

客户端agent2测试
在这里插入图片描述

2、当file属性ensure的参数为directory时创建文件夹,与recurse属性为remote一同使用时可递归创建文件夹及其中文件;当ensure参数为link时,可以为target中的目标文件建立软链接,而不必通过exec来执行ln -s命令实现文件链接

通过file类型中ensure属性选择directory可以直接在指定目录下创建文件夹,若该文件夹已经存在则不会再次执行文件夹创建的操作。

配置说明

   class smallflow::tomcat {
               file {"/export/servers":
               ensure  =>  "directory", #创建/export/servers文件夹
               owner   =>  "admin",
               group   =>  "admin",
               mode    =>  "0755",
        }
   }

配置说明

    class resource_init::cleaner {
                file {"/export/servers/sky-cleaner":
                ensure  =>  "directory", #创建/export/servers文件夹
                recurse =>  "remote",
                owner   =>  "admin",
                group   =>  "admin",
                mode    =>  "0755",
                source  =>  "puppet:///modueles/resource_init/export/servers/sky-cleaner";
         }
    }

在这里插入图片描述
配置说明

class smallflow::link {
     file{"/mnt/lpasswd":
          owner   => "root",
          group   => "root",
          ensure  => "link", 
          target  => "/mnt/passwd",  #创建软连接
     }
  }
3、file通过使用notify来触发目标exec的执行

通过notify与refreshonly配合使用来实现触发下游操作的执行

如下示例:EXEC[checkmd5]中refreshonly值为true,因此file传输文件时可通过notify来触发EXEC[checkmd5]执行,如下图中红色框中显示。

配置说明

 class smallflow::test {
    file { "/tmp/apache-tomcat-8.0.30.tar.gz":
        ensure  => "present",
        owner   => "root",
        group   => "root",
        mode    => "755",
        source  => "puppet:///modules/smallflow/apache-tomcat-8.0.30.tar.gz",
        notify  => "Exec[tar -zxvf apache-tomcat-8.0.30.tar.gz]",   #文件传输时触发Exec[tar -zxvf apache-tomcat-8.0.30.tar.gz]的执行
    }
    exec {
        "tar -zxvf apache-tomcat-8.0.30.tar.gz":
        user     => "admin",
        cwd      => "/tmp",
        path     => "/usr/bin:/usr/sbin:/sbin:/bin",
        provider => "shell",
        timeout  => "60",    
        refreshonly => "true",   #配合file中notify同时使用,参数值为true时,notify所在的类型执行时该类型中命令方可执行
    }
 }

在这里插入图片描述

notify与refreshonly组合说明

notify refreshonly action
true true notify所在file执行成功时,refreshonly所在exec方可执行
true false 不论notify所在file是否执行,refreshonly所在exec均执行
true 不论notify所在file是否执行,refreshonly所在exec均执行
4、file属性backup与filebucket共同使用实现文件备份与恢复

要实现文件的备份,需要在file类型中使用backup类型,在site.pp中添加filebucket类型。filebucket存储文件有两种方式:远程server和本地local。我们使用的是本地存储,以免server端负载过高。通过本地filebucket恢复上一版本文件时,使用如下命令:puppet filebucket restore –bucket 本地备份路径 要恢复的文件 文件上一版本MD5值,

使用举例:puppet filebucket restore –bucket /tmp/backup /etc/hosts f9520612cf79cbb5fc7acce12e3b5ab2

配置说明

 class smallflow::test {
    file { "/tmp/apache-tomcat-8.0.30.tar.gz":
        ensure  => "present",
        owner   => "root",
        group   => "root",
        mode    => "755",
        source  => "puppet:///modules/smallflow/apache-tomcat-8.0.30.tar.gz",
        backup  => main; #设置backup,备份方式为site.pp中设置的main方式
    }
 }
#site.pp设置
 node default {
    include smallflow::test 
    filebucket {'main':
          path => false, #设置agent节点不需要保存
    #      path => "/tmp/backup",  #指定文件备份的本地路径
          server => "puppet.master.com", #设置将文件更改之前的版本保存到远程server端
    }
}

使用总结
使用file进行文件操作时,该类型本身自带判断功能,只有当所传输文件、所创建文件夹、所建立链接不存在时才会进行file中指定的操作。而通过exec实现同样功能时却需要单独使用判断语句进行上述判断。因此,file能够实现的功能,则不使用exec实现。

三、核心类型——EXEC

典型案例说明

1、exec类型中通过subscribe设置依赖来触发exec的执行,且refreshonly属性的值为true

如下示例:进行解压操作的exec使用subscribe依赖于checkmd5,且refreshonly值为true,这表明当checkmd5的exec执行成功后,才会触发解压操作的exec执行,如Subscribe触发使用结果图中黄色框中显示。

配置说明

class smallflow::test {
        file { "/tmp/apache-tomcat-8.0.30.tar.gz":
        ensure  => "present",
        owner   => "root",
        group   => "root",
        mode    => "755",
        source  => "puppet:///modules/smallflow/apache-tomcat-8.0.30.tar.gz",
    }        
    exec {
        "tar -zxvf apache-tomcat-8.0.30.tar.gz":
        user     => "admin",
        cwd      => "/tmp",
        path     => "/usr/bin:/usr/sbin:/sbin:/bin",
        provider => "shell",
        timeout  => "60",
        subscribe => "File[/tmp/apache-tomcat-8.0.30.tar.gz]",    
        refreshonly => "true",    #配合subscribe同时使用,参数值为true时,subscribe所依赖的File[/tmp/apache-tomcat-8.0.30.tar.gz]执行成功时,当前exec方可被触发执行。
    }
 }

Subscribe触发使用结果 trigger
在这里插入图片描述
subscribe与refreshonly组合说明

subscribe refreshonly action
true true subscribe所依赖类型执行成功时,当前exec方可执行
true false 不论subscribe所依赖类型是否执行,当前exec均执行
true 不论subscribe所依赖类型是否执行,当前exec均执行
2、同时使用onlyif与unless

exec中对命令做出条件限制有两种方式:onlyif与unless。onlyif表明只有当测试返回值为0时,主命令才会被执行。若onlyif中存在一组测试命令,那么每一个测试返回值均为0时,主命令被执行。而unless与onlyif恰恰相反,当测试命令返回值非0时,执行主命令。若unless中存在一组测试命令,那么每一个测试返回值均非0,执行主命令。当对于exec进行条件限制,需要判定条件返回不同值,即要求一个返回0而另一个返回非0时,则可同时使用unless与onlyif,且两个判定条件无先后顺序,同时满足时方可执行主命令。

配置说明

class smallflow::fdisk {
    exec {
          "echo /dev/vdb /export ext4 nofails 0 0 >> /etc/fstab":
          user     => "root",
          cwd      => "/root",
          path     => "/usr/bin:/usr/sbin:/sbin:/bin",
          provider => "shell",
          timeout  => "60",
          unless   => "cat /etc/fstab | grep vdb",
          onlyif   => "fdisk -l | grep ^/ | grep vdb",
       }
  }

四、核心类型——ssh_authorized_key

使用ssh_authorized_key类型,通过指定用户、路径以及秘钥内容,可在相应的authorized_keys文件中以追加的方式增加秘钥。并且,当相同的秘钥存在时,不会再重复追加。注:name一致时视为同一秘钥;若name不一致,key一致也被视为不同秘钥而重复添加。

配置说明

class smallflow::jump_keys {
    ssh_authorized_key {
      "root@10.10.0.10":    #相同密钥,此name必须一致
      ensure => "present",
      type   => "ssh-rsa",                  
      key    => "AAAAB3NzaC1yc2EAAAADAQABbbbBAQC/2uvPWzfwNisTBEAL11UIV0iiF3yIPw9Vw0CJzpdHqSm8V4yutN8Qmlwn/ituruJuUx0xxsPYk6Vn7GkngABC2xpuHdoSIrw/uFtbd6REC/uXO9fG17E8yj+OlLbIvZryo57oudMseOH+4Y4ssZ56prAsRyYCg4+JuEajZwEIVQVzy2B9CdRATOJYGVHoAONkll5xDy5xBhR43b/H3WnAbdlq9k+KN/8fOQ4S41AAGDnOtzFr3kpBz+BgHHmF/oWrnf6DyyZIoiljyq9zrm5QMObYMtpXW8IVdHxq6ZSyUbJ7XwA9XsOSfivoNN7p3s5y4VkPXBvaUL6AiNISX/v7",
      target => "/root/.ssh/authorized_keys",
      user   => "root";
     }
  }

五、Puppet变量——facter

典型案例说明

1、通过facter变量直接获取机器的uptime时间

在onlyif和unless判断语句中,$符号被看做是一个变量,因此当我们将运行时间作为onlyif的判断语句时,onlyif => [ uptime | awk -F ‘ ‘ ‘{print $3}’ ],onlyif会将3puppetpuppetonlyiffacter3作为puppet的一个变量去获取,但是puppet变量中并没有该变量,因此获取失败导致onlyif不能生效。因此,我们可以通过facter变量[uptime_days]来获取机器的运行时间,此时onlyif判断语句可以正常生效。

配置说明

class smallflow::tomcat {
    exec {
      "tar -zxvf apache-tomcat-8.0.30.tar.gz && ln -s ./apache-tomcat-8.0.30 tomcat":
      user     => "admin",
      cwd      => "/export/servers/",                  
      path     => "/usr/bin:/usr/sbin:/sbin:/bin",
      provider => "shell",
      timeout  => "60",
      creates  => "/export/servers/tomcat",
      onlyif   => "[ `expr ${uptime_days}` -lt 5 ]", #通过facter变量uptime_days获取机器的运行时间,且以天为单位
     }
  }
2、site.pp文件中通过变量ipaddress获得机器节点IP,用来定义节点

通过$::ipaddress变量获得节点的IP地址后,通过正则表达式的匹配来给节点分组,不同的分组中可以根据需求include不同的模块。采用IP地址的方式定义节点可以避免节点命名不规范,从而导致的无法对节点分组的问题。

配置说明

node default {
	case $::ipaddress {
		/^10\.144\.120.\d/: {
			include smallflow
			include blackshark
		}
	}
	case $::ipaddress {
		/^10\.144\.128.\d/: {
			include smallflow
		}
	}
}
3、变量operatingsystemmajrelease获得机器系统的主版本号

以CentOS系统为例,版本6与版本7中服务启动方式不同,因此为提高pp文件的兼容性,可通过变量获取到系统的主版本号,根据版本的不同执行相应的操作。

配置说明

class smallflow::ifrit {
	if $operatingsystemmajrelease == '6' {
		exec {
			"service ifritd start":
			user     => "root",
			cwd      => "/tmp",
			path     => "/usr/bin:/usr/sbin:/sbin:/bin",
			provider => "shell",
			timeout  => "60",
			unless   => "service ifritd status"
		}
	}
	elsif $operatingsystemmajrelease == '7' {
		exec {
			"systemctl restart ifritd":
			user     => "root",
			cwd      => "/tmp",
			path     => "/usr/bin:/usr/sbin:/sbin:/bin",
			provider => "shell",
			timeout  => "60",
			unless   => "systemctl status ifritd"
		}
	} 
}
4、自定义facter变量

在自定义facter变量的路径下编写.rb文件,并将自定义facter变量的路径写入/etc/profile文件中
(原文缺图)
image2018-5-16 14:55:2.png
(原文缺图)
image2018-5-16 15:2:54.png

在需要运行自定义facter变量的模块中创建与files、manitests并列的/lib/facter文件夹,并将在自定义路径下创建的.rb文件复制到/lib/facter文件夹下。
(原文缺图)
image2018-5-16 14:43:51.png

在puppet master的配置文件puppet.conf文件中,开启“模块中的插件”功能,当agent执行puppet agent -t请求时,便会同时加载master中所创建的自定义facter变量。注:自定义facter变量在agent首次执行puppet agent -t请求时只会被加载到agent机器中,但并不能被.pp文件所使用,在二次执行时方可正常使用。
(原文缺图)
image2018-5-16 14:56:25.png

六、其它用法

1、类型重定义冲突避免

在不同的pp文件中,由于策略需求定义了相同的类型且title相同时,执行puppet请求时会报错如下:
在这里插入图片描述

解决方法:

class iaas::inotify {
         if ! defined(File["/usr/lib/systemd"]) { #增加此行避免重定义报错
                 file {"/usr/lib/systemd":
                         ensure => "directory",
                         owner  => "root",
                         group  => "root",
                         mode   => "0755";
                 }
         }
}	

若有多个pp文件中都定义了相同title的类型,则只有一个不需要增加if ! defined避免重定义报错,其余多个都需要添加。

Puppet使用特性总结

  • 同一个pp文件中存在多个类型操作时,无需对多个操作进行排序,puppet在执行时可自行判断各个操作的先后顺序来执行操作。
  • 不同类型中的属性不可在其它类型中使用。

Puppet使用最佳实践

  • 尽可能使用puppet自身的type来实现各类功能,从而更好的利用Puppet跨平台跨版本的特性,如果全部用exec命令实现,则无法适配各类操作系统,各类版本
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!