|
|
楼主 |
发表于 2025-12-22 23:44:32
|
显示全部楼层
一:Ansible Playbook示例6 q. R- }2 I- P6 F+ y3 F/ s
---: H. [1 @! d( @# X8 h
# ansible-playbook -i inventory ceph-deploy.yml5 ~: b) E8 t6 k$ [ Q
* V; { ?2 n: {; h, k# z# a7 g- name: 部署 Ceph 集群基础组件8 J4 Z: y; u2 I. F7 A) _- L
hosts: mons,mgrs,osds # 目标主机分组% @6 D# q, I }3 ^9 h1 A
become: yes # 使用 root 权限
7 _6 i# C# `/ v& R& m. G; z. l vars:
/ @7 ?4 R1 D4 n ceph_cluster_name: my-cluster # 集群名称
: z) O0 R0 h- t) g5 D ceph_fsid: "{{ lookup('password', '/dev/null chars=hex,ascii_letters length=32') }}" # 自动生成唯一集群ID
: q9 F( }$ i8 ?4 z ceph_mon_group_name: mons # Monitor 主机组名称
: ]% T: e2 } l$ Z& O. O1 _ ceph_mgr_group_name: mgrs # Manager 主机组名称
- o( z" [5 l3 v5 m ceph_public_network: 192.168.1.0/24 # 公共网络: l7 W0 A/ M& u! q7 M% B
ceph_cluster_network: 10.0.0.0/24 # 集群内部网络5 S1 T* ~: h! m4 L, e+ p- J
- D' [$ A8 S7 _& X- ] tasks:& ^) W, T; s; r( B9 A" L' {6 \
- name: 安装 Ceph 基础软件包
7 U' _, ]7 V/ j package:* }: q# G1 H2 K6 U# D7 }) O2 a
name:
7 R; [. o" ?8 Z9 a# P( W, R9 Q - ceph-mon% Y* I, z! \8 `: M( r4 `
- ceph-mgr) N4 w% U" V* A5 j& s% f
- ceph-osd
/ ]6 M+ E2 D7 y# e' W/ ~ state: present
. P% y7 y f/ N% r; z
8 }) ~# h9 E. Y3 z# M g - name: 初始化 Monitor 节点: E& D, @ P, X( W
command: ceph-mon --cluster {{ ceph_cluster_name }} --mkfs -i {{ inventory_hostname_short }}
9 Q; Y0 b4 D1 x( d) a* c) z when: inventory_hostname in groups[ceph_mon_group_name]' n& }" E8 g! G6 F
$ e X7 N" ~ y5 Y+ A( H3 u- name: 部署 OSD 节点* {$ c8 |9 a2 M: x3 y8 F
hosts: osds
: @0 h# ^; h* l, ~ vars:3 Q' `6 t. Q3 I1 l: U6 [
osd_devices: # OSD 磁盘配置+ I# Q2 o3 A1 _' O; n
- /dev/sdb
8 [& K) \) y. M J# z - /dev/sdc$ m K* k/ ^% n1 X/ J
osd_journal_size: 5120 # 日志分区大小(MB)
; ?6 U4 k! `7 K7 _% ~ tasks:9 s/ Y9 P+ I9 Q: z l
- name: 创建 OSD
- |2 R9 a" N" K8 u; a command: ceph-volume lvm create --data {{ item }} --journal-size {{ osd_journal_size }}: m% q) }- C: [: d4 r, S
loop: "{{ osd_devices }}"
' w4 x4 W( t2 o1 |5 v: w& ^ / U8 I$ x, p- r
- name: 部署 CephFS
" A# H+ l, m6 B( D( k% h hosts: mdss # MDS 节点组% `4 o* W: D* i* H7 L% A7 Y7 l# L
vars:
' M; ~3 o- W( }% X cephfs_name: myfs # 文件系统名称
8 G3 l! O- e; g+ a5 |* n cephfs_data_pool: cephfs_data # 数据池名称% ^# }% ^9 O1 b6 g, S6 m4 ^
cephfs_metadata_pool: cephfs_meta # 元数据池名称
& U& v. o6 f3 w cephfs_pg_num: 128 # 放置组数量. D3 H! J0 p C% v9 U5 f: v, n# t; L
tasks:" u9 W. j$ M; o: r
- name: 创建文件系统
& v+ o% J1 e6 R, U" E @" M5 h command: |0 r/ Y( j- D6 m6 g2 ^
ceph osd pool create {{ cephfs_data_pool }} {{ cephfs_pg_num }}
: y; _* e. z( Q2 `. i ceph osd pool create {{ cephfs_metadata_pool }} {{ cephfs_pg_num }}
9 u' `" e1 D2 J; E" ? ceph fs new {{ cephfs_name }} {{ cephfs_metadata_pool }} {{ cephfs_data_pool }}
) S" y6 _# i1 f3 n9 `; m3 e3 z" v ! m" i: C$ Q$ k! V5 `
- name: 部署 RGW 对象存储+ O$ ?0 q' y5 p: E
hosts: rgws# f/ @% S2 t) P2 y
vars:
# P, F3 `% D9 `1 E rgw_zone: myzone # 存储区域名称
k E; u* c7 k- m rgw_zonegroup: myzg # 区域组名称% J, w5 w# K2 v) d- r" H$ |
rgw_frontend_port: 7480 # 服务端口
4 U% I" J* [- A; U rgw_ssl_enabled: false # 是否启用SSL5 f' X) y7 _. b: l
tasks:/ A% g; H0 V" U1 o# V
- name: 创建 RGW 实例# R/ i' V e& F7 `1 l
command: |
) q1 H3 B6 ^3 x, h- ~2 a! c ceph-deploy rgw create {{ inventory_hostname }} \
4 g7 I* L2 ]7 A9 C/ z; H' M --rgw-zone {{ rgw_zone }} \* ~: o2 i2 g4 F8 T% N
--rgw-zonegroup {{ rgw_zonegroup }} \
& R. |5 q" R1 H* ^ ] --rgw-frontends "client.port={{ rgw_frontend_port }}"
9 ^- z4 }. y! ?/ R2 }7 M 7 O( I& M. @# y( F4 V
- name: 验证集群状态& e8 c# t$ k3 d" k: e; y) ^
hosts: localhost
3 Z! _8 S+ G( c. o2 j0 _ tasks:
, ?# A* Y8 h$ d" Z4 u: o - name: 检查集群健康状态& z) n+ l/ n. Z7 P& D0 T" |7 A6 [
command: ceph -s
, B# r( ^. _6 u* x register: ceph_status
0 F/ A- {; I) F; K5 y( R changed_when: false) ~* y% V2 _ E9 |, M4 z
) C7 V$ Z3 I' W
- debug:" {5 R4 h+ V- }4 n
msg: "{{ ceph_status.stdout_lines }}"; o" l, }$ M3 ~* ?1 w
AI构建项目6 X# z& t0 E" X
4 _! Z# m- k1 M0 S9 P" D+ w( W- `
二:参数详细说明/ w1 _( e- K5 w# v; z+ k m
主机组定义
+ `9 w. W# v) @5 ^" U) Bmons: Monitor 节点组,负责集群状态维护
) ^2 y% Q& M0 R2 f0 E- n4 x) V
3 o; ? A( `* p, x, B Emgrs: Manager 节点组,负责指标收集和监控
9 S, V( O7 F, z
6 w0 m, R3 h) Vosds: OSD 节点组,负责数据存储3 G1 `# Z# F8 Y% o& h2 y( I
# S4 w4 x |( Y
mdss: MDS 节点组(CephFS 元数据服务)
+ n! o( S e, v: L S
. P7 R- a- u8 h- F) g4 g3 ^rgws: RGW 节点组(对象存储网关)6 A* l" H/ T0 W) H x
- C8 G5 P) U+ y
核心参数
0 |# W; g% ~! L0 K+ ]/ E @, k#yaml文件
, S7 A: [( E8 t& u! A5 m1 A% c/ z( R7 S
ceph_cluster_name: my-cluster # 集群标识符
( V: r1 `3 U. u0 y1 W
/ h' l: |! F3 I) R& D( Xceph_fsid: # 集群唯一ID,建议自动生成
- U# E9 w9 n' C$ e0 k U" F% U+ f
3 {; N. |- Q/ m4 _* f4 t v1 m/ _ceph_public_network: # 客户端访问网络
! ]7 [, M0 j4 ?6 t$ Q) x% G0 \: Z# ~; v1 u+ j. H1 M; o
ceph_cluster_network: # 数据同步内部网络
4 ~2 V: U Q$ s, h8 x4 \/ n" E P9 b, m
OSD 配置' Q/ q% u0 Z* a! m. K/ o
#yaml5 K8 U$ H5 k" l j: i
0 N& ? j2 L) i5 vosd_devices: # 磁盘设备列表(根据实际修改)) T! l) [- _7 H2 \8 C5 e; \8 ~
- /dev/sdb
8 K) T% b9 J: Z% F" m2 l - /dev/sdc9 f4 C0 G1 K o# D( v
osd_journal_size: 5120 # 日志分区大小(MB)5 g$ r! o4 x l; n& g! W
8 x S& E# [/ h/ _$ i2 F! Z$ [CephFS 参数
, a! H3 `# x) H#yaml文件
: |4 v/ W& ~3 F: a$ J- j5 e* J# P
cephfs_name: myfs # 文件系统名称 6 r& k6 U5 h7 D8 Q w
' G$ x' Y# O' y0 D, A4 g0 Z/ I( F, _
cephfs_data_pool: # 数据存储池
; a5 e( d k6 `6 ]( o9 L. {9 w6 h9 |2 K9 H# q) Z
cephfs_metadata_pool: # 元数据存储池 0 S$ ?2 P; Y2 V0 @5 H
3 i4 z1 g+ K) S/ jcephfs_pg_num: # 每个池的PG数量(根据集群规模调整)
) z2 T6 Z: c2 h: M
$ O2 r3 Z" q& O! T8 \/ B* B! d, bRGW 参数) @7 E# |6 u3 j- f9 [% `- X3 R
#yaml文件
$ d: H3 ]" i# Q. P- [+ r% Q' O G3 V$ q1 ?% `9 D" _) |
rgw_zone: # 存储区域名称(需全局唯一)( x% j/ t+ u# l( Q6 x
& j1 W. _ R; e$ Orgw_zonegroup: # 区域组名称(逻辑分组) ( f( i, G; O2 \2 [( a
% F% O, w) R8 zrgw_frontend_port: # 服务监听端口
8 K k1 M0 Y& ?) P
, o* k1 F1 M: ?6 g. S, Y2 trgw_ssl_enabled: # 是否启用HTTPS" R1 S3 V: s2 U
! z% Y* t2 R$ J5 {" o" R2 \ 三:补充配置建议, i: c: p+ _% s* ^
认证配置(建议添加)* S6 G" @ T0 W. ^' S- l* I
#yaml
$ I; u. Z3 U' M
4 h' ?, {' ]6 pcephx: true # 启用认证
! n# o* d& u. ?- l0 ]) S& d; [( x9 Z6 C0 Y0 ?* G8 [- [* w1 o# v5 R
client_admin_key: "AQD...==" # 管理员密钥(自己定义)" i8 w2 h' J$ T
$ C/ {+ y' q0 u* @- R
存储池配置
; l( t& `8 G- ` O6 C#yaml+ g7 J2 P Y' \: F' q
, f5 ]* t! }. ?& L& `default_pool_replica: 3 # 默认副本数
! L. m' ?: a3 I; q3 M9 `% d; G9 L# o: o2 u
pgp_num: 128 # 放置组组合数
) N7 T H' p. s9 o
* a `( y1 t/ [+ u监控集成
* _8 H; I+ T0 R, z \2 _5 B#yaml& v% A! M8 a% V. ?) h; R
" t8 c. o7 w9 x9 e& O' K) Y, H
ceph_dashboard_enabled: true8 L6 j8 Y6 o) @* T. u' c
grafana_integration: true5 I( @( S- Z7 N. y
prometheus_targets: # 监控服务器地址( a/ J9 g1 k. O
- 192.168.1.100:9090+ s6 r9 J/ B$ C7 e2 }
: O! U* {( j" y) o硬件优化
7 z0 `; a+ j% H7 i#yaml
/ s) U6 N+ u. L0 ?
/ P: K5 e, q/ W1 @' F$ V& t* Sosd_memory_target: 4294967296 # OSD内存限制(4GB)
1 s E) q2 a# D7 j1 D$ x; F3 S* c
filestore_max_sync_interval: 5 # 文件存储同步间隔4 z1 ?8 o# t: K- Y
- z- L, m7 i7 m2 G0 z
四:ansible执行注意事项
* x( a3 X7 A) E$ R5 V准备 inventory 文件:1 E) z: |; ^: a9 k3 m* Y
#ini文件; [, F; E& u) i! p, p% @
2 F* f) D( s0 _- q5 L2 v3 i[mons]
. A" A/ |9 X& T% ?: J9 gceph-mon1 ansible_host=192.168.1.101
, e) q: j1 m1 I6 k0 D1 e1 vceph-mon2 ansible_host=192.168.1.1020 x3 T- H# c2 t8 X1 [* q! t, c
, f" y/ i/ u3 m6 U[osds]' ^6 z' V; L5 T: f/ V0 C
ceph-osd1 ansible_host=192.168.1.201
; n0 L# Q! i9 R" e0 Wceph-osd2 ansible_host=192.168.1.202- j6 Q) E: C. J! o
4 @3 L/ E2 n% [) k: H. e
[mdss]) I8 M& C4 I, e1 F% ^% T" _* d
ceph-mds1 ansible_host=192.168.1.301
6 `* ?8 t! h% R, A" |/ [# g
7 J5 y& _4 ?( j5 p( f* D/ t[rgws]% J6 K# o* E$ Z! s' B
ceph-rgw1 ansible_host=192.168.1.401
, D5 S: ^2 p+ Z# ^推荐使用官方 ceph-ansible 角色:
' J0 P# e& U# a5 l1 W0 k qyaml& y( Q" j" l& {6 l" n5 Z- L: a
9 c/ Y5 ]: U+ iroles:
}7 r2 y% q E0 L* Q; i - role: ceph-ansible4 z A9 o# i) b$ q) m3 q4 K5 R" F$ z( d
vars:
* d5 |: l6 l0 y& c ceph_origin: repository; G, v n# h, F0 @) i( b% B
ceph_repository: community
4 V/ G! D: C4 X# q# Y0 u7 P G0 G# b# g% {% g
网络建议:8 W9 Y4 s2 |$ c4 U, o
公共网络和生产网络分离
" r) g, d7 @3 V) n0 a0 R( |
- d4 r( _2 v4 L6 d每个OSD建议10GbE以上带宽
" _4 M G7 N8 E8 ?
& g, W1 O$ _, J" ]8 R监控节点使用SSD磁盘& \2 B# a: B+ @% e" o) B
3 o5 b: J9 \0 k/ E验证步骤:
4 O# N, V$ S7 o. r8 t5 `
4 L% [, y( T+ {& A9 Q3 _* J# 检查集群状态
/ T, A* V: H, W/ jceph -s, v+ Z) I4 M, g; w8 a
/ U# a! |! y3 _# 测试CephFS挂载/ o: Y" `' w7 {2 z* e
mount -t ceph mon1:6789:/ /mnt -o name=admin,secret=xxx/ q' C {2 m% l, @) O) K0 w: X
, W: ^3 |- f& n- r% M0 |
# 测试RGW访问
: ?: l, X+ E! C3 Y* vs3cmd --no-ssl --host=rgw1:7480 ls
2 x4 Z% H% m5 l9 U+ k, L& g |
|