Puppet自编模块(二):keepalived

一、模块说明

    keepalived是为了实现nginx的高可用性,在安装了nginx的两台机子上分别部署keepalived-master和keepalived-slave,会给两台机子的eth0增加两个虚拟ip(10.188.1.51,10.188.1.52),将网站域名的DNS指向这两个VIP,或者是出口路由器端口映射向这两个VIP

当任一台机子故障或chk_nginx.sh检测到其主机上的nginx故障时,VIP都会自动漫游到另一台正常的机子,可以扩展到更多台机子。

二、目录结构

三、代码展示

1、files目录

    chk_nginx.sh     #检查nginx服务状态的脚本

#!/bin/sh
# check nginx server status
A=`ps -C nginx -no-header |wc -l`
if [ $A -eq 0 ];then
/usr/sbin/nginx
sleep 3
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi

keepalived-1.2.7.tar.gz     #安装包下载 http://www.keepalived.org/software/keepalived-1.2.7.tar.gz

2、manifests目录

init.pp

class keepalived {
    include keepalived::install,keepalived::config,keepalived::service
}

install.pp

class keepalived::install {
  Exec{  path => [‘/usr/bin‘,‘/usr/sbin‘,‘/bin‘] }
  package { [‘openssl-devel‘,‘popt-devel‘]:
     ensure => installed,
     before => Exec[‘install‘],
  }
  file { ‘/etc/keepalived‘:
      ensure  => directory,
  } 
  file { ‘keepalived‘:
      name    => ‘/usr/local/src/keepalived-1.2.7.tar.gz‘,
      ensure  => file,
      source  => ‘puppet:///modules/keepalived/keepalived-1.2.7.tar.gz‘,
      owner   => root,
      group   => root,
      mode    => ‘0640‘,
      require => Package[[‘openssl-devel‘,‘popt-devel‘]],
  }
  exec { ‘tar‘:
      command     => ‘tar -zxf keepalived-1.2.7.tar.gz‘,
      cwd         => ‘/usr/local/src‘,
      refreshonly => true,
      subscribe   => File[‘keepalived‘],
      before      => Exec[‘install‘],
  }
  exec { ‘install‘:
      command     => ‘/bin/bash configure && make && make install‘,
      cwd         => ‘/usr/local/src/keepalived-1.2.7‘,
      creates     => ‘/usr/local/sbin/keepalived‘,
  }
}

config.pp    # $keepalived_conf参数可在foreamen的主机属性里设置,或节点site.pp里设置

class keepalived::config {  
    case $keepalived_conf  { 
        master: {
            file { ‘/etc/keepalived/keepalived.conf‘:
                ensure  => file,
                owner   => root,
                group   => root,
                mode    => 400,
                content => template("keepalived/keepalived-master.conf.erb"),
                notify  => Class[‘keepalived::service‘],
                require => Class[‘keepalived::install‘],
            }
        }
        slave: {
            file { ‘/etc/keepalived/keepalived.conf‘:
                ensure  => file,
                owner   => root,
                group   => root,
                mode    => 400,
                content => template("keepalived/keepalived-slave.conf.erb"),
                notify  => Class[‘keepalived::service‘],
                require => Class[‘keepalived::install‘],
            }  
        }
    }
    file { "/usr/sbin/keepalived":
        ensure  => link,
        target  => "/usr/local/sbin/keepalived",
        owner   => root,
        group   => root,
        mode    => 755,
        require => Class[‘keepalived::install‘],
    }
    file { "/etc/rc.d/init.d/keepalived":
        ensure  => link,
        target  => "/usr/local/etc/rc.d/init.d/keepalived",
        owner   => root,
        group   => root,
        mode    => 755,
        require => Class[‘keepalived::install‘],
    }
    file { "/etc/sysconfig/keepalived":
        ensure  => link,
        target  => "/usr/local/etc/sysconfig/keepalived",
        owner   => root,
        group   => root,
        mode    => 755,
        require => Class[‘keepalived::install‘],
    }
    file { ‘/usr/local/nginx‘:
        ensure  => directory,
        before  => File[‘/usr/local/nginx/chk_nginx.sh‘],
    } 
    file { ‘/usr/local/nginx/chk_nginx.sh‘:
        ensure  => file,
        owner   => root,
        group   => root,
        mode    => 755,
        source  => "puppet:///modules/keepalived/chk_nginx.sh",
        require => Class[‘keepalived::install‘],
    }
}

