随笔 - 34  文章 - 0  评论 - 0  阅读 - 3774

Ansible:一键部署Keepalived高可用集群(待实践)

使用Ansible工具一键部署Keepalived服务

1.需求分析

使用ansible部署keepalived服务的过程中,需要实现:

1.1 多系统支持

根据不同的系统,自动选择对应的安装方式。可通过相关的环境变量结合 when实现。

1.2 源码安装

考虑到rpm安装的方式会需要依赖一些基础环境,以及版本较低,将采用源码编译的方式进行安装。

1.3 可选版本

为保证适用更多的应用场景,将以环境变量的方式指定版本号,使用时修改变量值为对应版本即可。

1.4 多机支持

支持两个节点以上的集群,以第一个节点作为MASTER,其余的均作为BACKUP

2.编写Ansible Role

2.1 初始化role

创建相关的目录存放对应的yml清单文件

1
$ mkdir -p keepalived-install-role/{files,tasks,vars,templates}

2.2 设置环境变量

keepalived-install-role/vars/main.yml文件中设定相关的环境变量,使用时只需要修改值即可。

1
2
3
4
5
6
7
8
9
10
$ cat keepalived-install-role/vars/main.yml
---
#Keepalived版本
keepalived_version: 2.2.7
#安装目录
install_path: /etc/keepalived
#VIP地址:
virtual_ipaddress: 192.168.2.88/24
#虚拟路由ID号(主备必须一致),每个实例唯一
virtual_router_id: 216

2.3 下载文件

从官网下载源码包,放入keepalived-install-role/files/目录下。

1
2
3
4
$ cd keepalived-install-role/files/
$ wget https://keepalived.org/software/keepalived-2.2.7.tar.gz
$ md5sum keepalived-2.2.7.tar.gz
5f310b66a043a1fb31acf65af15e95bc  keepalived-2.2.7.tar.gz

2.4 编写tasks

keepalived-install-role/tasks目录下创建对应的tasks任务文件。

2.41 在main.yml中导入两个tasks文件
1
2
3
4
cat keepalived-install/tasks/main.yml
---
- include_tasks: host-init.yml
- include_tasks: install-keepalived.yml
2.42 定义主机初始化任务
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
$ cat keepalived-install/tasks/host-init.yml
---
#配置主机环境,如安装依赖包等
 
- name: "安装依赖包(Debian系统)"
  when: ansible_os_family == "Debian"
  apt:
    name:
      - build-essential   #编译所需的基本工具
      - libssl-dev        #可能需要的 SSL 库
      - libnl-3-dev       #libnl 库
      - libnl-genl-3-dev  #libnl-genl 库
    state: present
   
- name: "安装依赖包(CentOS系统)"
  when: ansible_distribution == "CentOS"
  yum:
    name:
      - gcc
      - gcc-c++
      - make
      - openssl
      - openssl-devel
      - iproute
      - libnl
      - libnl-devel
      - libnfnetlink-devel
    state: present
 
#设置环境变量
- name: "收集目标主机IP清单"
  set_fact:
    target_hosts: "{{ ansible_play_hosts | map('extract', hostvars, 'ansible_host') | list }}"
- debug:
    msg: "{{ target_hosts }}"
 
- name: "生成环境变量(集群列表)"
  set_fact:
    nacos_servers: "{{ target_hosts | map('regex_replace', '^(.*)$', '\\1:8848') | join(',') }}"
 
#设定MASTER(第一台host)
- name: "设定MASTER(第一台host)"
  set_fact:
    master_host:  "{{ target_hosts[0] }}"
- debug:
    msg: "MASTER节点为:{{ master_host }}"
 
#查找 internal IP 所在网卡并设置为环境变量
- name: "查找 internal IP 所在网卡"
  shell: "ip a s to {{ ansible_host }} | awk -F ': ' 'NF > 1 {print $2}'"
  register: ip_address_result
