1、puppet相关概念 1、运维工具 2、puppet介绍 3、工作模式 4、puppet三层模型 5、资源抽象层(RAL) 6、puppet工作流程 7、puppet与agent通信方式 2、安装使用 3、puppet资源定义 1、定义资源 2、资源类型 3、示例 4、特殊属性 4、特殊属性 Metaparameters 5、puppet配置语言 1、变量 2、支持的数据类型 3、表达式 4、service、notify、变量 示例 5、puppet中变量种类 6、条件语句 7、case语句 8、selector语句 6、puppet类 7、puppet模版 ================================================================================================================================================ puppet基础 1、运维层级及对应的工具 1、OS Provisioning: PXE、Cobbler 2、Comfiguration:ansible、puppet、saltstack、chef、cfengine 3、Command and Control:func、ansible、fabric 4、自动化发布平台 2、puppet介绍 puppet是一个自动运维管理工具,他能够管理整个生命周期的主机,包括系统提供、系统配置(puppet最强大的功能所在)、系统状态报告。 3、工作模式 puppet是一个有agent的工作模式。master/agent的模式,被管理的节点安装puppet agent,代为puppet server管理。agent去真正执行相应的 管理操作,周期性的到master请求与自己相关的配置。puppet有自己的配置编程语言,其工作过程如下: (1). server端定义为每一个agent配置基础配置信息,定义资源状态 (2). 模拟测试执行 (3). 执行 (4). report,发送报告,将日志发送到监控工具 4、puppet三层模型 Configuration Language:配置语言 Transactional Layer:事务层 Resource Abstraction Layer:资源抽象层,将每一个被管理的节点抽象为一个资源。 5、资源抽象层(RAL) 资源类型: 用户账号、文件、服务、cron任务等,都称为不同类型的资源。相似的资源被抽象成同一种资源"类型",如程序包资源、用户资源及服务资源。 属性及状态与其实现方式分离: 例如仅仅关心安装某个资源,而不关心是通过何种方式去安装。 期望状态 只关心期望的状态,而不是其转换为某个状态的操作。例如只关心nginx运行起来,而不是运行nginx命令将其启动运行起来。 6、puppet工作流程 manifest(清单)是执行任务的单位,每个清单中定义了所要执行的任务。清单在Agent端执行,必须要经过编译的过程。manifest(清单) 被编译为catalog(伪代码)。之后在本地进行应用apply,应用分为两步,状态查询和执行目标状态。 在master/agent的模式下,清单资源被定义在master端,agent端每隔一段时间(周期性的)向master请求与自己相关的清单,在请求的同 时也会发送自己的主机名和facts(报告自己属性例如硬件信息)。当master收到agent的请求后,master也会查询请求者的站点清单,并从 本地找到与请求者相关的清单编译成伪代码后发送给agent。agent收到伪代码后进行应用,之后发送报告。 puppet在执行资源清单所定义的任务时,可能依赖于外部的一些数据,将这些资源和所依赖的外部数据组织起来就是puppet modules。 模块化使得可以将之应用于不同的主机,每个主机所使用到的叫站点清单。 7、puppet与agent通信方式 使用HTTPS通信,client会自动的向master端发起证书签署请求。 ================================================================================================================================================ 安装使用 1、默认情况下,Puppet Server配置为使用2GB的RAM。但是,如果您想在虚拟机上试用Puppet Server,则可以安全地分配512MB的内存。要更改Puppet Server内存分配,可以编辑init配置文件。修改/etc/sysconfig/puppetserver,JAVA_ARGS="-Xms512m -Xmx512m" 2、可以使用puppet官方提供的yum仓库进行安装较新版本的puppet https://puppet.com/docs/puppet/5.0/puppet_platform.html?_ga=2.10337269.1798996022.1509979889-164125331.1509979889 3、安装版本 facter-2.4.4-1.el7.x86_64.rpm puppet-3.8.4-1.el7.noarch.rpm agent:puppet、facter master:puppet-server 4、文件列表 /etc/puppet/ # 配置文件目录 /usr/lib/systemd/system/puppet.service # 服务脚本 5、puppet程序使用 格式:puppet [options] [options] 子命令: agent # puppet agent守护进程 apply # 本地运行清单文件 ca # 管理本地CA catalog # 编译查看catalog文件 cert # 管理证书 config # 交互式完成puppet配置 describe # 显示资源类型的帮助 device Manage remote network devices doc Generate Puppet documentation and references facts Retrieve and store facts. file Retrieve and store files in a filebucket filebucket Store and retrieve files in a filebucket help Display Puppet help. inspect Send an inspection report instrumentation_data Manage instrumentation listener accumulated data. instrumentation_listener Manage instrumentation listeners. instrumentation_probe Manage instrumentation probes. key Create, save, and remove certificate keys. kick Remotely control puppet agent man Display Puppet manual pages. master The puppet master daemon module Creates, installs and searches for modules on the Puppet Forge. node View and manage node definitions. parser Interact directly with the parser. plugin Interact with the Puppet plugin system. queue Deprecated queuing daemon for asynchronous storeconfigs report Create, display, and submit reports. resource The resource abstraction layer shell resource_type View classes, defined resource types, and nodes from all manifests. secret_agent Mimics puppet agent. status View puppet server status. 命令示例: 格式: puppet describe [-h|--help] [-s|--short] [-p|--providers] [-l|--list] [-m|--meta] puppet describe # 显示资源类型帮助信息 puppet describe -l # 显示所有的资源类型 puppet describe RESOURCE_TYPE # 查看某个资源的使用帮助 ================================================================================================================================================ puppet资源定义 1、定义资源 2、资源类型 3、示例 4、特殊属性 1、定义资源 1、语法格式 type {'title': attribute => value, attribute => value } 2、注意: 资源类型必须使用小写字符 同一类型的资源title名称必须唯一 3、资源特殊属性 Namevar 名称变量 Ensure 用于控制资源的存在性 ensure => file 存在且为一个普通文件 ensure => directory 存在且为一个目录 ensure => present 存在 ensure => absent 不存在 Provide 元属性。定义资源之间的关系 4、type 资源类型 user、group、file、package、service、exec、cron、notify 5、定义资源示例 group {'distro': gid => 2000, ensure => present, } user {'xuekaixin': uid => 2000, gid => 2000, home => '/home/centos', ensure => present, } 6、执行资源清单中的任务 选项: -l # 记录日志 --noop # 预执行,不真正应用 puppet apply -v test.pp 验证是否创建用户:id xuekaixin 2、资源类型 1、group # 查看组资源属性 puppet describe group # 属性 allowdupe => `true`, `false`, `yes`, `no` # 是否允许出现重读组ID ensure => `present`, `absent` # 定义组的状态是否存在或不存在 gid => N # 定义GID name => NAME # 定义组名 system => `true`, `false`, `yes`, `no` # 是否创建为系统组 members => USER_NAME # 定义组内的成员 2、user comment => 'STRING' # 用户的描述信息 ensure => `present`, `absent` # 定义用户的状态是否存在或不存在 gid => GROUP_NAME # 定义所属的基本组 groups => GROUP_NAME # 定义所属的附加组 home => 'DIR' # 定义用户的家目录 name => NAME # 用户名 password => PASSWORD # 密码 password_max_age => # 密码最长使用期限 password_min_age => # 密码最短使用期限 system => uid => shell => 3、file # 此资源类型可以管理文件及其内容、从属关系以及权限、目录、符号链接等。文件内容可通过content属性直接定义,也可以 通过source属性根据远程服务器路径下载生成 # 属性 checksum => `md5`, `md5lite`, `sha256`, `sha256lite`, `mtime`, `ctime`, `none` # 检查文件完整性 content => '.....' # 支持\n \t控制符 source => [ # 从指定位置下载文件。可以是本地文件路径 "puppet:///modules/nfs/conf.$host", "puppet:///modules/nfs/conf.$operatingsystem", "puppet:///modules/nfs/conf" ] recurse => `true`, `false`, `inf`, `remote` # 如果所要下载的是一个目录,则进行递归下载 ensure => `present`, `absent`, `file`, `directory`, `link` # 指明文件状态或类型 force => `true`, `false`, `yes`, `no` # 是否强制运行。如果有同名的文件,则会覆盖 group => # 属组 owner => # 属主 mode => # 例如:mode => 'ug+w' mode => 'a=r,ug+w' mode => '0664' mtime => # 最近修改时间 path => # 目标路径,建议使用绝对路径 target => # 当ensure为link时,target表示path指向的文件是一个符号链接,其目标为此target属性所指的路径 file { "/etc/inetd.conf": ensure => link, target => "inet/inetd.conf", } 4、exec # 要执行的命令需要有幂等性,即可以从都运行多次。 The exec has an `onlyif`, `unless`, or `creates` attribute{条件式请求} # 属性 command => # 所要运行的命令:NameVar creates => # 此属性指定的文件不存在时才执行命令 exec { "tar -xf /Volumes/nfs02/important.tar": cwd => "/var/tmp", # 表示切换到此目录在执行命令 creates => "/var/tmp/myfile", # 若此目录存在,则不执行命令 path => ["/usr/bin", "/usr/sbin"] # 指明环境变量 } path => # 指定命令搜索的路径,类似于环境变量 path => ['path1','path2',.....]。如果不定义此属性,则使用的命令需使用绝对路径 environment => PATH # 指定执行命令的环境变量 group => # 以哪个组的身份运行 user => # 以指定用户的身份运行 onlyif => # 测试命令。只有此属性指定的命令执行成功,返回状态码为0,才执行资源所定义的命令 exec { "logrotate": path => "/usr/bin:/usr/sbin:/bin", onlyif => "test `du /var/log/messages | cut -f1` -gt 100000" } unless => # 此属性执行的命令的状态码返回值不为0时,才执行资源所定义的命令 exec { "/bin/echo root >> /usr/lib/cron/cron.allow": path => "/usr/bin:/usr/sbin:/bin", unless => "grep root /usr/lib/cron/cron.allow 2>/dev/null" } refresh => # 接受其他资源发来的refresh通知时,默认是重新执行exec定义的command regreshonly => # 仅在收到refrsh通知,才运行此资源 exec { newaliases: path => ["/usr/bin", "/usr/sbin"], subscribe => File["/etc/aliases"], # 此资源发生变化,则执行exec定义的命令 refreshonly => true } returns => # 默认是0,期望的状态返回值,返回非0值时表示命令执行失败 timeout => # The default timeout is 300 seconds。命令执行超时时长 tries => # 命令重试执行次数,默认为1 5、notify # 类似于bash中的echo命令,用于显示信息。 # 属性 message => # 所要发送的消息的内容 name => withpath => `true`, `false` # 显示完整的目标路径 6、cron # 定义任务计划 # 属性 command => "/usr/sbin/logrotate" # 定义执行的命令 ensure => `present`, `absent` # 定义所对应的cron是否存在 hour => # must be between 0 and 23 minute => # must be between 0 and 59 month => # must be between 1 and 12 or the month name (e.g., December). monthday => # must be between 1 and 31 weekday => # must be between 0 and 7,must be the name of the day (e.g., Tuesday). user => # 定义为那个用户的任务计划 name => # 定义cron的名称 target => # 表示存放在那个cron的目录下,默认是root目录下 environment => # 指定运行时的环境变量。 7、package # 管理程序包 # 属性 ensure => `version number`,`latest`,`installed`,`present`,absent` # 所要安装的包的状态 source => # 安装源。可以是本地文件路径或者URL name => # 程序包名 provider => # 包格式 8、service # 管理服务 # 属性 binary => # 指定二进制程序文件路径,如果有服务脚本,则可以使用 "start" 参数、 enable => `true`, `false`, `manual` # 开机是否自动启动。manual表示手动管理 ensure => stopped|running # 期望服务的状态 hasrestart => `true`, `false` # 表明所管理的服务是否能够支持restart操作 hasstatus => `true`, `false` # 表明所管理的服务是否能够支持status参数 name => # 服务名称 path => # 所管理的服务脚本的路径 start => # 如果服务不支持接收start参数,则自己定义如何start操作的命令 stop => restart => status => pattern => # 用于搜索此服务器相关的进程的模式,当脚本不支持rstart/status时,用于确定服务是否处于运行状态 3、示例 1、user、group示例 group {'centos': gid => 2000, ensure => present, } user{'xuekaixin': uid => 2000, gid => 2000, home => '/home/xuekaixin', ensure => present, } 2、file示例 file{'/tmp/mydir': ensure => directory, } file{'/tmp/puppet.file': content => 'xue kai xin.\nxue jin wei.', ensure => file, owner => 'xuekaixin', group => 'centos', mode => '0400', } file {'/tmp/fstab.puppet': source => '/etc/fstab', ensure => file, } file{'/tmp/puppet.link': ensure => link, target => '/etc/fstab', } 3、exec示例 exec{'/bin/echo mizi > /tmp/xuekaixin.com': user => root, group => root, creates => '/tmp/xuekaixin.com', } exec{'/usr/bin/mkdir /tmp/xuekaixin': user => root, group => root, unless => '/usr/bin/test -d /tmp/xuekaixin', } 4、notify示例 notify{'xuekaixin': message => 'Hello Wrold!', } 5、cron示例 cron{'puppet cron': command => '/usr/sbin/ntpdate 172.18.0.1 &> /dev/null', minute => '*/10', ensure => 'present', } cron { logrotate: command => "/usr/sbin/logrotate", user => root, hour => 2, minute => 0 } cron { logrotate: command => "/usr/sbin/logrotate", user => root, hour => [2, 4] } cron { logrotate: command => "/usr/sbin/logrotate", user => root, hour => ['2-4'], minute => '*/10' } 6、paceage示例 package{'telnet': ensure => installed, source => '/root/telnet-0.17-60.el7.x86_64.rpm', provider => rpm, allow_virtual => false, } 7、service示例 package {'nginx': ensure => latest, allow_virtual => false, } service {'nginx': ensure => running, enable => true, hasrestart => true, hasstatus => true, restart => 'systemctl reload nginx.service', } ================================================================================================================================================ 特殊属性 Metaparameters puppet 提供了 before、require、notify、subscribe 四个元参数来定义资源间的相关性。应用的资源名称首字母必须大写,例如:before => User['centos'] 1、before 使用在一个资源的代码块内,表示此资源是在 before 之后指定的资源之前执行。 # 示例 group {'centos': gid => 2000, ensure => present, before => User['xuekaixin'], # 表示此资源在User资源之前执行 } user{'xuekaixin': uid => 2000, gid => 2000, home => '/home/xuekaixin', ensure => present, } 2、require 使用在一个资源的代码块内,表示此资源的执行需要 require 后指定的资源先执行。 -> 符号指定链式通知 # 示例 group {'centos': gid => 2000, ensure => present, } user{'xuekaixin': uid => 2000, gid => 2000, home => '/home/xuekaixin', ensure => present, require => Group['centos'], } # 示例 package {'nginx': ensure => latest, allow_virtual => false, } file {'/etc/nginx/nginx.conf': ensure => file, source => '/root/nginx/nginx.conf', require => Package['nginx'], } service {'nginx': ensure => running, enable => true, hasrestart => true, hasstatus => true, restart => 'systemctl reload nginx.service', require => [Package['nginx'],File['/etc/nginx/nginx.conf']], } 3、notify 通知机制。表示当前属性发生改变,要通知给其他资源。资源之间还可以使用 ~> 符号指定链式依赖 # 示例 package {'nginx': ensure => latest, allow_virtual => false, } file {'/etc/nginx/nginx.conf': ensure => file, source => '/root/nginx/nginx.conf', require => Package['nginx'], notify => Service['nginx'], } service {'nginx': ensure => running, enable => true, hasrestart => true, hasstatus => true, # restart => 'systemctl reload nginx.service', require => [Package['nginx'],File['/etc/nginx/nginx.conf']], } 4、subscribe 订阅。表示当前资源监控其他资源,如果其他资源发生改变,则进行什么操作 5、对于service、exec、mount等类型的资源,还支持refreshed,在应用改变后执行一个后续操作。例如,对于service类型的资源,其 配置文件改变后通常还需要一个重启操作,对于exec类型资源,在任何相关外部条件改变后还需要执行重新执行指定的外部脚本。 ================================================================================================================================================ puppet配置语言 1、变量 2、支持的数据类型 3、表达式 4、service、notify、变量 示例 5、puppet中变量种类 6、条件语句 7、case语句 8、selector语句 1、变量 puppet的变量名称以 "$" 符号开头,赋值操作符号为 "=" 任何正常数据类型(非正则)的值都可以赋予puppet中的变量,如字符串、数字、布尔值、属组、hash以及特殊的undef值(未变量未被复制) puppet中的每个变量都有名称,简短名称和长格式完全限定名称,完全限定名称的格式为 "$scpoe::variable" 2、支持的数据类型 字符型 非结构化的文本字符串,可以使用引号,也可以不用。单引号中的变量不会被替换,双引号的变量会被替换 数值型 可以是整数或者浮点数,但是puppet只会在数值上下文中才会将数值当作数值,其他情况都当作字符串 数组 数组值为中括号 "[]" 中以逗号分隔的项目列表。数组的元素可以是任意数据类型。数组索引从0开始 布尔型 true 、 false if语句测试条件和表达式返回值都是布尔值,空字符串的默认值是空字符串 undef 未被声明的变量的值类型即为undef hash {'1' => 'xue','2' => 'jinjinwei'} 正则表达式 不能赋值给变量。仅能用于有限的几个接受正则表达式的敌方,即接受使用"=~" "!~" 匹配操作符的位置,通常包括case语句中的selector以及 几点名称匹配的位置。 (?:) (?-:) option: i 忽略字符大小写 m 把 "." 当作换行符 x 忽略模式中的空白和注释 if $operatingsystem =~ /^(?i-mx:(CentOS|RedHat))/ { notice("Welcome to $1 linux server") # $1表示前面第一个匹配到的字符串 } 3、表达式 比较操作符 == != < <= > >= =~ !~ in(成员判断) 逻辑操作符 and or ! 算数操作符 + - * / % >> << 4、service、notify、变量 示例 $webserver=nginx # 定义变量 package {$webserver: # 使用变量 ensure => latest, allow_virtual => false, } file {'/etc/nginx/nginx.conf': ensure => file, source => '/root/nginx/nginx.conf', require => Package['nginx'], notify => Service['nginx'], } service {'nginx': ensure => running, enable => true, hasrestart => true, hasstatus => true, require => [Package['nginx'],File['/etc/nginx/nginx.conf']], } 5、puppet中变量种类 自定义变量 facter变量:可直接引用。使用 facter -p 查看 内置变量: 客户端内置 $clientcert $clientversion 服务器端内置 $servername $serverip $serverversion $module_name 6、条件语句 if CONDITION { statement .... } if CONDITION { statement .... } else { statement .... } if CONDITION { statement .... } elsif CONDITION { statement .... } else { statement .... } 示例: if $processorcount=="1" { notice($ipaddress) notice($operatingsystem) } 7、case语句 case CONDITION { case1,...: { statement ...} case2,...: { statement ...} .... default: { statement ...} } case $var { 'Solaris': { notice...} 'RedHat','CentOS': { ...} .... default: { statement ...} } 8、selector语句 CONTROL_VARIABLE ? { case => value1 case => value2 ... default => valueN } 示例: $webserver = $operatingsystem { /(?i-mx:ubuntu|debian)/ => 'apache', /(?i-mx:centos|redhat)/ => 'httpd', } ================================================================================================================================================ puppet类 1、用于公共目的的一组组员,是命名的代码块,创建后可在puppet全局进行调用,类可以被继承。 类的名称只能是小写字母开头、数字或下划线。 2、示例 类的定义 class nginx { $webserver=nginx package {$webserver: ensure => latest, allow_virtual => false, } file {'/etc/nginx/nginx.conf': ensure => file, source => '/root/nginx/nginx.conf', require => Package['nginx'], notify => Service['nginx'], } service {'nginx': ensure => running, enable => true, hasrestart => true, hasstatus => true, require => [Package['nginx'],File['/etc/nginx/nginx.conf']], } } 3、类的声明 {调用} 在manifest文件定义的类不会直接执行,他们需要实现声明后才能被执行。 1、include # 示例 class nginx { $webserver=nginx package {$webserver: ensure => latest, allow_virtual => false, } file {'/etc/nginx/nginx.conf': ensure => file, source => '/root/nginx/nginx.conf', require => Package['nginx'], notify => Service['nginx'], } service {'nginx': ensure => running, enable => true, hasrestart => true, hasstatus => true, require => [Package['nginx'],File['/etc/nginx/nginx.conf']], } } include nginx require 声明可以传递参数的类 class CLASS_NAME($arg1[='value'],$arg2[='value']) { # [=value]表示定义默认值 此处的代码块可以引用变量 } # 示例 class web($webname='nginx'){ package {$webname: ensure => latest, allow_virtual => false, } file {"/etc/nginx/nginx.conf": ensure => file, source => "/root/$webname/$webname.conf", require => Package[$webname], notify => Service[$webname], } service {$webname: ensure => running, enable => true, hasrestart => true, hasstatus => true, require => [Package[$webname],File["/etc/$webname/$webname.conf"]], } } class {'web': webname => 'nginx', } 4、类继承 定义方式: class base_class::class_name inherits base_class{ ................ } # 示例 class web($webname='nginx'){ package {$webname: ensure => latest, allow_virtual => false, } service {$webname: ensure => running, enable => true, hasrestart => true, hasstatus => true, require => [Package[$webname]], } } class web::webserver inherits web { file {"/etc/nginx/nginx.conf": ensure => file, source => "/root/$webname/$webname.conf", require => Package[$webname], notify => Service[$webname], } } include web::webserver 5、覆盖父类集成的某个值 # 示例 class web($webname='nginx'){ package {$webname: ensure => latest, allow_virtual => false, } service {$webname: ensure => running, enable => true, hasrestart => true, hasstatus => true, require => [Package[$webname]], } } class web::webserver inherits web { Package [$webname] { name => tengine, } file {"/etc/nginx/nginx.conf": ensure => file, source => "/root/$webname/$webname.conf", require => Package[$webname], notify => Service[$webname], } } ================================================================================================================================================ puppet模版 1、基于ERB模板的语言,在静态文件中使用变量等编程元素生成使用与多种不同的环境的文本文件(配置语言),用于实现在文本文件中嵌入ruby代码,原来的文本 信息不会改变,但ruby代码会被执行,执行结果将直接替换原来代码。 理解:{在模板文件中使用puppet中的变量,然后在执行资源时模板文件中的代码会被替换为变量的值} <%= Ruby Expression %> # 替换为表达式的值 <% Ruby Expression %> # 仅执行代码,而不注释 模板中可以使用变量,包括uppet的任意变量,但变量名义@字符开头。 2、示例 # 修改模板文件 nginx.conf worker_processes <%= @processorcount %>; # 修改puppet资源定义文件 file {"/etc/nginx/nginx.conf": ensure => file, source => template("/root/$webname/$webname.conf"), require => Package[$webname], notify => Service[$webname], } ================================================================================================================================================ puppet模块 1、将一个任务所需要的文件组织在一个目录结构内。模块实际是一个按约定的、预定义的结构存放了多个文件或子目录的目录。 2、目录结构 module_name/ maniftests/ init.pp # 至少包含一个与当前模块名称同名的类 file/ # 存放静态文件 puppet:///modules/module_name/file_name; templates/ # 模板文件目录 template('module_name/template_filename') lib/ # 插件目录。存储自定义的facts以及自定义类型 tests/ # 当前模块使用帮助文件及示例文件 spec/ # 存储lib目录下定义的插件的使用及示例文件 注意: 1、puppet 3.8及以后的版本中,资源清单文件的文件名要与文件子类名保持一致,例如某子类名为“base_class::child_class”,其文件名应该为child_class.pp; 2、无需在资源清单文件中使用import语句; 3、manifests目录下可存在多个清单文件,每个清单文件包含一个类,其文件名同类名; puppet module search redis # 搜索模块 puppet module install puppet module list puppet module # 模板执行 puppet apply -v --noop -d --test -e "include redis" puppet apply -v --noop -d --test -e "class{'redis::slave':masterip => '172.18.26.1', masterport => '6379'}" ================================================================================================================================================ puppet Master/Agent模式 1、agent默认每隔30分钟向master发送node_name和facts,并请求catalog master验证客户端身份,查找与其相关的site manifest,编译生成catalog并发送给客户端 通信基于ssl协议。 2、master 1、安装包 puppet facter puppet-server 2、配置文件 /etc/puppet/puppet.conf [main] # master和agent都生效的配置 [master] [agent] # 只有agent端生效的配置 puppet config print # 查看puppet默认配置 puppet config modulepath # 查看模块默认的路径 /usr/share/puppet/modules puppet config set server = node1 # 设定某一个参数 puppet master --genconfig # 查看master的默认配置可以保存后进行按需修改 puppet agent --genconfig # 查看agent的默认配置可以保存后进行按需修改 puppet master --genconfig > /etc/puppet/puppet.conf # 生成配置文件 生成之前不能删除或移动原有的puppet.conf 3、启动测试 puppet master -v --no-daemonize 使用服务脚本启动: systemctl status puppetmaster.service 4、签署证书 puppet cert [-h|--help] [-V|--version] [-d|--debug] [-v|--verbose] [--digest ] [] action: list # 查看所有待签署请求 sign [--all] # 签署请求 示例: puppet cert sign node4.xuejinwei.com puppet cert list --all puppet cert clean node4.xuejinwei.com 3、agent # 测试启动agent puppet agent --server=node5.xuejinwei.com --no-daemonize --noop --test --verbose # 生成证书签署请求 puppet agent --server=node5.xuejinwei.com --no-daemonize -v # 列出客户端的证书文件 ls /var/lib/puppet/ssl/ /etc/puppet/puppet.conf server node_naster.com 4、master操作 1、安装所需要的模块 puppet module install 自己创建模块 2、定义site manifest /etc/puppet/manifest/site.pp node 'node1' { include redis } ================================================================================================================================================ puppet 多环境配置 1、默认环境是production; environmentpath = puppet config print environmentpath --sectiion 2、puppet 3.4 之前的版本配置多环境的方法: 各环境配置: /etc/puppet/environments/{production,development,testing} master支持多环境:puppet.conf [master] # modulepath= # manifest= environments = production, development, testing [production] modulepath=/etc/puppet/environments/production/modules/ manifest=/etc/puppet/environments/production/manifests/site.pp [development] modulepath=/etc/puppet/environments/development/modules/ manifest=/etc/puppet/environments/development/manifests/site.pp [testing] modulepath=/etc/puppet/environments/testing/modules/ manifest=/etc/puppet/environments/testing/manifests/site.pp agent端: [agent] environment = { production|development|testing } puppet文件服务器 1、fileserver.conf 生效的结果是结合puppet.conf与auth.conf,用于实现安全配置例如agent能够活不能访问master的那些文件 配置项: # path /etc/puppet/files # 指定路径 # allow * # 允许那个节点 # path ~ ^/file_(metadata|content)/extra_files/ # auth yes # allow /^(.+)\.example\.com$/ # allow_ip 192.168.100.0/24 ================================================================================================================================================