|
|
楼主 |
发表于 2025-12-22 23:44:32
|
显示全部楼层
一:Ansible Playbook示例
: P3 v, c! G# F3 |2 a; B---( W: l9 x: Q3 K8 s% B
# ansible-playbook -i inventory ceph-deploy.yml
* t* g/ P4 `) v6 j
# D. F. G" Y1 H; A- T5 @- name: 部署 Ceph 集群基础组件
6 @0 }2 b2 t3 G4 c/ F8 A1 b hosts: mons,mgrs,osds # 目标主机分组
/ {/ o/ j; P4 R2 C4 K4 I; U: a become: yes # 使用 root 权限
" K0 L) w% @1 k1 \ t vars:; n6 t" ~5 [" Z, ^& n# [
ceph_cluster_name: my-cluster # 集群名称
$ e3 W5 f9 Y$ T% z) M) O% x4 O ceph_fsid: "{{ lookup('password', '/dev/null chars=hex,ascii_letters length=32') }}" # 自动生成唯一集群ID% {; r) u" O+ Y/ G
ceph_mon_group_name: mons # Monitor 主机组名称; s$ m& N3 S. S3 |/ B3 g7 Y8 J; `
ceph_mgr_group_name: mgrs # Manager 主机组名称
7 E D5 O/ v8 Z5 a ceph_public_network: 192.168.1.0/24 # 公共网络- M4 c! n- o( J/ q* h0 F0 ?
ceph_cluster_network: 10.0.0.0/24 # 集群内部网络 C' ~% k8 s& @3 D
) m. ?" N7 I) n; b
tasks:
) O: E- r/ P1 D/ j: g - name: 安装 Ceph 基础软件包, w. m0 f. R" h& Q4 e- ^
package:
) D: B& Q( k- D, P: ?' [ T name: 9 [ w& s) a% ]+ \! n
- ceph-mon
8 p6 |+ j& ~- G9 B k- T' v - ceph-mgr
! f5 J/ l+ y S; d% Q - ceph-osd8 u* o: w7 _ x5 p
state: present# h9 T9 V) t/ f8 B' i# B. ^
9 H, Z' j# r" X4 i% K - name: 初始化 Monitor 节点
2 \/ j$ y! Z- N3 h2 g command: ceph-mon --cluster {{ ceph_cluster_name }} --mkfs -i {{ inventory_hostname_short }}+ X/ k5 h% _- T ] z
when: inventory_hostname in groups[ceph_mon_group_name]
1 R+ m, d* W" v/ Q% c
* F8 F7 x" `9 n6 S# [9 D/ D- name: 部署 OSD 节点
A+ ~8 m& y9 h, j7 E" y, k. t hosts: osds
4 k8 {. }$ w- Y. K vars:
" |( S- f5 D# @7 e( b- C, n2 W' | osd_devices: # OSD 磁盘配置
! J; c* W8 ~8 l - /dev/sdb* X- } f+ f& J* u( R, `
- /dev/sdc
5 Z Z& \8 ?, ]6 g y) f% e- a' M osd_journal_size: 5120 # 日志分区大小(MB)2 e+ K6 Q5 e9 E! G5 Q) }; g
tasks:
9 w" r( d2 B# |9 t - name: 创建 OSD
) j; e) S: R) W5 ~6 T6 s command: ceph-volume lvm create --data {{ item }} --journal-size {{ osd_journal_size }}
7 |2 t/ U3 {1 ` loop: "{{ osd_devices }}"; o, j, ^# Z& I* w+ y. S
# R- P) w9 ^6 C1 F! }& @8 l+ x, }/ {7 D
- name: 部署 CephFS0 e' ~/ N* X6 ~ n
hosts: mdss # MDS 节点组/ d2 ^& p6 D. z" C; {4 ^& |
vars:
4 O! Y# }8 N7 G6 S; @, `5 I2 z cephfs_name: myfs # 文件系统名称' S9 k; M1 C" _2 f$ g$ M
cephfs_data_pool: cephfs_data # 数据池名称
7 Y5 ]1 W9 R1 ~% _ cephfs_metadata_pool: cephfs_meta # 元数据池名称
8 K. @/ u8 e0 z/ O V, {+ _/ t6 Z cephfs_pg_num: 128 # 放置组数量
: x" K# N& |& R$ G! v0 V tasks:
* t& z( w; S5 {* t' g. Y* H6 J4 P* ~% O - name: 创建文件系统! C7 ^0 H; I' B6 [' k$ }8 s
command: |2 I% y) {& P# O) J) P
ceph osd pool create {{ cephfs_data_pool }} {{ cephfs_pg_num }}
6 ?) v, x( ` H( M& O! q ceph osd pool create {{ cephfs_metadata_pool }} {{ cephfs_pg_num }}( W5 M: ?% s6 r$ g* X" W- ]! G
ceph fs new {{ cephfs_name }} {{ cephfs_metadata_pool }} {{ cephfs_data_pool }}
5 V5 w& D; J* t: f
8 w) I% z, Q9 B+ T/ I: ]) Y- name: 部署 RGW 对象存储" A- ?: ~9 v. B! [/ m
hosts: rgws
. V4 M& ^" A! A4 s( W+ ]& i vars:
: k9 E* U: y9 ~& }+ p rgw_zone: myzone # 存储区域名称( Y5 O1 Y$ Z) ]# s/ ~1 H
rgw_zonegroup: myzg # 区域组名称2 i! P Y- d9 t! w2 t2 b2 y
rgw_frontend_port: 7480 # 服务端口. C* U9 d' N# O; h/ v
rgw_ssl_enabled: false # 是否启用SSL
& A0 h% Y; t! Y& y7 I" ` tasks:2 g- j' m" r+ V: W( v) e3 {, J; W
- name: 创建 RGW 实例
& [8 J/ C# _5 f& d command: |, n4 ^9 a* W7 M
ceph-deploy rgw create {{ inventory_hostname }} \4 p4 u8 w, _ m3 f& I" k1 f
--rgw-zone {{ rgw_zone }} \
" ]* @$ w% | E5 b& K0 A --rgw-zonegroup {{ rgw_zonegroup }} \% M8 f8 E/ z, A( E. S6 x3 u+ s
--rgw-frontends "client.port={{ rgw_frontend_port }}"
0 E( t3 t1 i2 A$ _! l3 L . x/ Y1 T. s0 p( U J2 i
- name: 验证集群状态
' ?2 g8 Y3 ^1 t9 ~ hosts: localhost+ z: ~, f# w9 y1 E: a
tasks:6 }. t2 C3 W8 Z7 d Z; D) \% i
- name: 检查集群健康状态
, K |8 ^% n( C N) E% C command: ceph -s
+ C2 ]2 [$ D( [$ F& |; A* B register: ceph_status
( i* E8 x0 h9 h changed_when: false7 l* Y, r, i$ q# A" D
" b! L5 u+ @% Z. o# z. a9 d - debug:8 V% G& K7 l4 q8 T( O1 Q% o
msg: "{{ ceph_status.stdout_lines }}"% u+ D7 I$ I$ b3 `; x; }% A
AI构建项目
! I# V0 P+ M4 n" I( ^% V$ F$ S0 E1 ]* k" C _" K1 A( [1 [- P0 y
二:参数详细说明+ t$ L& s$ K9 n* e
主机组定义. v) O$ `1 y6 _5 `2 k. d( q
mons: Monitor 节点组,负责集群状态维护# n+ m! U' U; u1 i! q
- F& v( P4 j4 X( v4 \2 M
mgrs: Manager 节点组,负责指标收集和监控 Z4 p; C7 B4 E6 g- j7 |
; K. r( W- Q) r- J, D
osds: OSD 节点组,负责数据存储
8 ]& i4 Z( |2 B1 C: O: \8 f6 S- ]- L* x( m3 j
mdss: MDS 节点组(CephFS 元数据服务)! @1 }8 B0 h, b. F# ^: U$ ]. R
5 t" G! n1 J: I! Y/ a3 Q
rgws: RGW 节点组(对象存储网关)
( K& h2 {* t6 b6 N; z' \2 L2 {+ b( w
核心参数6 d$ V/ M$ ]' ^7 W* J' ?" N+ @$ H
#yaml文件
. Y6 ?; v, z& V5 p$ u, i$ B0 t, n) T! e0 D" x- _
ceph_cluster_name: my-cluster # 集群标识符
3 {9 H3 }6 G b! b- }# z
o! O+ B/ x- o# w0 ~+ Aceph_fsid: # 集群唯一ID,建议自动生成 & {) J7 j) @2 q# j# M
; V v" }$ V( \# Q1 u4 |3 \ceph_public_network: # 客户端访问网络 / I& R s- h8 g/ d# u2 `
2 J# f5 D2 s5 z) m
ceph_cluster_network: # 数据同步内部网络7 s* z* k! K8 N5 X( O
7 r" D+ p$ B5 }& Q7 E& @OSD 配置
/ }& ?4 U8 P* |#yaml- H/ A% a8 H% k2 D2 J0 _
: s3 m, l4 ` h3 T) M7 F* Zosd_devices: # 磁盘设备列表(根据实际修改)
7 F$ Q2 A; G, l2 I$ r1 ^, p - /dev/sdb
) @( C1 {! G& H7 o- ? - /dev/sdc0 i0 N& S4 }2 C; x, ~- S" { l
osd_journal_size: 5120 # 日志分区大小(MB)
- w- F N7 r! c, z2 d# n: R& e( k- u' S" y2 n. M
CephFS 参数
0 I- J/ b- L6 @% P7 ^1 {8 w#yaml文件
9 p9 A @1 d0 a: \( y; x! p4 m. u9 f
cephfs_name: myfs # 文件系统名称
6 s2 S# a9 y$ C0 v
4 H" O7 W+ a6 @3 H! U# }$ {$ _" Ucephfs_data_pool: # 数据存储池
8 f: G7 w! e& x/ C2 c1 U4 t% \1 n% ]3 N: N
cephfs_metadata_pool: # 元数据存储池
* @6 t$ O: S' o2 z8 B3 k: D* E# w5 Q5 m4 Q
cephfs_pg_num: # 每个池的PG数量(根据集群规模调整)
0 A) _* [2 @/ F Q( |: J( |5 g2 }& i; i+ O
RGW 参数( S2 ?* }: m) }, [! O
#yaml文件# U& Z: W. \6 r: G9 A+ m
: ^' o% l }6 \$ j9 l, Q
rgw_zone: # 存储区域名称(需全局唯一)$ \6 a' w: ]& k0 C. I# Q" {
! ^+ d; q, Q5 _; C+ W4 F- Vrgw_zonegroup: # 区域组名称(逻辑分组) - [ r+ H' q9 W2 A( d
# ?) n7 j0 _) Q4 H# j4 [; m' Z# vrgw_frontend_port: # 服务监听端口4 _0 V% j' Y1 b( D. ~5 d
: C! v# J: ?- r4 m
rgw_ssl_enabled: # 是否启用HTTPS; i5 J' W c# X* P) b5 E! w
& V! Y' g! l9 ?. D& P; k8 I
三:补充配置建议; g4 |9 ?4 P M" S- o8 [9 j( R
认证配置(建议添加)
1 K0 v/ ]5 D! e6 K# q8 D8 }- H6 J#yaml
) L4 q7 [9 q+ E7 E8 S
3 K! C* t. T* c% X% I9 Scephx: true # 启用认证
2 |1 l! c- X" K5 f7 C9 q
) A3 `8 g( V u; _) F. `6 Dclient_admin_key: "AQD...==" # 管理员密钥(自己定义)
6 p- F& R, g! v$ a ~4 i# t) c
& g" F+ } Q& x! F I3 m存储池配置
/ Y. @! f) p' p: C#yaml
. m; g- k# y3 a1 E9 F1 Q
2 `& ~2 J8 N6 H7 g! idefault_pool_replica: 3 # 默认副本数 6 Y1 O% c+ V0 J' Z
# ] e8 V) N& [
pgp_num: 128 # 放置组组合数
, b7 k; _; a; o- r9 _) G- ?8 v; C- q
监控集成6 Q% u) J6 O! z
#yaml
1 y" w/ a9 @) A2 B( Y" w+ c* E
; S0 g* t2 }$ F7 S Q$ ^( y8 Eceph_dashboard_enabled: true6 T2 N; I- u( K7 b
grafana_integration: true D- v6 {. a6 o' ]" {+ p' X& ~# j
prometheus_targets: # 监控服务器地址* Q2 h1 x0 N, G8 p3 r
- 192.168.1.100:9090) D1 b) A& u4 o# l1 k' {) P
: f8 V- F3 c7 v0 P1 b& q; b
硬件优化( g' S& y3 G% }9 K6 Y3 {
#yaml / s! x0 `- z( ^* _; b2 }
" n3 v5 h1 B& @6 h; E
osd_memory_target: 4294967296 # OSD内存限制(4GB)
/ i+ g) ^/ E9 m! Q8 ~2 j) ?6 }! D! O
filestore_max_sync_interval: 5 # 文件存储同步间隔
# ]. y7 D# A* L, n- l) _& P; Q- ~) H8 |6 I7 R/ k0 ?# W) J
四:ansible执行注意事项
* F% u) B0 `; ?9 I( r' o准备 inventory 文件:
6 ?" n9 K0 u7 A7 Z# d( L7 ^' A. I#ini文件
2 D" i5 |. Y1 Y1 r0 @2 i! Z; C; h, x( ]" F" `7 ^/ N$ [
[mons]: R/ _6 R; `: \2 t3 \
ceph-mon1 ansible_host=192.168.1.1010 V- m3 ]4 {3 m# P6 k2 w
ceph-mon2 ansible_host=192.168.1.102$ S% A& ?, @ g1 x
# S9 H6 M: R. b" a7 d+ B[osds]
0 M8 D5 z: L. D: v5 i+ Nceph-osd1 ansible_host=192.168.1.201
! P( M5 ~8 V, M& w, uceph-osd2 ansible_host=192.168.1.202
4 P3 V* B* [' J" b7 P2 I( M' g# u8 k
[mdss]( G* k, d. W N) F8 V! G5 B
ceph-mds1 ansible_host=192.168.1.301: n, U& r( V4 o m# O) |# L0 s
, [9 l. Q. e) }4 E0 G[rgws]
) K0 F: n- c t. P( }: L4 Lceph-rgw1 ansible_host=192.168.1.4019 e# b! k* P& R' o
推荐使用官方 ceph-ansible 角色:
0 W. q( S# a! Z: R7 xyaml
' s$ S; ~! i6 B# c6 V R; D6 f( }$ T/ S }
roles:. u1 j& o4 ^; [# F D$ N0 M7 [
- role: ceph-ansible
9 Z0 O& c; x" a |& z- e vars: ^6 u3 ?6 y* g( q; V6 }" l
ceph_origin: repository. n0 W! {1 B. c- t) q7 Y
ceph_repository: community
- H6 [. }" _; w+ h9 E: r; @
- I0 v( j8 W2 J* t/ ?5 a网络建议:
l# C6 n2 e! O0 t6 j( p4 x公共网络和生产网络分离
1 q( s4 t. q. [3 Y* ~# ^0 A; V1 M* k w& `
每个OSD建议10GbE以上带宽5 q, b; V2 f8 q' G6 a- Q" `
% v( m7 } _- r9 r& L! w; u
监控节点使用SSD磁盘4 d/ i; @, u2 S8 u* ^% I
8 H3 e9 v% Z e8 ~0 [
验证步骤:
" c" ?8 v: ?+ m+ i6 {7 B* a1 G; ?& k5 Y3 S' O) n4 j" {
# 检查集群状态
6 `+ N V; R% l0 L( G7 C% w0 n, Sceph -s0 `) ^; H3 \+ O, M9 L& T
; T5 g6 ^! i1 N% {8 O1 S5 ?& s" B# 测试CephFS挂载
. N& ^ v S7 ?" rmount -t ceph mon1:6789:/ /mnt -o name=admin,secret=xxx; _: u C0 ? p0 q% L' a0 J
! G- G- p0 G/ V7 H, D
# 测试RGW访问8 x1 F5 L3 k' Q- D& Z+ ?8 l( i
s3cmd --no-ssl --host=rgw1:7480 ls
, y1 d6 D( M8 r, h+ P; P |
|