puppet基础篇(练习篇)

时间:2021-11-16 11:49:08

puppet基础篇(练习篇)

本文分为两部分:一、安装配置及命令用法;二、puppet资源基础练习

1.安装配置及命令用法

#在epel仓库安装yum install ./facter-2.4.6-1.el7.x86_64.rpm  ./puppet-3.8.7-1.el7.noarch.rpm [root@node1 puppet]# puppet helpUsage: puppet <subcommand> [options] <action> [options]puppet apply apply             Apply Puppet manifests locally puppet apply --help SYNOPSIS ----------- Applies a standalone Puppet manifest to the local system. puppet apply [-h|--help] [-V|--version] [-d|--debug] [-v|--verbose]  [-e|--execute] [--detailed-exitcodes] [-L|--loadclasses]  [-l|--logdest syslog|eventlog|<FILE>|console] [--noop]  [--catalog <catalog>] [--write-catalog-summary] <file>* --noop:Use 'noop' mode where Puppet runs in a no-op or dry-run mode.puppet describedescribe          Display help about resource typespuppet describe [-h|--help] [-s|--short] [-p|--providers] [-l|--list] [-m|--meta] OPTIONS-------* --help:  Print this help text* --providers:  Describe providers in detail for each type  #列出所有的资源类型* --list:  List all types  #列出指定类型的参数,一般与-s一同使用* --meta:  List all metaparameters#列出指定类型的简要帮助信息* --short:  List only parameters without detail  #列出puppet的资源类型[root@node1 puppet]# puppet describe -lThese are the types known to puppet:augeas          - Apply a change or an array of changes to the  ...computer        - Computer object management using DirectorySer ...cron            - Installs and manages cron jobsexec            - Executes external commandsfile            - Manages files, including their content, owner ...filebucket      - A repository for storing and retrieving file  ...group           - Manage groupshost            - Installs and manages host entriesinterface       - This represents a router or switch interfacek5login         - Manage the `.k5login` file for a usermacauthorization - Manage the Mac OS X authorization databasemailalias       - .. no documentation ..maillist        - Manage email listsmcx             - MCX object management using DirectoryService  ...mount           - Manages mounted filesystems, including puttin ...nagios_command  - The Nagios type commandnagios_contact  - The Nagios type contactnagios_contactgroup - The Nagios type contactgroupnagios_host     - The Nagios type hostnagios_hostdependency - The Nagios type hostdependencynagios_hostescalation - The Nagios type hostescalationnagios_hostextinfo - The Nagios type hostextinfonagios_hostgroup - The Nagios type hostgroupnagios_service  - The Nagios type servicenagios_servicedependency - The Nagios type servicedependencynagios_serviceescalation - The Nagios type serviceescalationnagios_serviceextinfo - The Nagios type serviceextinfonagios_servicegroup - The Nagios type servicegroupnagios_timeperiod - The Nagios type timeperiodnotify          - .. no documentation ..package         - Manage packagesresources       - This is a metatype that can manage other reso ...router          - .. no documentation ..schedule        - Define schedules for Puppetscheduled_task  - Installs and manages Windows Scheduled Tasksselboolean      - Manages SELinux booleans on systems with SELi ...selmodule       - Manages loading and unloading of SELinux poli ...service         - Manage running servicesssh_authorized_key - Manages SSH authorized keyssshkey          - Installs and manages ssh host keysstage           - A resource type for creating new run stagestidy            - Remove unwanted files based on specific crite ...user            - Manage usersvlan            - .. no documentation ..whit            - Whits are internal artifacts of Puppet's curr ...yumrepo         - The client-side description of a yum reposito ...zfs             - Manage zfszone            - Manages Solaris zoneszpool           - Manage zpools#查看组类型的用法puppet describe group#各种属性的介绍- **ensure**Create or remove the group.Valid values are `present`, `absent`. - **gid**The group ID.- **members**The members of the group. - **name**The group name.- **system**Whether the group is a system group with lower GID.

