puppet概述

来源:互联网 发布:linux suspend 命令 编辑:程序博客网 时间:2024/06/05 17:36


运维自动化概述

运维自动化目标:
 bootstrap --> configuration(目标) --> command and control
  bootstrap:实现自动化部署基础操作系统和软件。
   实现工具:PXE、cobbler、
  configuration:配置服务相关属性(开机自启动、计划任务)和操作系统中更精细的管理(用户、组、文件系统)以实现我们期望的目标条件。
   能够使得主机处于目标状态,但难以实现批量的自动化的配置。
            实现工具:puppet、saltstack(基于python开发)、chef、cfengine。
             示例:能够实现目标主机上是不是有指定用户,用户的用户名是什么,该用户对应的密码是什么,这个用户的登陆密码。
  command and control:运行命令并执行一些控制机制。
         实现工具:ansible、fabric。
         
puppet的运行机制:
 工作与master/agent模型下。
  puppet需要在认证之后才能对客户端主机进行配置(否则配置信息就会导致泄露),因此双方需要实现互相认证,因此双方基于一种加密的方式进行通信。
 功能:在操作系统已经安装好的情况下,主动在两台的服务器上各自安装Nginx和Tomcat,并配置好Nginx服务器,使得Nginx能够主动将前端的动态页面的请求反向代理至后段的Tomcat服务器。
  前提:
   1、puppet基于SSL进行认证,这个证书依赖于主机名(依赖主机名的好处还在于当IP为动态获取的,但证书仍然依赖于主机名实现认证)。
   2、被管控主机需要安装操作系统并配置IP地址和与之对应的主机名。
 
 服务器端:安装puppt master服务并启动。
 客户端:安装puppet agent,并启动,客户端主机。

帮助信息:
 puppet describe <file|user|group|package|service|exec|cron|notice>
 
文件的定义:
 file {"title":
  type => value,
 }
  ensure:确保指定资源的目标状态,其值可以为present、absent、file、directory、link。
  path:创建文件的位置。
  target:创建链接时的源文件的位置。
  content:指定创建文件的内容。
  source:复制文件时,指定源文件的位置。
  force:强制执行,其值为true或false。
  mode:指定创建文件时的权限,777,755,666。
  owner:指定文件创建时的拥有人。
  group:指定文件创建时的拥有组。
  
 练习:复制一个文件,源文件为/var/log/messages,复制后的文件存放在/tmp目录下,命名为abc,如果/tmp目录下有abc的文件则强制覆盖。
 # vim test2.pp
  file {"/tmp/abc":
   source => "/var/log/messages",
   force  => true,
  }
 # puppet apply test2.pp
 

用户:
 ensure:确保指定名称的用户是否存在,其值为present、absent。
 name:定义用户名。
 uid:指定用户的ID号。
 gid:指定用户的GID号。
 shell:定义用户的默认shell。
 home:定义用户的家目录。
 password:定义用户的密码,此处的密码为明文密码加密后的字符串,加密后的字符串应该写在单引号内。
  openssl passwd -1 -salt `openssl rand -hex 4`
 system:定义创建的用户是否为普通用户,false为普通用户,而true为系统用户。
 
 创建tom用户,id号为444,shell类型为tcsh。
  user {"tom":
   ensure  => present,
   uid   => 444,
   shell   => "/bin/tcsh",
   password => "redhat",
  }
 练习:添加一个用户,用户名为test_user,为系统用户,id号为400,默认shell为/bin/csh。
  user {"test_user":
   ensure  => present,
   uid   => 400,
   shell   => "/bin/csh",
   system  => true,
   password => "$1$12345678$0ME5N6oDyoEAwUp7b5UDM/",
  }

组:
 ensure:present(存在),absent(不存在)。
 name:定义组名。
 gid:定义组ID。
 system:是否为系统组。
 
 练习:添加一个系统组,组名为test_group,组ID为444。
  group {"test_group":
   ensure => present,
   gid  => 444,
   system => true,
  }
  
package:
 ensure:确保指定的名称的软件处于某个目标状态,present(installed),absent。
 name:指定软件包的名字。
 provider:rpm、yum,msi。
 source:指定软件包的位置。
  package {"mysql":
   ensure => installed,
   provider => "msi",
   source => "D:\software\mysql-5.6.32.msi",
  }
 
 
 练习:在某主机上安装mysql的服务。
  package {"mysql-server":
   ensure => installed,
  }