service.pp

class keepalived::service {
    service { ‘keepalived‘: 
        ensure     => ‘running‘,
        enable     => ‘true‘,
        hasrestart => ‘true‘,
        hasstatus  => ‘true‘,
        require    => Class["keepalived::install"],
    }
}

3、templates目录

keepalived-master.conf.erb    #根据情况修改邮箱、密码、IP

! Configuration File for keepalived
global_defs {
notification_email {
        [email protected] 
   }
   notification_email_from [email protected] 
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL 
}
vrrp_script chk_nginx {
    script "/usr/local/nginx/chk_nginx.sh"
    interval 2
    weight 2
}
track_script {
    chk_nginx
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1 
    authentication {
        auth_type PASS
        auth_pass mypassword
    }
    virtual_ipaddress {
        10.188.1.51
    }
}
vrrp_instance VI_2 {
    state BECKUP
    interface eth0 
    virtual_router_id 52
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass mypassword
    }
    virtual_ipaddress {
        10.188.1.52
    }
}

    keepalived-slave.conf.erb   

! Configuration File for keepalived
global_defs {
notification_email {
        [email protected] 
   }
   notification_email_from [email protected] 
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL 
}
vrrp_script chk_nginx {
    script "/usr/local/nginx/chk_nginx.sh"
    interval 2
    weight 2
}
track_script {
    chk_nginx
}
vrrp_instance VI_1 {
    state BECKUP
    interface eth0
    virtual_router_id 51
    priority 99
    advert_int 1 
    authentication {
        auth_type PASS
        auth_pass mypassword
    }
    virtual_ipaddress {
        10.188.1.51
    }
}
vrrp_instance VI_2 {
    state MASTER
    interface eth0 
    virtual_router_id 52
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass mypassword
    }
    virtual_ipaddress {
        10.188.1.52
    }
}

    

四、Foreman配置

    导入模块

我这里在配置-配置组中将nginx和keepalived放在了一个组里,然后编辑主机,给其分配该组:

给主机添加一个参数,指定其使用哪个配置文件:

搜索添加了模块的nginx主机,手动运行Puppet:


五、查看结果

在客户端主机上查看VIP

