菜鸟学Linux 第109篇笔记 ansible puppet



内容总览

bootstrap

ansible Properties

ansible其它配置方式

puppet 简介

puppet: IT基础设施自动化管理工具

puppet 工作模式

puppet 层次

puppet 的核心组件manifests

puppet 命令格式

puppet 定义资源格式

puppet 常用资源类型(user,group,exec,file,cron,notify,package,service后两个下节写)

        配置心得





bootstrap --> configuration (目标状态) --> command and control


bootstrap: pxe, cobbler, 虚拟化环境下的部署方式(xen, kvm)

configuration: puppet, saltstack(python), chef, cfengine

command and control: ansible(轻量级), fabric, func



Os Provisioning

PXE, cobbler

Os config

cfengine, puppet, saltstack, chef

Deployment

func(ssl), fabric(python, ssh), ansible



ansible Properties

No Agents

No Server

No additional PKI

Modules in any language

YAML, not code


ansible

此软件可以实现远程在多台主机上同时运行相同的命令,它所传输命令的方式是基于ssh来传输的

所以要事先最好配置好基于密钥通信与要配置的客户端之间


安装

ansible-2.2.1.0-1.el6.noarch.rpm

libyaml-0.1.3-4.el6_6.x86_64.rpm

python-crypto2.6-2.6.1-2.el6.x86_64.rpm

python-httplib2-0.7.7-1.el6.noarch.rpm

python-jinja2-26-2.6-3.el6.noarch.rpm

python-keyczar-0.71c-1.el6.noarch.rpm

python-six-1.7.3-1.el6.centos.noarch.rpm

python34-3.4.5-1.el6.x86_64.rpm

python34-libs-3.4.5-1.el6.x86_64.rpm

python34-PyYAML-3.11-2.el6.x86_64.rpm

PyYAML-3.10-3.1.el6.x86_64.rpm

sshpass-1.06-1.el6.x86_64.rpm

(有几个包非常难找呵呵 可以上此网站下载 pkgs.org)


2. 配置基于密钥通信

# ssh-keygen -t rsa

# ssh-copy-id -i /root/.ssh/id_rsa.pug root:IP

IP要使用现实中配置的远程IP


3. 编辑配置文件/etc/ansible/hosts

# vim /etc/ansible/hosts

将其要一起配置的IP添加到最后

格式

[test]

IP1

IP2

(现实配置要使用相对应的IP)


4. 使用ansible来配置客户端格式

ansible <host-pattern> [-m module_name] [-a args] [options]


如: 

# ansible test -a 'date'

(test是上边配置文件定义的一个区域,即此区域里配置的IP都会执行date命令)


5. 使用模块

ansible的所有在客户端执行的命令或安装等配置都是基于模块的,

可以使用ansible-doc -l来查看相应模块的具体使用方式



ansible其它配置方式

ansible-playbook

类似shell脚本,可以实现运行某个文件,此文件定义了要执行的命令或安装的软件等

一系列对客户端的操作,然后对其执行,不同的是其格式和shell脚本有区别


如 为所指定的客户端都安装httpd程序,并将本地的配置文件复制到客户端上


# vim test.yaml

- hosts: all

 remote_user: root

 tasks:

  - name: install httpd

   yum: name=httpd state=present

  - name: copy configuration file

   copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf


(需要注意的是文件结尾名字必须为yaml)

配置格式的含义

- hosts: 指定要配置给哪一个区域的主机是在/etc/ansible/hosts中定义的

 remote_user: 指定的是要以哪个用户的身份在远程主机端运行命令

 tasks: 表示此下段为要执行的任务

   -name: 注释段 用来显示执行命令的含义

   yum: 这个就是模块 后边的参数就是该模块需要指定的参数





puppet 简介

是一个c/s架构的软件,s端有其所定义的c端的执行码,c端每隔一段时间会去s端请求是否有自己

需要执行的代码,c端在请求时也会把自己的状态报告给s端,说点大家容易懂一些的话哈哈, 它