service:
 ensure:确保服务处于哪种目标状态,stoped、running,true、false。
 enable:定义服务是否开机自启动,true、false。
 name:定义服务的名字。
 
  service {"mysqld":
   ensure => running,
   enable => true,
  }

exec:
 command:定义要执行的命令。
 path:对应命令所在的目录,多个路径间已冒号分隔。
  /bin:/sbin
 user:以哪个用户的身份去执行。
 group:以指定的组的身份去执行命令。
 
  练习:在/tmp目录下创建一个文件,文件的名字为hello,并且以test_user的身份和test_user组的身份去执行。
  


cron:定义计划任务。
 ensure:确保计划任务是否启动,present、absent。
 command:定义计划任务中要执行的命令或脚本。
 environment:定义命令查找的目录。
 minute:
 hour:
 monthday:1-31
 month:定义月份。
 weekday:定义周几。
 user:定义计划任务以哪个用户的身份去执行。
 name:为计划任务命名。
 
 cron {"ntpd":
  ensure =>present,
  command =>"ntpdate 192.168.1.250 &> /dev/null"
  environment =>"PATH=/bin:/sbin:/usr/bin:/usr/sbin",
  hour  =>['6-18/2'],
 }
 
notify:定义通知。
 message:定义通知的内容。
 
 nofity {"notice":
  message => "text change",
 }


安装httpd的软件包并启动httpd的服务。
 require:依赖于。
 before:定义当前的资源在另一个资源之前执行。
  package {"httpd":
   ensure => installed,
  }
  service {"httpd":
   ensure => running,
   enable => true,
   require => Package['httpd'],
  }

类:
class mysqld {
 package {"httpd":
  ensure => installed,
 }
 service {"httpd":
  ensure => running,
  enable => true,
  require => Package['httpd'],
 }
}

 基类:父类,所有子类的父类。
 
定义模块:
 1、创建模块所需的目录。
  # cd /etc/puppet/modules
  # mkdir httpd/{manifests,files,lib} -pv
 
 2、创建功能模块的基类。
  # cd httpd/manifests
  # vim init.pp
   class httpd {
    package {"httpd":
     ensure => present,
    }
   }

 3、调用模块。
  # puppet apply -v -d -e "include httpd"
  
puppet_master:
1、创建基类以及要使用的子类。

# cd /etc/puppet/modules
# mkdir nginx/{manifests,files,lib} -pv
# cd nginx/manifests
# vim init.pp
 class nginx {
  package {"nginx":
   ensure => installed,
  }
 }
# vim web.pp
 class nginx::web inherits nginx {
  file {"nginx":
   ensure => present,
   source => "puppet:///modules/nginx/nginx_web.conf",
   force  => true,
   path  => "/etc/nginx/nginx.conf",
  }
  service {"nginx":
   ensure => running,
   enable => true,
   require => File['nginx'],
  }
 }
# cp /tmp/nginx_web.conf /etc/puppet/modules/nginx/files/

2、定义节点文件。
# cd /etc/puppet/manifests
# vim client.example.com.pp
 node 'client.example.com' {
  include nginx::web
 }
# vim site.pp
 import "client.example.com.pp"

3、创建证书文件并启动puppetmaster服务。
# puppet master --genconfig >> /etc/puppet/puppet.conf
# puppet master --no-daemonize -v -d (让它运行在前台,完成后直接ctrl+c退出)
# service puppetmaster start

puppet_agent:
1、测试连接服务器端主机。
# puppet agent --server server.example.com --noop --test -v -d

puppet_master:
1、为agent端签署证书。
# puppet cert list
# puppet cert sign client.example.com

2、查看当前主机上有哪些已签署的证书。
# puppet cert --list --all

puppet_agent:
1、编辑配置文件,指定master的主机名。
# vim /etc/puppet/puppet.conf
 [main]
 server = server.example.com
 [agent]
 listen = true

# vim /etc/puppet/auth.conf
 allow *

2、启动agent端的服务。
# service puppet start

主动推送:
# puppet kick -d --host client.example.com






 
  
  


  

0 0