2.puppet资源基础练习

        核心类型:                group: 组user:用户packge:程序包 service:服务file:文件exec:执行自定义命令,要求幂等cron:周期性任务计划notify:通知###资源定义通过资源类型的属性赋值来实现资源定义,这也称为资源类型实例化。定义资源实例化的文件即清单:manifest###属性:attribute资源属性中三个个特殊属性(几乎所有的资源中都有)namevar,可简写为name,描述资源的名字ensure,描述资源的目标状态provider,资源的管理接口语法;type {'title':attribute1 => value1,atrribute2=> value2,……}        #创建清单的目录[root@node1 puppet]# mkdir manifests[root@node1 puppet]# cd manifests/###资源类型1.groupgroup{'nginx':    ensure  =>  present,    name    =>  'nginx',    system  =>  true,}#干跑模式[root@node1 manifests]# puppet apply --verbose --noop first.pp Notice: Compiled catalog for node1.localdomain in environment production in 0.15 secondsInfo: Applying configuration version '1500559833'Notice: /Stage[main]/Main/Group[nginx]/ensure: current_value absent, should be present (noop)Notice: Class[Main]: Would have triggered 'refresh' from 1 eventsNotice: Stage[main]: Would have triggered 'refresh' from 1 eventsNotice: Finished catalog run in 0.04 seconds#执行[root@node1 manifests]# puppet apply --verbose --debug  first.pp Info: Applying configuration version '1500560157'Debug: Executing '/usr/sbin/groupadd -r nginx'Notice: /Stage[main]/Main/Group[nginx]/ensure: createdNotice: Finished catalog run in 0.08 seconds#查看[root@node1 manifests]# tail -1 /etc/groupnginx:x:995:2.user2.user#查看user资源的各种用法 puppet describe user  #列出的资源管理接口,可自定义 Providers---------    aix, directoryservice, hpuxuseradd, ldap, pw, user_role_add, useradd,    windows_adsi  #示例[root@node1 manifests]# vi user.ppuser{'nginx':    uid     =>  444,    gid     =>  'nginx',    system  =>  true,    ensure  =>  present,}puppet apply -v --noop user.pp Notice: Compiled catalog for node1.localdomain in environment production in 0.20 secondsInfo: Applying configuration version '1500561782'Notice: /Stage[main]/Main/User[nginx]/ensure: current_value absent, should be present (noop)Notice: Class[Main]: Would have triggered 'refresh' from 1 eventsNotice: Stage[main]: Would have triggered 'refresh' from 1 eventsNotice: Finished catalog run in 0.04 seconds[root@node1 manifests]# puppet apply -v  user.pp Notice: Compiled catalog for node1.localdomain in environment production in 0.21 secondsInfo: Applying configuration version '1500561816'Notice: /Stage[main]/Main/User[nginx]/ensure: createdNotice: Finished catalog run in 0.07 seconds[root@node1 manifests]# tail -1 /etc/passwd nginx:x:444:995::/home/nginx:/bin/bash关系源参数before require notify subscribe四个元参数来定义资源间的相关性资源定义有依赖关系,优先级资源可以被定义,也可以被引用,资源的引用通过"Type['title']" 注意:首字母必须大写#示例vi redis.ppuser{'redis':    gid     =>  'redis',    ensure  =>  present,    require =>  Group['redis'],}group{'redis':    ensure  =>  present,    #before =>User['redis'],}puppet apply -v -d --noop redis.pp Info: Applying configuration version '1500562662'Notice: /Stage[main]/Main/Group[redis]/ensure: current_value absent, should be present (noop)Debug: /Stage[main]/Main/Group[redis]: The container Class[Main] will propagate my refresh eventNotice: /Stage[main]/Main/User[redis]/ensure: current_value absent, should be present (noop)Debug: /Stage[main]/Main/User[redis]: The container Class[Main] will propagate my refresh eventNotice: Class[Main]: Would have triggered 'refresh' from 2 eventsDebug: Class[Main]: The container Stage[main] will propagate my refresh eventNotice: Stage[main]: Would have triggered 'refresh' from 1 events[root@node1 manifests]# puppet apply -v -d  redis.pp [root@node1 manifests]# grep -i "redis" /etc/passwd redis:x:1001:1001::/home/redis:/bin/bash3.package3.package[root@node1 manifests]# puppet describe package package=======Manage packages. Parameters----------- **ensure**    What state the package should be in.    `present` (also called `installed`), `absent`,    `purged`, `held`, `latest`.- **install_options**Requires features install_options.- **instance**    A read-only parameter set by the package.- **name**    The package name. - **source**    Where to find the package file.        #示例1        vi package.pp        package{'redis':        ensure      =>  latest,    }[root@node1 manifests]# puppet apply -v -d --noop package.pp  Notice: /Stage[main]/Main/Package[redis]/ensure: current_value absent, should be latest (noop) Debug: /Stage[main]/Main/Package[redis]: The container Class[Main] will propagate my refresh event Notice: Class[Main]: Would have triggered 'refresh' from 1 events Debug: Class[Main]: The container Stage[main] will propagate my refresh event Notice: Stage[main]: Would have triggered 'refresh' from 1 events  #执行[root@node1 manifests]# puppet apply -v  package.pp Notice: Compiled catalog for node1.localdomain in environment production in 0.53 secondsInfo: Applying configuration version '1500564098'Notice: /Stage[main]/Main/Package[redis]/ensure: createdNotice: Finished catalog run in 2.93 seconds[root@node1 manifests]# rpm -q redisredis-3.2.3-1.el7.x86_64#示例2[root@node1 manifests]# vi jdk.pp package{'jdk':    ensure      =>  present,    source      =>  '/root/jdk-7u79-linux-x64.rpm',    provider    =>  rpm,}4.service[root@node1 manifests]# puppet describe service service=======Manage running services.Parameters----------- **binary**    The path to the daemon. - **enable**    Whether a service should be enabled to start at boot.- **ensure**    Whether a service should be running.                                Valid values are `stopped` (also called `false`), `running` (also called    `true`). - **flags**    Specify a string of flags to pass to the startup script.                                Requires features flaggable.- **hasrestart**    Specify that an init script has a `restart` command.     the init script's `stop` and `start` commands will be used.     Valid values are `true`, `false`.     #对应这个脚本有没有restart操作     作用:如果命令有restart,就用restart,没有就stop,再start- **hasstatus**- **path**    The search path for finding init scripts.    #脚本搜索的路径:    centos6:/etc/init    centos7:/usr/lib/systemd/system/- **start**    Specify a *start* command manually.    #手动定义start不用脚本的- **restart**  Specify a *restart* command manually.   #通常定义reload操作- **pattern**    The pattern to search for in the process table.Providers---------    base, bsd, daemontools, debian, freebsd, gentoo, init, launchd, openbsd,    openrc, openwrt, redhat, runit, service, smf, src, systemd, upstart,    windows#示例[root@node1 manifests]# puppet apply -v -d --noop service.pp Notice: /Stage[main]/Main/Service[redis]/ensure: current_value stopped, should be running (noop)Debug: /Stage[main]/Main/Service[redis]: The container Class[Main] will propagate my refresh eventInfo: /Stage[main]/Main/Service[redis]: Unscheduling refresh on Service[redis]Notice: Class[Main]: Would have triggered 'refresh' from 1 eventsDebug: Class[Main]: The container Stage[main] will propagate my refresh eventNotice: Stage[main]: Would have triggered 'refresh' from 1 events[root@node1 manifests]# puppet apply -v -d service.pp Info: Applying configuration version '1500565381'Debug: Executing '/usr/bin/systemctl is-active redis'Debug: Executing '/usr/bin/systemctl is-enabled redis'Debug: Executing '/usr/bin/systemctl start redis'Debug: Executing '/usr/bin/systemctl is-enabled redis'Debug: Executing '/usr/bin/systemctl enable redis'Notice: /Stage[main]/Main/Service[redis]/ensure: ensure changed 'stopped' to 'running'[root@node1 manifests]# ss -tlnp | grep redisLISTEN     0      128    127.0.0.1:6379                     *:*                   users:(("redis-server",pid=6817,fd=4))#示例2[root@node1 manifests]# vi service.pppackage{'redis':    ensure      =>  present,}service{'redis':    ensure      =>  running,    enable      =>  true,    require     =>  Package['redis'],}5.file[root@node1 manifests]# puppet describe filefile====Manages files, including their content, ownership, and permissions.Parameters----------- **backup**- **checksum**    The checksum type to use when determining whether to replace a file's    contents.    The default checksum type is md5. Valid values are `md5`, `md5lite`, `sha256`, `sha256lite`, `mtime`,    `ctime`, `none`. - **content**    The desired contents of a file, as a string.This attribute is mutually    exclusive with `source` and `target`.- **ensure**    Whether the file should exist, and if so what kind of file it should be.                                Possible values are `present`, `absent`, `file`, `directory`, and    `link`. # Equivalent resources:        file { "/etc/inetd.conf":          ensure => "/etc/inet/inetd.conf",        }        file { "/etc/inetd.conf":          ensure => link,          target => "/etc/inet/inetd.conf",        }- **force**    Perform the file operation even if it will destroy one or more    directories.- **group**    Which group should own the file. - **links**    How to handle links during file actions.   During file copying,    `follow` will copy the target file instead of the link, `manage`    will copy the link itself, and `ignore` will just pass it by.- **mode**    The desired permissions mode for the file,- **mtime**- **owner**    The user to whom the file should belong.- **path** (*namevar*)    The path to the file to manage.-**recurse**    Whether to recursively manage the _contents_ of a directory.- **replace**- **source**    A source file, which will be copied into place on the local system.- **source_permissions**     Whether (and how) Puppet should copy owner, group, and mode permissions    from    the `source` to `file` resources when the permissions are not explicitly    specified.     Valid values are `use`, `use_when_creating`, and `ignore`:- **target**    The target for creating a link. - **validate_cmd**    A command for validating the file's syntax before replacing it. Example:        file { '/etc/apache2/apache2.conf':          content      => 'example',          validate_cmd => '/usr/sbin/apache2 -t -f %',        }Providers---------    posix, windows#示例1[root@node1 manifests]# cp /etc/redis.conf ./[root@node1 manifests]# vi redis.conf bind 0.0.0.0masterauth 123456[root@node1 manifests]# ll /etc/redis.conf -rw-r--r--. 1 redis root 46730 Aug  5  2016 /etc/redis.conf[root@node1 manifests]# vi file1.pp [root@node1 manifests]# vi file1.pp file{'/etc/redis.conf':    ensure      =>  file,    source      =>  '/etc/puppet/manifests/redis.conf',    owner       =>  'redis',    group       =>  'root',    mode        =>  '0644',}[root@node1 manifests]# puppet apply -v -d --noop file1.pp [root@node1 manifests]# puppet apply -v -d --noop file1.pp Info: Applying configuration version '1500567458'Debug: Evicting cache entry for environment 'production'Debug: Caching environment 'production' (ttl = 0 sec)Info: Computing checksum on file /etc/redis.confDebug: Evicting cache entry for environment 'production'Debug: Caching environment 'production' (ttl = 0 sec)Info: /Stage[main]/Main/File[/etc/redis.conf]: Filebucketed /etc/redis.conf to puppet with sum 910058e228c4ad556ffc0f473cef9323[root@node1 manifests]# cat /etc/redis.conf | egrep -i "bind 0.0.0.0|masterauth 123456"bind 0.0.0.0  masterauth 123456 通知元参数两个参数:通知和订阅,见名知意,很好理解。notify,subscribeA notify B:B依赖于B,且A发生改变会通知B{notify => Type['B'],}B subscribe A :B依赖与A,B订阅A资源产生的事件{subscribe => Type['B'],}其中有特殊情况:链式依赖#示例2[root@node1 manifests]# vi service.pp #install redis packagepackage{'redis':    ensure      =>  present,}#push source file to des file.file{'/etc/redis.conf':    ensure      =>  file,    source      =>  '/etc/puppet/manifests/redis.conf'    require     =>  Package['redis'],}#running redis serverservice{'redis':    ensure      =>  running,    enable      =>  true,    require     =>  Package['redis'],    subscribe   =>  File['/etc/redis.conf'],}[root@node1 manifests]# puppet apply -v -d --noop service.pp [root@node1 manifests]# puppet apply -v -d service.pp #示例3:修正版 A -> B 表示A before B;B ~> C 表示B notify C;[root@node1 manifests]# vi service.pp #install redis packagepackage{'redis':    ensure      =>  present,} ->#push source file to des file.file{'/etc/redis.conf':    ensure      =>  file,    source      =>  '/etc/puppet/manifests/redis.conf',    owner       =>  'redis',    group       =>  'root',    mode        =>  '0644',} ~>#running redis serverservice{'redis':    ensure      =>  running,    enable      =>  true,}#或者还可以这样表示:Package['redis'] -> File['/etc/redis.conf'] ~> Service['redis']#示例4:content用法[root@node1 manifests]# vi test.ppfile{'/tmp/test.txt':    ensure  =>  file,    content =>  'Hello World!',}[root@node1 manifests]# puppet apply -v test.pp #note:content also can be created by template.[root@node1 manifests]# puppet apply -v test.pp Notice: Compiled catalog for node1.localdomain in environment production in 0.16 secondsInfo: Applying configuration version '1500569471'Notice: /Stage[main]/Main/File[/tmp/test.txt]/ensure: defined content as '{md5}ed076287532e86365e841e92bfc50d8c'Notice: Finished catalog run in 0.05 seconds[root@node1 manifests]# cat /tmp/test.txt Hello World!#示例6:link用法[root@node1 manifests]# puppet apply  -v link.pp Notice: Compiled catalog for node1.localdomain in environment production in 0.15 secondsInfo: Applying configuration version '1500569692'Notice: /Stage[main]/Main/File[/tmp/test.link]/ensure: createdNotice: Finished catalog run in 0.04 seconds[root@node1 manifests]# ll /tmp/test.linklrwxrwxrwx. 1 root root 13 Jul 21 00:54 /tmp/test.link -> /tmp/test.txt#示例5:递归创建目录[root@node1 manifests]# vi mkdir.ppfile{'/tmp/pam.d':    ensure      =>  directory,    source      =>  '/etc/pam.d',    recurse    =>  true,}#note: if source is  not exist,which would create empty directory.[root@node1 manifests]# puppet apply -v mkdir.pp [root@node1 manifests]# ll /tmp/pam.d/total 104-rw-r--r--. 1 root root 192 Jul 21 00:59 chfn...#(ps:DevOPs三个层次:bootstraping,configuration,command and control)6.exec[root@node1 manifests]# puppet describe exec exec====Executes external commands.Any command in an `exec` resource **must** be able to run multiple timeswithout causing harm --- that is, it must be *idempotent*.#任何能够在exec资源执行的命令必须能够重复执行,并且不产生危害,这就意味着,命令必须拥有幂等性。Parameters----------- **command** (*namevar*)    The actual command to execute. - **creates**    A file to look for before running the command.                                        #文件路径,当此路径的文件不存在,cmd就会执行    exec { "tar -xf /Volumes/nfs02/important.tar":          cwd     => "/var/tmp",          creates => "/var/tmp/myfile",          path    => ["/usr/bin", "/usr/sbin"]        }- **cwd**    The directory from which to run the command. - **environment**    Any additional environment variables you want to set for a    command.  - **group**    The group to run the command as.- **logoutput**    Whether to log command output in addition to logging the    exit code.     - **onlyif**    If this parameter is set, then this `exec` will only run if                                    the command has an exit code of 0.                                     #只有这个命令运行成功才运行cmd。     For example:    exec { "logrotate":          path   => "/usr/bin:/usr/sbin:/bin",          onlyif => "test `du /var/log/messages | cut -f1` -gt 100000"        }- **path**    The search path used for command execution.- **refresh**    How to refresh this command.      #重新执行当前cmd的替代命令     - **refreshonly**    The command should only be run as a    refresh mechanism for when a dependent object is changed.        #仅接收到订阅的资源的通知才运行cmd    Valid values are `true`, `false`. - **returns**    The expected exit code(s).- **timeout**    The maximum time the command should take. - **tries**    - **try_sleep**    The time to sleep in seconds between 'tries'.- **umask**    Sets the umask to be used while executing this command- **unless**    If this parameter is set, then this `exec` will run unless    the command has an exit code of 0.        #如果这个命令运行失败就运行cmd- **user**    The user to run the command as.Providers---------    posix, shell, windows   #示例1:创建目录[root@node1 manifests]# vi exec1.ppexec{'mkdir':    command     =>  'mkdir /tmp/testdir',    path        =>  '/bin:/sbin:/usr/bin:/usr/sbin',    creates     =>  '/tmp/testdir',  #directory not exist ,exec cmd.}[root@node1 manifests]# puppet apply -v exec1.pp Notice: Compiled catalog for node1.localdomain in environment production in 0.07 secondsInfo: Applying configuration version '1500582762'Notice: /Stage[main]/Main/Exec[mkdir]/returns: executed successfullyNotice: Finished catalog run in 0.04 seconds[root@node1 manifests]# ls /tmp/testdir/ -d/tmp/testdir/#示例2:创建用户[root@node1 manifests]# vi exec2.pp exec{'adduser':    command     =>  'useradd -r mogilefs',    path        =>  '/bin:/sbin:/usr/bin:/usr/sbin',        unless      =>  'id mogilefs',      #unless id cmd success,exec comd.}[root@node1 manifests]# puppet apply -v exec2.pp Notice: Compiled catalog for node1.localdomain in environment production in 0.07 secondsInfo: Applying configuration version '1500583160'Notice: /Stage[main]/Main/Exec[adduser]/returns: executed successfullyNotice: Finished catalog run in 0.10 seconds[root@node1 manifests]# grep -i "mogilefs" /etc/passwdmogilefs:x:442:442::/home/mogilefs:/bin/bash[root@node1 manifests]# id mogilefsuid=442(mogilefs) gid=442(mogilefs) groups=442(mogilefs)#示例3package{'httpd':    ensure      =>  latest,} ~>exec{'adduser':    command     =>  'useradd -r httpd',    path        =>  '/bin:/sbin:/usr/bin:/usr/sbin',      unless      =>  'id httpd',     #unless id cmd success,exec comd.    refreshonly =>  true,}[root@node1 manifests]# grep -i "httpd" /etc/passwdapache:x:48:48:Apache:/usr/share/httpd:/sbin/nologinhttpd:x:442:442::/home/httpd:/bin/bash7.cron[root@node1 manifests]# puppet describe croncron====Installs and manages cron jobs.#cron资源必要要有一个周期性的属性 cron { logrotate:      command => "/usr/sbin/logrotate",      user    => root,      hour    => ['2-4'],      minute  => '*/10'    }Parameters----------- **command**    The command to execute in the cron job. - **ensure**    The basic property that the resource should be in.Valid values are `present`, `absent`. - **environment**    Any environment settings associated with this cron job.- **hour**- **minute**- **month**- **monthday**- **name**    The symbolic name of the cron job- **special**    A special value such as 'reboot' or 'annually'.- **target**    The name of the crontab file in which the cron job should be stored.                                        #添加哪个用户的任务- **user**- **weekday**#示例1[root@node1 manifests]# vi cron1.pp cron{'synctime':    command     =>  '/usr/sbin/ntpdate 172.16.0.1 &> /dev/null',    name        =>  'synctime from ntp server',    minute      =>  '*/30',}[root@node1 manifests]# puppet apply -v cron1.pp[root@node1 manifests]# crontab -l | grep '172.'*/30 * * * * /usr/sbin/ntpdate 172.16.0.1 &> /dev/null8.notify[root@node1 manifests]# puppet describe notifynotify======Sends an arbitrary message to the agent run-time log.Parameters----------- **message**    The message to be sent to the log.- **name**    An arbitrary tag for your own reference; the name of the message.- **withpath**    Whether to show the full object path. Defaults to false. Valid values are `true`, `false`. #示例    [root@node1 manifests]# puppet apply -v notify1.pp Notice: Compiled catalog for node1.localdomain in environment production in 0.03 secondsInfo: Applying configuration version '1500584971'Notice: hi,you are welcome!Notice: /Stage[main]/Main/Notify[sayhi]/message: defined 'message' as 'hi,you are welcome!'Notice: Finished catalog run in 0.03 seconds

3.总结

主要介绍了核心类型资源的用法,核心类型资源包括:group,user,package,service,file,exec,cron,notify,总共8种资源的用法。group定义属组相关用法,user定义属主用法,package定义程序包用法,service定义程序服务用法,file定义文件的用法,exec定义了自定义命令的用法,cron定义周期性任务的的用法,notify'定义信息通知的用法。