- name: "设置变量"
  set_fact:
    network_interface: "{{ ip_address_result.stdout | regex_replace('@.*', '') }}"
- debug:
    msg: "IP对应的网卡为:{{ network_interface }}"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ tree keepalived-install/
keepalived-install/
├── files
│   ├── keepalived-2.2.7.tar.gz
│   └── keepalived.service
├── tasks
│   ├── host-init.yml
│   ├── install-keepalived.yml
│   └── main.yml
├── templates
│   └── keepalived.conf.j2
└── vars
    └── main.yml
 
4 directories, 7 files

定义安装install任务 在keepalived-install/tasks/install-keepalived.yml文件中定义部署keepalived服务的相关任务。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
cat keepalived-install/tasks/install-keepalived.yml
---
#源码编译安装keepalived
#若已经安装,则跳过安装
- name: "检查服务是否安装 <keepalived>"
  commandwhich keepalived
  register: keepalived_check
  ignore_errors: true
 
- name: "判断服务安装则进行安装操作"
  when: keepalived_check.rc != 0
  block:
  - name: "创建安装目录 <{{ install_path }}>"
    file:
      name: "{{ install_path }}"
      state: directory
  - name: "分发安装包"
    unarchive: 
      src: "keepalived-{{ keepalived_version }}.tar.gz"
      dest: "{{ install_path }}"
  - name: "编译并安装Keepalived"
    shell:
      cmd: "./configure --prefix=/usr/local/keepalived"
      chdir: "{{ install_path }}/keepalived-{{ keepalived_version }}"
  - name: "制作并安装Keepalive"
    shell:
      cmd: "make && make install"
      chdir: "{{ install_path }}/keepalived-{{ keepalived_version }}"
 
- name: "分发配置文件"
  template: 
    src: keepalived.conf.j2
    dest: /etc/keepalived/keepalived.conf
 
- name: "启动服务<keepalived>"
  systemd: 
    name: keepalived
    state: started
    enabled: true
    daemon_reload: yes

2.5 定制配置文件模板

基于Jinja2模板文件,根据变量自动配置MASTERBACKUP节点的配置参数,默认将第一个host作为MASTER,其余的均为BACKUP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
cat keepalived-install/templates/keepalived.conf.j2
! Configuration File for keepalived
 
global_defs {
   smtp_server localhost
   smtp_connect_timeout 30
   router_id {{ ansible_host }}
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}
 
# VRRP 实例定义
vrrp_instance VI_1 {
{% if ansible_host == master_host %}
    state MASTER
    priority 100
{% else %}
    state BACKUP
    priority 80
{% endif %}
 
    nopreempt
    interface {{ network_interface }}
    virtual_router_id {{ virtual_router_id }}
 
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
 
    virtual_ipaddress {
        {{ virtual_ipaddress }}
    }
    track_script {
        check_nginx
    }
}
 
#健康检查
vrrp_script check_nginx {
    script "/etc/keepalived/check_nginx.sh"
    interval 5
    weight -60
    fall 2
    rise 2
}

:相关参数可根据实际业务环境进行调整!  

3. 调用role部署任务  

在编写上述role完成后,就可以调用roles进行实际的部署应用了。

  • 定义hosts 在hosts中定义目标主机有哪些,即安装keepalived的主机。
1
2
3
4
5
6
7
8
9
10
11
cat /etc/ansible/hosts
[lidabai]
192.168.2.61
192.168.2.62
192.168.2.63
 
[lidabai:vars]
ansible_ssh_user=root
ansible_ssh_pass=1
ansible_ssh_port=22
#ansible_python_interpreter=/usr/bin/python2

调用role  

1
2
3
4
5
6
cat run-keepalived.yml
---
- hosts: lidabai
  become: yes
  roles:
  - keepalived-install

运行  

1
$ ansible-plabook run-keepalived.yml

——————————————————————————————————————————————————————————————————————————

                                                                                                                         无敌小马爱学习

posted on   马俊南  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示