[[email protected] ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu16436 qdisc noqueue state UNKNOWN
   link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
   inet 127.0.0.1/8 scope host lo
   inet6 ::1/128 scope host
      valid_lft forever preferred_lft forever
2: eth0:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen1000
   link/ether 72:cc:7f:ea:b9:97 brd ff:ff:ff:ff:ff:ff
   inet 10.188.1.32/8 brd 10.255.255.255 scope global eth0
   inet 10.188.1.51/32 scope global eth0
   inet 10.188.1.52/32 scope global eth0
   inet6 fe80::70cc:7fff:feea:b997/64 scope link
      valid_lft forever preferred_lft forever

可以看到eth0接口上多了两个VIP,接下来可以实验停止某台nginx或关机,观察VIP的变化。

时间: 2024-10-20 22:30:14

Puppet自编模块(二):keepalived的相关文章

Puppet自编模块(一):nginx

说明:前面已经有六编文章分别介绍了几个模块以及一些资源的应用,"Puppet自编模块"系列是进阶实战编,有不明之处或好的优化建议或有错误的地方欢迎回复. 一.模块说明     Nginx反向代理服务.缓存服务.负载均衡服务. 二.目录结构 三.代码展示 1.files目录 conf.d    #其下存放nginx的配置文件,根据环境不同使用不同代码,也可以使用puppet的environments技术,本人暂未研究. DeployPub     #生产环境的配置文件 DeployTes

Puppet自编模块(三):redis

一.模块说明 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. 数据持久化有快照方式和日志追加方式,这里使用快照方式,定期将数据保存在dump.rdb文件中 配置主从同步,可让多个slave分摊读请求的负载,也可在master禁用数据持久化,减轻负担,只在slave配置持久化. 二.目录结构 三.代码展示 1.files目录 redis    #redis服务脚本 #!/bin/sh # chkconfig

linux运维自动化之puppet简单应用(二)

上篇博客介绍了在单机环境下的puppet应用,这次我们基于C/S模式来介绍下puppet! 一.实验环境 服务器角色 IP地址 安装软件 主机名 服务器端 172.16.8.1 puppet-server www.gulong.com 客户机端 172.16.8.2 puppet node1.gulong.com 客户机端 172.16.8.3 puppet node2.gulong.com 三台主机时间同步: #ntpdate 172.16.0.1 三台主机可以相互解析: # vim /etc

socket编程之二:两种链接类型upd和upd

前面一篇文章说到了一些计算机网络的基础知识,引入了socket,从这节开始,就进入正题了. 一 概率 TCP:Transimission Control Protocol传输控制协议. UPD:User Datagram Protocol用户数据包协议. 两者都属于上一篇文章说的OSI模型中的第四层--传输层的协议. 两者相比: TCP协议面向连接,UDP协议面向非连接:(链接) TCP协议传输速度慢,UDP协议传输速度快:(速度) TCP有丢包重传机制,UDP没有:(重传) TCP协议保证数据

常用模块二---time--random--collections--json--pickle--shelve

常用模块二 ================= collections 模块 ================== ========= namedtuple 可以命名的元组 ============from collections import namedtuple Point=namedtuple('Point',['x','y']) p=Point(1,2)circle=namedtuple('Circle',['x','y','r'])c=circle(1,2,1)print(p.x)pr

常用模块二(configparser

阅读目录 常用模块二 hashlib模块 configparse模块 logging模块 常用模块二 返回顶部 hashlib模块 Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 什么是摘要算法呢?摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示). 摘要算法就是通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest,目的是为了发现原始数据是否被人篡改过. 摘要算法之所以能指出数

.Net并行编程之二:并行循环

本篇内容主要包括: 1.能够转化为并行循环的条件 2.并行For循环的用法:Parallel.For 3.并行ForEach的用法Parallel.ForEach 4.并行LINQ(PLINQ)的用法AsParallel() 5.并行中断与并行停止的用法与区别 6.外部控制循环取消的方法(Break,Stop) 7.处理循环体中抛出的异常 8.小循环体的分区并行方法:Parallel.ForEach 9.最大并行度的控制,Parallel.For,Parallel.ForEach 10.在循环体

Python - 模块(二)

目录 Python - 模块(二) re re下面的方法 logging os Python - 模块(二) re re模块提供了正则表达式的相关操作 主要字符介绍: . 通配符,除了换行符之外的任意字符 ^ 匹配字符串的开始 $ 匹配字符串的结尾 关于次数的: * 按紧挨着的字符重复无数次, 重复零次或更多次 + 1到无穷次, 重复一次或更多次 ? (0,1) 重复零次或一次 {n} 重复n次 {n,} 重复n次或更多次 {n,m} 重复n到m次 其他的: [] 字符集 | 或 () 分组 \

python中几大模块二

python中几大模块二 sys模块 sys模块也是python种一个非常强大的模块,功能非常的多,这里我其实也没接触到几个,暂时记录一下目前常用的几个功能函数. sys.argv 这个函数的功能是在程序外部向程序内部传递参数 .例如: import sys print(sys.argv[:]) print(sys.argv[0]) print(sys.argv[1]) print(sys.argv[2]) print(sys.argv[3]) #外部调用解释器执行该文件 python test