当此软件的客户端和服务器端配置好后,服务器端已经为客户机配置好其所需要执行的命令或安装

的软件名,或参数调整等,客户端只需要连接网络访问服务器端后,此台电脑不需要任何人为操作

便可自己自动布署服务器端所定义的操作,或需要安装的软件等。此软件适合用在大规模的自动化

布署环境中。

简要来讲 puppet所实现的功能ansible全都可以操作,区别在于,puppet是事先已经定义好所有的

操作,客户端只需要来服务器拉取即可,而ansible需要自己来手动去执行代码,这样应该好理解



puppet: IT基础设施自动化管理工具

整个生命周期

provisioning

configuration

orchestration

reporting


www.puppetlabs.org

作者:Luke Kanies, PuppetLabs


puppet

master/agent

master: puppet server

agent: 真正执行相应管理操作的核心部件:周期性地去master请求与自己相关的配置



puppet 工作模式

声明性、基于模型

定义:使用puppet配置语言定义基础配置信息

模拟:模拟测试运行

强制:强制当前节点与定义的目标状态保持一致

报告:通过puppet api将执行结果发送给接收者



puppet 层次

Resource Abstraction Layer 资源抽象

Transactional Layer 事务

Configuration Language


资源抽象层

资源类型:例如用户、组、文件、服务、cron任务等等

属性及状态 与其 实现方式分离

期望状态



puppet的核心组件:资源

资源清单:manifests


安装

agent: puppet, facter (安装如下包及其所依赖的包)

facter-2.4.6-1.el6.x86_64.rpm

hiera-1.3.4-1.el6.noarch.rpm

puppet-3.8.7-1.el6.noarch.rpm

puppet-server-3.8.7-1.el6.noarch.rpm

ruby-augeas-0.4.1-1.el6.x86_64.rpm

ruby-shadow-1.4.1-2.el6.rf.x86_64.rpm

rubygem-json-1.4.6-1.el6.x86_64.rpm

master: puppet-server



puppet命令格式

Usage: puppet <subcommand> [options] <action> [options]


获取帮助方法 # puppet help

获取资源帮助 # puppet describe --list

# puppet describe RESOURCE

describe          Display help about resource types



puppet定义资源格式

type {'title':

attribute1 => value1,

attribute2 => value2,

...

}


要点:

1. type必须小写

2. title在同一类型下必须唯一

3. 属性定义完成后要加逗号,最后一个属性可省略逗号

4. ensure一般要有,表示此配置是添加还是删除



常用资源类型

user, group, file, package, service, exec, cron, notify



例:使用本地定义一个manifests 添加组和用户

# vim /root/resource/test1.pp

group {'puppetg':

gid => 2000,

ensure => present,

name => 'puppetg'

}


user {'puppetuser':

gid => 2000,

uid => 2000,

home => '/home/puppetuser',

shell => '/bin/bash',

password => '$1$1234$/UWlwuVLGacuqMdm2P7KY1',

ensure => present

}

本地应用刚刚编写好的manifest

# puppet apply test1.pp



常用资源类型属性解析

group

查询方式 # puppet describe group

管理组资源

常用属性

name:组名,NameVar

gid: GID

system: true,false是否为系统组

ensure: present,absent

members: 组内成员


user

查询方式 # puppet describe user

管理用户

常用属性

comment: 注释信息

ensure: present, absent

expiry: 过期期限

gid: 基本组id

groups: 附加组

home: 家目录

shell: 默认shell

name: NameVar

system: 是否为系统用户,true|false

uid: UID

password:


files

查询方式 # puppet describe file

管理文件及其内容、从属关系以及权限,内容可通过content属性直接给出

也可通过source属性从远程服务器路径下载生成

指明文件来源

content: 直接给出文件内容,支持\n, \t

source: 从指定位置下载文件

ensure: file, directory, link, present, absent

常用属性

force: 强制运行,如果该目录下有此文件或者目录直接删除并创建true, false

group: 属组

owner: 属主

mode: 权限 a=r, 0664, ug+w 支持8进制格式权限

path: 目标路径

