|
|
楼主 |
发表于 2025-12-22 23:44:32
|
显示全部楼层
一:Ansible Playbook示例
" E" G" a, h8 ?9 A- ^# D* U. J4 T---' i8 q! f! H; `" P# C
# ansible-playbook -i inventory ceph-deploy.yml
4 o( l& I1 G, x8 {. A $ d( ]! Q8 s! j$ G, x3 h
- name: 部署 Ceph 集群基础组件2 n. ]/ V/ T/ V; i2 d
hosts: mons,mgrs,osds # 目标主机分组' ?8 U: _5 ?. ?' S+ Y% H, {# b
become: yes # 使用 root 权限8 H( B! g8 s+ {0 ]) K
vars:
5 }: R8 d; v2 d' l A9 Q6 g ceph_cluster_name: my-cluster # 集群名称
1 s$ r e( a3 N+ | {+ c. N ceph_fsid: "{{ lookup('password', '/dev/null chars=hex,ascii_letters length=32') }}" # 自动生成唯一集群ID
! ~, Z6 b, ?/ |; n5 E. W5 Q) ? ceph_mon_group_name: mons # Monitor 主机组名称& T5 k( D: X# A1 l1 o& x& n
ceph_mgr_group_name: mgrs # Manager 主机组名称. ?) M/ P- J9 S) K b1 {, l
ceph_public_network: 192.168.1.0/24 # 公共网络, S0 g" C( q! b( p, m
ceph_cluster_network: 10.0.0.0/24 # 集群内部网络
: c% b$ w* H4 o- D. i) p% E 1 s' b7 u% A+ l' h8 o
tasks:- C- |0 b5 g6 Y7 s& o& X
- name: 安装 Ceph 基础软件包
1 m1 w& i# B! [: X1 c" x package:7 N% ?+ k; m) _0 t/ [
name: 4 B3 F! b0 x! o
- ceph-mon
9 W' c( t2 @! |! R( I# V - ceph-mgr% r$ _8 ?: K; x; v! W
- ceph-osd
* j7 X& ]2 Y7 a+ B state: present1 @5 b0 g, E, B9 E% b: D
8 y/ {# l- }' {( Q0 g+ M
- name: 初始化 Monitor 节点0 _3 X5 w$ X" W7 m2 Y- p, }; k& f
command: ceph-mon --cluster {{ ceph_cluster_name }} --mkfs -i {{ inventory_hostname_short }}
, U4 d5 @6 e* W ~- [2 v9 q* i when: inventory_hostname in groups[ceph_mon_group_name]* V7 C' i. m) w( \5 ]
" \" ~4 l( [4 _1 r3 N6 ?0 a9 t- name: 部署 OSD 节点
1 o9 _! O3 x' O hosts: osds3 R6 E4 p$ ~5 z! U" d* |
vars: O! W* I7 v6 j, A
osd_devices: # OSD 磁盘配置4 U. d) J; e$ C
- /dev/sdb
! v' d6 o) D. ^ t+ D( L6 B n" `3 E - /dev/sdc
B9 L e# J% E& e2 z- g/ O osd_journal_size: 5120 # 日志分区大小(MB)
' y+ ^6 O9 a( m, i" v" p1 G tasks:$ k8 A8 g6 ]# Q( ?/ x5 y
- name: 创建 OSD
& R, ^4 T- X: h8 a command: ceph-volume lvm create --data {{ item }} --journal-size {{ osd_journal_size }}' ]% c" F) j! E4 P$ H9 h
loop: "{{ osd_devices }}"
0 s, U, A/ n( T. Y/ |# }) u5 O
* }+ E/ z4 |5 O7 b& U. I/ P- name: 部署 CephFS# K- C; v* b" \4 w2 q r
hosts: mdss # MDS 节点组
: k4 ~1 [/ X/ M' d, e0 M u vars:
! k' h( H: M2 E( r- e- J7 |3 h cephfs_name: myfs # 文件系统名称
6 C- Y: v" _0 n' Z cephfs_data_pool: cephfs_data # 数据池名称
' W- x" h2 G4 M: s Y4 T" U cephfs_metadata_pool: cephfs_meta # 元数据池名称
& D- R" q7 f% Q* e! M# I cephfs_pg_num: 128 # 放置组数量* D2 W8 L U4 Z: i3 h) i& b
tasks:. I; n& S: ?$ D' X! I2 i* E
- name: 创建文件系统
. t2 n( K0 D3 j: e/ r6 T5 R command: |
" p: ]$ B8 p3 z* x0 {2 g4 M ceph osd pool create {{ cephfs_data_pool }} {{ cephfs_pg_num }}
, Q* x# E# [; `! j+ ?% D% ? ceph osd pool create {{ cephfs_metadata_pool }} {{ cephfs_pg_num }}0 C0 c* l- Z0 {. \& m% o" K( l
ceph fs new {{ cephfs_name }} {{ cephfs_metadata_pool }} {{ cephfs_data_pool }}. Y- H0 N i* o0 \( t0 {) L8 a
+ e6 y! z0 P% S- name: 部署 RGW 对象存储
2 D- B. q @7 h' h hosts: rgws, w" u- A6 c3 e" ?4 M% A# h
vars:
?$ K' O; O7 N) c& r1 w, _ rgw_zone: myzone # 存储区域名称
0 W9 U+ i9 r: t; \ rgw_zonegroup: myzg # 区域组名称
3 G/ A1 O0 T: ]0 q! x/ t0 y, N rgw_frontend_port: 7480 # 服务端口
2 \' n, F1 i; { rgw_ssl_enabled: false # 是否启用SSL
6 h; A$ z% ~/ a7 R1 b0 s tasks:; w8 h! d. d4 [: s6 ?
- name: 创建 RGW 实例
" q5 o8 V+ G( O$ p% z; }" O command: |
; n, C# |, e9 U4 I" O ceph-deploy rgw create {{ inventory_hostname }} \
3 [5 H5 i9 O' |4 j+ @- M2 N --rgw-zone {{ rgw_zone }} \
2 a9 Y8 Q& C3 v: T --rgw-zonegroup {{ rgw_zonegroup }} \/ F$ w; O1 k# x8 l I
--rgw-frontends "client.port={{ rgw_frontend_port }}"
( m0 f3 }* @# v. t3 s
; x, ]/ O4 m% c! f7 Z- name: 验证集群状态
/ i+ I! ?+ g+ H- a, I hosts: localhost3 S% h; V. |. G+ C1 [, p5 l6 B
tasks:
( E- T6 m) I7 y% _8 G5 o1 N - name: 检查集群健康状态
* Y% T R8 Q' c/ V command: ceph -s
% L2 G! r" _" a9 T& N! p1 t- ]; b register: ceph_status( G2 I' T$ r. p0 F; h8 p
changed_when: false
# ]/ x: m( x3 ~4 K0 ~3 b) \
r1 @$ x" @- x: m. C5 d/ V - debug:
/ Q& F5 R1 N" M' b% O! }& Z" y msg: "{{ ceph_status.stdout_lines }}"- i$ a! j5 k; ^: C& k
AI构建项目
+ P6 Z1 D6 _3 h+ \
+ L! z2 F4 X& R' G. }* V二:参数详细说明
. n* u7 }+ \8 Y" G; }, Q1 ?主机组定义
i! B+ w$ f9 F9 Bmons: Monitor 节点组,负责集群状态维护% f3 m, [8 ]3 p
4 u, r V: F2 P2 ^( ^& bmgrs: Manager 节点组,负责指标收集和监控1 m; b$ I7 @/ Q4 a' E) w! D
1 x# S6 L7 L- K% i! v+ ]osds: OSD 节点组,负责数据存储, o- X* o# z8 ] g3 i) u. @' r
- c! r" f! W7 C9 H
mdss: MDS 节点组(CephFS 元数据服务)
3 ?8 Q8 Q+ ^! [7 B
0 Y" N; `% h' _3 C7 L# i; ^rgws: RGW 节点组(对象存储网关), ]5 s3 R' w) [8 i$ w
6 M# y, P3 t9 P7 \) H! n核心参数, Q3 h9 v6 N0 O7 s& [
#yaml文件
1 b7 L# \+ z B/ ^) s
$ N" j! E, Z# `' a: x& Xceph_cluster_name: my-cluster # 集群标识符
5 e2 M5 W7 D$ v' g
4 N, G$ m4 V+ a$ l. |ceph_fsid: # 集群唯一ID,建议自动生成
. a5 t+ ]+ C* [& w( O2 ~, S( O4 U/ r1 P
ceph_public_network: # 客户端访问网络
! r0 @9 Q" F+ t2 c' j: f. w* a' w2 T" E7 \7 Z% T$ U
ceph_cluster_network: # 数据同步内部网络+ O) n3 I0 q6 q5 l4 q9 Z
. W* d% }4 ^% X% C, v4 t% S4 x! N
OSD 配置
, j8 K, E! M p/ Q# ]% s4 p#yaml
* t1 A4 W; ?! D- o* f& x2 l! _' s8 a, n f; E* W3 \4 ]" e8 G
osd_devices: # 磁盘设备列表(根据实际修改)$ l( b. G+ p4 i+ I) P; {
- /dev/sdb0 b8 h, ~# Z9 K
- /dev/sdc
/ {& ^( `) M2 P: j# ]# w6 P! Xosd_journal_size: 5120 # 日志分区大小(MB)! S I" l7 E, E6 H. b# @
' V: E: D: a! H( V+ }! m
CephFS 参数% q% m! a+ O1 S: L' _6 w& B( t
#yaml文件$ X! w9 z) P/ O2 \( y7 c" }
+ ~- H+ e1 ?7 l/ K# U5 Y9 ?, W+ H6 Lcephfs_name: myfs # 文件系统名称
. n+ N( i8 E+ H* o3 F. l( `7 O
7 d0 v! j8 ~ X( g/ D; f5 zcephfs_data_pool: # 数据存储池
/ V. ~* d# O! d
/ {/ q" F( w$ H$ Z! R0 l3 X3 hcephfs_metadata_pool: # 元数据存储池 0 q; D3 ?# h" H" q8 F8 W
5 S/ `( \# g: T- d
cephfs_pg_num: # 每个池的PG数量(根据集群规模调整)
3 _2 d. K2 K9 y l& \. N" t* i& s5 A6 K4 ?
RGW 参数8 Y' C9 B: S8 G' W' W
#yaml文件2 f- `6 p) R$ c
( L. [' R7 p9 Trgw_zone: # 存储区域名称(需全局唯一)
: T" l( m( T Y$ j0 W- a' _4 K$ b/ Q+ D
rgw_zonegroup: # 区域组名称(逻辑分组)
3 A3 }. {. T& D$ E5 q- c
: [- u& {; A i" n' [( d8 argw_frontend_port: # 服务监听端口
4 ~( c! @( X. V. J* B# e$ k+ @3 K4 [' t% \. I
rgw_ssl_enabled: # 是否启用HTTPS
. Z0 ^# s) e# R0 Q0 ^. @
5 K8 |6 B, j9 _0 |$ [+ i 三:补充配置建议
* ^! y1 V4 q Y5 s认证配置(建议添加)
2 H# \# b1 p( |5 P/ [$ {% X#yaml4 m$ ^& z% I8 G+ E7 a) n7 G
( h) M6 k" I* V: J
cephx: true # 启用认证 # W8 m4 ~; \) M: r& f
, T- g0 Q- B9 Zclient_admin_key: "AQD...==" # 管理员密钥(自己定义)9 E6 b5 R3 o1 e( k: b
) ?2 r$ q# L* {) R5 m存储池配置
( X3 ]% m* f! a( R( p: x, Y#yaml
9 u2 u6 q. ^( H, S1 O7 b% a6 E" n4 V8 q) N
default_pool_replica: 3 # 默认副本数
5 b6 y& @( R1 \2 h: C5 X! e
0 s& |" b6 l# y0 O" ]1 ]# |' o$ x1 ]pgp_num: 128 # 放置组组合数
' r. h) Y4 L" x7 i- V% r3 l* V: r* I& ]: j
监控集成7 i4 B! k3 p# C z
#yaml/ e5 ~- \. W+ w6 A( D; m% o* C
1 a* K* L' u& M* E L; ]ceph_dashboard_enabled: true; v/ Z5 v5 `) f/ [( Y- q
grafana_integration: true
' i" s2 {* u( p5 V( r" Y# k; k3 tprometheus_targets: # 监控服务器地址
) Q& z( c* o4 L5 t, D - 192.168.1.100:9090& X: n" M; _. ]8 W2 o
( y/ R1 d5 T. J, Z* C硬件优化
7 h9 N, d# v8 }1 p#yaml
6 B! x9 r- W) a* o1 y5 f& J- Q
. d( y: q) c- `3 D' N6 n: w0 wosd_memory_target: 4294967296 # OSD内存限制(4GB) : n, V0 x/ |3 @/ q1 h1 W
5 C: h# D3 I8 |4 i( Y% g9 m
filestore_max_sync_interval: 5 # 文件存储同步间隔8 _$ }; g% x! t1 k
/ V. F7 c$ H: T四:ansible执行注意事项7 O# l. T- C: w" O: x$ J, F5 C" {
准备 inventory 文件: H! Z8 r- D4 r9 O- O$ V. x9 u
#ini文件
( ^1 ]" M6 T6 Z& @9 M0 Q- E2 T- U
[mons]
$ p2 ?. o+ @5 i; j9 U9 qceph-mon1 ansible_host=192.168.1.101
( s9 c& i& G4 u3 aceph-mon2 ansible_host=192.168.1.102, @. J" b- `7 A5 w. ]
/ `! F: g5 o' r4 Z+ o# ?- V& v" b
[osds]0 o6 J( q7 s( U- Q4 p; X
ceph-osd1 ansible_host=192.168.1.201
0 ^. C9 X+ a: d X$ Tceph-osd2 ansible_host=192.168.1.202
3 }# B. a5 y+ }
" K7 H: a/ T: I( U5 Y" J# U& Y[mdss], O; \- U; V3 c+ A# z+ u
ceph-mds1 ansible_host=192.168.1.301& y& `7 ]; G" I
% j4 u W. k& F[rgws]: \ {6 }$ X" ^+ o8 \$ Q" }) Y
ceph-rgw1 ansible_host=192.168.1.4018 E4 H; {" d [5 m7 v5 ^
推荐使用官方 ceph-ansible 角色:- k1 E* [$ p _. f3 [) f
yaml
* z& e3 k! @# y M* W, ]5 y
2 o' g8 r* l W" N) zroles:
6 J5 C' V/ Z5 e. K - role: ceph-ansible
8 K+ ~. N5 X0 a' A9 h3 X# h* o vars:5 q# w" \' @" ?6 |9 X* b& n( @7 c% P
ceph_origin: repository
* |7 R% g) x% d ceph_repository: community
& g4 r/ X" m% H/ K! ?, L7 O
! G( z; U6 T6 m) h/ _4 t网络建议:
. D( y4 {6 B# Y1 ]6 p公共网络和生产网络分离
) I6 \# o% N6 r; B& m F, @7 y) H3 S. u6 ~" \. [8 k; A/ @
每个OSD建议10GbE以上带宽; `8 e7 X- S7 }' y: u3 }
1 b# a$ Y0 M& ]! r9 f: }. Q监控节点使用SSD磁盘
( W6 E( e7 r5 H- ?- \! K
0 L0 d+ H* o0 ?+ u7 s8 b+ o. x: }验证步骤:+ c( \, [/ O: ^& p
1 g. H% |3 `; W0 D# 检查集群状态+ H. [* l! I& b4 z9 F b
ceph -s3 C) x8 K |% V, ? Z4 {
8 Y0 k k' Y! E' r: J7 f# 测试CephFS挂载
2 M, w) k! M; vmount -t ceph mon1:6789:/ /mnt -o name=admin,secret=xxx3 H9 D" r2 ?5 r" |+ L7 y& P
! S; k2 Q7 O( f5 J, l g
# 测试RGW访问3 e$ t0 U- q7 y* W5 N! k( ~- P3 G* G
s3cmd --no-ssl --host=rgw1:7480 ls
: Q# D6 q5 U, U; L1 G( n3 m% G |
|