source: 源文件路径,可以是本地路径,也可以使用

puppet:///modules/module_name/file_name

target: 链接文件 当ensure为'link'时 target表示path指向的文件是链接文件

此时content及source属性自动失效


例: 创建files的manifests文件

# vim test2.pp

file{'/tmp/pupdir':

ensure => directory,

# 此上为创建目录

file{'/tmp/file1':

content => 'this is pupet file\nSecond line',

ensure => file,

owner => 'puppetuser',

group => 'puppetg',

mode => 0400,

}

# 此上为创建文件,并添加content所添加的字符,文件的权限和属组主

file{'/tmp/file2':

source => '/etc/fstab',

ensure => file,

}

# 此上也是添加一个文件,只是文件的内容是引用source所指向的文件的内容

file{'/tmp/link':

ensure => link,

target => '/tmp/file2',

}

#此上为添加一个链接文件



exec

查询使用帮助 # puppet describe exec

运行一外部命令:命令应该具有“幂等性”;

幂等性:

1. 命令本身具有 幂等性

2. 资源有onlyif, unless, creates等属性以实现命令的条件式运行

3. 资源有refreshonly属性,以实现只有订阅的资源发生变化时才执行。


command: 运行的命令 NameVar

creates: 此属性指定的文件不存在时才执行此命令

cwd: 在此属性指定的路径下运行命令

user:

group: 以指定组运行此命令

onlyif: 给定一个测试命令,仅在此命令执行成功,即返回状态码为0,才运行command

unless: 给定一个测试命令,其返回值不为0时执行command所定义的命令

refresh: 接受到其它资源发来的refresh通知时,默认是重新执行exec定义的command

refresh可改变这种行为,即可指定仅在refresh时所运行的命令;

refreshonly: 仅在收到refresh通知,才运行此资源

returns: 期望的状态返回值,返回非此值时表示命令执行失败,默认为0

tries: 尝试执行的次数

timeout: 超时时长

path: 指明命令的搜索路径,其功能类似PATH环境变量,其值通常为列表

['path1','path2',...],如不定义,必须给定命令的绝对路径


例:  执行命令echo 并添加到某文件, 当配置当在何时才能执行此命令

exec {'echo command1 > /tmp/cmd1.txt':

user => root,

group => root,

creates => '/tmp/cmd1.txt',

path => ['/bin'],

}

# creates直接可以判断文件是否存在

exec {'echo command2 > /tmp/cmd2.txt':

user => root,

group => root,

path => ['/bin','/usr/bin'],

unless => 'test -e /tmp/cmd2.txt',

}

# 此种方式是unless所定义的命令执行的状态返回值不为0时才执行exec的命令



notify

查询使用帮助 # puppet describe notify

核心属性

message: 要发送的消息内容,NameVar


例:

# vim test4.pp

notify{'This is a notify':}

# 执行时会直接输出此条信息

# puppet apply -v test4.pp



cron

查询使用帮助 # puppet describe cron

管理cron任务

常用属性

ensure: present, absent

command: 要运行的job

hour:

minute:

month:

monthday:

weekday:

name:

user:运行的用户

environment:运行时的环境变量


例:

# vim test5.pp

cron {'update time':

command => '/usr/sbin/ntpdate 192.168.11.1',

ensure => present,

minute => '*/15',

}

含义:定义一个任务每15分钟执行一次, 

ensure 为present表示添加此条任务 当为absent 你懂得呵呵


# puppet apply test5.pp



配置心得

1. 定义exec时命令的路径path需要定义,如未定义则命令执行需要指定绝对路径

2. puppetlabs.com网站下载puppet需要找到doc>安装向导,然后往下找里边有yum源路径

(有企业版了,所以开源版的软件连接藏得很深呵呵,,你懂得)

3. yum.repo.d里所定义的yum源如果是光盘的centos6分两个DVD,自己手动将其合并为一个

Packages目录里,然后再将其制作成ftp://user:passwd@IP/PATH

(为何如此做是因为有的包放在第二个光盘里,无法使用yum来安装使其解决依赖关系)