|
环境: | openstack版本 | pike | | 控制节点主机 | openstack-controller(ubuntu 16.04.5) 172.27.34.37
" G4 U8 x) J4 `; S* j2 h | | 计算节点主机 | openstack-computer(ubuntu 16.04.5) 172.27.34.38 | vxlan100, B3 E/ T& I) B
| centos7-init(172.27.100.2)、ubuntu1604(172.27.100.20) | centos7镜像. y/ N) r$ S7 @' @2 }7 l
| CentOS-7-x86_64-GenericCloud-1809.qcow2c | ubuntu16.04镜像
# U* a3 j" N, c) Z; {+ z | xenial-server-cloudimg-amd64-disk1.img | cloud-init
3 h, x+ j0 H3 K6 g( T X | cloud-init 0.7.9 |
( I. k9 d' f" u( H& b! gubuntu安装详见:Ubuntu16.04.5以lvm方式安装全记录 openstack安装详见:OpenStack实践(一):Ubuntu16.04下DevStack方式搭建p版OpenStack 浮动ip搭建详见:OpenStack实践(九):Open vSwitch方式实现floating IP# `* Q M R5 ]" W S* @
@9 t8 m3 E# \$ }5 U
6 C0 z+ |/ p" H! Z# R; C4 |) I- t& y9 ^4 O: C
7 |: S1 l( }) d3 |8 h, E% a2 ?cloud-init简介
* q o: y- U5 t Z cloud-init是linux的一个工具,当系统启动时,cloud-init可从nova metadata服务或者config drive中获取metadata,完成包括但不限于下面的定制化工作:
, t( ^9 d, {) U7 q# l9 k6 k6 B1.设置 default locale" S P& o0 U: G' S
2.设置 hostname
% Y5 [3 N: Z8 c# H2 z2 v: M3.添加 ssh keys到 .ssh/authorized_keys
! c4 e% z" ^ W# g3 d {" d4.设置用户密码. \) G8 Y+ H& c% c% Q
5.配置网络
" n: l E5 v5 v. H7 G: E7 | r# | 1 Q) [% S( C( G* ~, ]& m9 J3 n
为了实现instance定制工作,cloud-init会按5个阶段执行任务:
# r, S2 E/ I# V. [# H1.Generator (cloud-config.target)7 X" ?2 q3 H7 T! Y# m
2.Local (cloud-init-local.service)
5 v; A" E; L# H+ V8 ^! Y7 t4 W3.Network (cloud-init.service)
$ [8 w8 z) v4 Q4.Config (cloud-config.service), x) P. f4 P& i! R
5.Final (cloud-final.service) 如下服务: [root@ltestwithoutdhcp ~]# systemctl list-units|grep cloud-
, i0 ~2 R* H E cloud-config.service loaded active exited Apply the settings specified in cloud-config
0 U: C; n* L0 z/ P. W cloud-final.service loaded active exited Execute cloud user/final scripts
8 M6 P& H4 e' J0 l6 V/ Z$ L- _' T cloud-init-local.service loaded active exited Initial cloud-init job (pre-networking)) x) F5 t* V# S" P$ W# ]) h
cloud-init.service loaded active exited Initial cloud-init job (metadata service crawler)
7 p/ D( [( R( g cloud-config.target loaded active active Cloud-config availability4 t: a3 B+ S$ U% n0 D; E
cloud-init.target loaded active active Cloud-init target
& _& z& }# S4 r* k/ T, R% e3 _, b; ?8 ~8 o( ?+ R; H8 b4 l% Q
3 K2 G9 |+ }: _4 X各阶段作用 Generator:读取配置文件cloud.cfg; Local:定位“本地”数据源和配置网络; Network:读取cloud_init_modules模块的指定配置; Config:读取cloud_config_modules模块的指定配置 Final :分别读取cloud_final_modules模块的指定配置 * H. g: N/ u' }9 H }% k0 A4 o+ V, f
cloud_init_modules:
) i* ~( k6 i0 m X2 p' D - disk_setup. b9 c' K5 X, `# B) G
- migrator
8 U) d" N1 Z: c: W - bootcmd w6 J7 ^0 T, A
- write-files1 ^% w4 v5 j& t, s, k
- growpart
: d) i2 `% T; \' j - resizefs
S# }) k5 z% [7 g6 J1 [ - set_hostname
: e- h% `, n& N6 L6 r) F# }# - update_hostname
' S* n- B- h9 G - update_etc_hosts0 A" V1 D+ M: n. H; S" p/ H( U- g
- rsyslog6 `1 y8 r3 x3 J+ V2 A$ J0 x
- users-groups
6 ^: V! j& W# A - ssh cloud_config_modules:! A3 a v: M# u# o, P* H- o
- mounts
; W }# `+ o7 L" @8 q8 ?, n* Y - locale; Z" r: b" W( G, K, ^
- set-passwords9 t' t$ B0 N1 D; v: }& A
- rh_subscription* d7 e: y& `3 x3 ~2 p2 n. Z
- yum-add-repo/ Z& z- ?5 r9 _- p; W7 r
- package-update-upgrade-install6 Z7 H% @, U( D
- timezone' J* u( c6 D/ e; J7 N! g D
- puppet
/ R# E0 z5 Y5 l( P - chef+ R* F! V \1 }' A1 w( w
- salt-minion2 W) q# A1 [# p$ o
- mcollective
7 A" n. L* {7 p - disable-ec2-metadata0 F/ u5 F* X7 s" v: l) m2 ]1 n W
- runcmd cloud_final_modules:! i# p9 H8 b) m- u6 V% K
- rightscale_userdata: i/ T3 M7 T. e
- scripts-per-once
+ [" ?2 l4 G0 p; A+ I% O9 y; Z - scripts-per-boot. n& M; t. I5 m: X: ~" P" K% d" B
- scripts-per-instance
r! V' r7 h( V7 Z$ i( L# p1 y - scripts-user! G) V% k0 e& \" I' R* B
- ssh-authkey-fingerprints
6 z; d% G" L8 V" u" x* ] - keys-to-console" G" _3 x, P7 `' ^0 |
- phone-home
! h& l1 _' O4 @3 G) P* ] - final-message3 J& g) P. T* r5 _) Q) n0 z' b
- power-state-change 0 r- n5 V, s4 N7 t6 v
0 @/ t& }$ Y# _& c, |( w! E
8 t" [: J6 |+ ?# J7 v' {& a
; d; K+ T2 O" p* m
config drive: J5 ^* K; | X8 l3 O
当无dhcp服务时,可以通过config drive获得metadata 配置config driver [root@compute01 nova-compute]# view /etc/kolla/nova-compute/nova.conf % ?0 P; c7 R$ B
[DEFAULT]7 k* {' j! A7 b# ~6 L/ H; _( F
6 n- Z, ~. q1 |- g' M; y
) L: J/ d! m( w# Cflat_injected = True
! O& F5 F ~- l3 S. Y! A
( x; z$ M5 p; a4 K! q& q该配置是为了关闭DHCP服务时实例网卡也能被正确配置,重启计算服务后配置生效。 stack@openstack-controller:~$ sudo systemctl restart openstack-nova-compute.service# ~6 K: c) A/ j7 Q) T! h g
4 t7 l- z& k4 Z7 Z关闭dhcp 为确保实例通过config driver获取的metadata,这里关闭dhcp服务6 x) @ ?8 m2 l1 ^" V. l4 Y
' N6 m/ _ }9 L, z3 d/ D企业微信截图_163763823247 ...
: T, }: R N1 M启动实例 root@openstack-controller:~# nova boot --flavor m1.small --image centos7 --availability-zone nova:openstack-controller --nic net-name=vxlan100 --key-name centos7 --security-groups centos7 --user-data /tmp/centos.config --config-drive true centos7-init通过--config-drive true启用config-driver,通过--user-data /tmp/centos.config加载配置,ubuntu的配置文件为/tmp/ubuntu.config 打印的日志,传入的user_data + ^. K/ S' G9 ]- \5 g. e( H1 g# Y! X
绑定浮动IP
( ^7 K" X1 W1 d6 t! d# _. x9 c( M# \: J B/ c# l. ?
user-data:centos.config #cloud-config, p% c- ?! {# l8 L5 Z2 }
chpasswd:, [. E/ e# p! J9 ^ J6 z" X- b
list: |2 a; v: S0 d* q$ [7 N9 e
root:rootroot
; A* y1 L$ |) o$ r( A centos:centos
$ x! V! b: x# Q, R$ `" ]; S: G expire: false4 \) Q1 r8 Q& C; U1 K
ssh_pwauth: yes
- ?- N" S4 P9 B. y, j# f3 u Nhostname: loong576
+ b/ T8 O7 \0 ~0 hyum_repos:
" ^0 H5 W1 S6 ^, p" @6 Y& ]+ o epel-163:- f& e( z0 o* s( d6 |, f1 d
baseurl: http://mirrors.163.com/centos/$releasever/os/$basearch/5 }9 i* I" @0 }' I
name: Centos-7) B, U1 \0 s( ~/ q: p; `
enabled: true
3 b- X/ t9 i9 u" y7 t2 @, x- Iresolv_conf:
& O4 [; a2 {# A% P! x nameservers: ['218.104.1xx.1xx', '8.8.8.8']* c& c9 x! q: T. |& D4 [: }
searchdomains:2 w# w# j; M$ J7 i7 Z% k' U! h
- localdomain
: {. d1 `& J- b a; }( j3 V domain: localdomain; v% \# b. X* y/ y
options:. d8 o" A6 W0 F+ z
rotate: true
9 i2 u, l6 a2 ]. j6 P0 g( H timeout: 1
5 b6 \$ W' {! R) y: w5 P! y" fmanage_resolv_conf: true
+ x8 K& F8 w9 z) u: c; |
( ^* p" M3 p- @0 {3 ~. R1 G: Wpackages:4 u, }9 g6 \ x0 z, A9 `
- vim4 z4 d+ D, J: r
- wget- z4 `6 O, {9 q
- httpd L# H0 s* a9 x
timezone: 'Asia/Shanghai'
$ m* T p1 n _: o5 R& j) l5 V: Wruncmd:
" R9 y$ C/ ?" O" J2 Z4 \" } - [ sed, -i, "s/^ *SELINUX=enforcing/SELINUX=disabled/g", /etc/selinux/config ]
/ U$ d8 n4 K5 H - [ mkdir, /dropme ]1 X* B/ Z& G& }0 B
- [ touch, /root/abc.txt ]" @( c' E+ n! H: Z7 \+ _
- [ sed, -i, "s/^ *nameserver.*/nameserver 114.114.1xx.1xx/g", /etc/resolv.conf ]6 d& q$ y/ x9 `3 Y/ w! @4 g6 P
- [ rpm, --import, /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 ]
" Q& q: o+ L% b; ~/ ]power_state:
, Z0 ~( X# K+ ]8 ^& ~ delay: now* q/ s- A0 ~6 z' j, l' L+ j5 k9 z! s
mode: reboot, b$ H, X! J+ T9 Y2 }
message: reboot now/ F/ \( f# G- }' d4 [* K
timeout: 30" M% ?) d, L$ D% S$ p( \" G$ m
condition: true3 C* k3 `" ?% P* @4 k) n% e2 L
' c: ^! @2 [+ R( y$ v" j
验证是否生效' g4 X/ o; K" p% A2 t
验证定制的配置文件centos.config是否生效 16376386143172.png
, j7 w. l6 O! I2 K2 n3 c
. [8 o: b( X, Q8 K实例可以直接root登陆(默认只能通过创建密钥对方式登陆)成功获取到ip,配置了yum源、时区,runcmd运行正常,关闭了selinux(power-state-change正常),产生了测试文件,修改了[url=]dns[/url]信息. a# l$ T. _9 X) o5 q4 t
9 W/ R [5 I3 u6 @- t3 r5 C
user-data:ubuntu.config root@openstack-controller:~# more /tmp/ubuntu.config
* r1 l' ^: b+ d" e- E9 Q#cloud-config
- ?% @$ D* i3 e6 ]. kchpasswd:- j; u' ~7 Z* B$ E+ `# f0 V
list: |
- Q" c3 B% p; k: \8 \# g root:rootroot
- z& I. }3 K) [2 z! g ubuntu:ubuntu
" B2 d# V" H$ V o( K0 r ~" J expire: false% ]2 L8 Z! `# w5 A8 G
ssh_pwauth: yes( S; U e& _$ ~+ l/ J
7 T3 }, }& C- U6 e3 \: | p# K, c+ Lhostname: ubuntu1604
7 X- i' U: J. Napt:8 z2 c: V( D" n% d( Y
primary:
- D) \2 a/ H8 A# g4 t" C. m - arches: [default]
: L8 v% |& D2 b) F6 ]$ q3 V! K uri: "http://mirrors.aliyun.com/ubuntu/"
# i9 u: N! I, X6 D+ I: a3 i9 p V search:4 {6 l9 S* F& |: h1 m
- "http://mirrors.aliyun.com/ubuntu/"
. F/ Y+ C$ Y0 D. E1 P) l$ E) S0 X- s0 {5 `" I
resolv_conf:/ D" L, v K/ W, H) U
nameservers: ['218.104.1xx.1xx', '8.8.8.8']
; z* f% c! S9 b searchdomains:( R C3 I7 @1 |$ K% F
- localdomain
, A0 l D1 e- r& U domain: localdomain
" x: d% x0 _# J9 M' i. Y1 k options:6 b3 F$ ]4 h% G" [6 @5 C7 h4 \+ E
rotate: true! D: m% M2 e6 y
timeout: 1
6 |* x: Y) u) g8 K9 z5 u9 Bmanage_resolv_conf: true& z; e0 d/ S8 J9 }! I5 G3 Q/ o
packages:8 Z" `; L% [4 K) A' s
- apache2 I) O: _- X3 P& ]0 v$ X% i
timezone: 'Asia/Shanghai'
" s' l7 U, c3 Z, d# e; Eruncmd:
$ j( X$ O5 z) o7 X) a2 j# g - [ mkdir, /dropme ]
/ Z& v' [- X, j; H$ O4 f - [ sed, -i, "$a nameserver 114.114.1xx.xxx", /etc/resolv.conf ]' t. q# n8 t* Z5 a
* k& }8 K0 T+ n6 R# M3 ]# ]! ]+ W$ ~+ w* R) N
验证是否生效
* o3 |! }0 s' Y& ]% U% g- _& t 验证定制的配置文件ubuntu.config是否生效 16376386143172.png2 w3 |! Y( i! r6 W
实例可以直接ubuntu登陆(默认只能通过创建密钥对方式登陆)成功获取到ip,配置了hostname、apt源、时区,runcmd运行正常,产生了测试文件,修改了dns信息 + }. _8 N; z8 `; m
查看config drive sr0就是config driver,挂载并查看
: C* M. g% ?6 ]5 ~# B( [ [root@centos7-init ~]# lsblk 7 N c. ]0 ~' A
/ ~" J- W6 M! L: @[root@centos7-init ~]# mount /dev/sr0 /mnt! T2 h( P. p4 F- y. N
[root@centos7-init ~]# cd /mnt/openstack/latest/ && ll
8 l& A* B6 y/ M9 ~/ F* g4 p5 w Y4 A/ s T( H" D
[root@centos7-init latest]# more meta_data.json
" W6 l3 @* k9 x4 E( Q2 a[root@centos7-init latest]# more user_data" S+ i5 [' a$ S8 [- V! d3 E6 p
7 r, d& [4 i9 H
0 Z( A: J/ {2 L) l7 E* q3 r
# Q, j& a. e5 ]/ Z% V1 @# Imeta_data.json中存放了public_keys,hostname等信息,user_data对应centos.config。
k7 U# @* T# Zcloud-init.log日志分析 [root@centos7-init ~]# view /var/log/cloud-init.log第一阶段服务& C" F: Y, a2 K" i5 i/ K
! Y* e& N/ ~& t8 ?! }# `5 y
第二阶段服务
2 T8 n" |1 Y! z% F$ A
( @0 h) {& g$ B! k: N! v第三阶段服务
0 K; N+ Y/ K9 V0 Q2 _- Q6 G. @: m 在第三阶段init-network服务会依次读取cloud_init_modules模块中以下配置:check-cache、consume-user-data、consume-vendor-data、config-migrator、config-bootcmd、config-write-files、config-growpart、config-resizefs、config-set_hostname、config-update_etc_hosts、config-rsyslog、config-users-groups、config-ssh
* W" a; T; i- @# b8 D- d$ O第四阶段服务 在第四阶段modules-config服务会依次读取cloud_config_modules模块中以下配置:check-cache、consume-user-data、consume-vendor-data、config-migrator、config-bootcmd、config-write-files、config-growpart、config-resizefs、config-set_hostname、config-update_etc_hosts、config-disable-ec2-metadata、config-runcmd
, K; I7 R+ z4 a第五阶段服务$ j; ?2 q0 e( K; }
在第五阶段modules-final服务会依次读取cloud_final_modules模块中以下配置:config-rightscale_userdata、config-scripts-per-boot、config-scripts-per-instance、config-scripts-user、config-ssh-authkey-fingerprints、config-keys-to-console、config-phone-home、config-final-message、config-power-state-chang , I1 ?1 X/ R* S4 c3 u
cloud-init调试 各服务单独调试' P9 |6 u2 Z6 v9 H
init-local:cloud-init init --localcloud_init_modules:cloud-init initcloud_config_modules:cloud-init modules --mode=configcloud_final_modules:cloud-init modules --mode=final[root@centos7-init ~]# cloud-init init --local
: R+ C: p) B5 t8 {+ j调试某模块的某个配置 [root@centos7-init ~]# cloud-init single --name timezone调试cloud_config_modules模块的timezone配置
4 P& U6 I$ }2 [实践总结: 1.各模块的各配置项依次读取生效
) {8 g2 E; A7 y+ z! ` 在定制实例时,会依次读取配置文件cloud.cfg配置项。 实验环境的主机需配DNS才能访问外网,通过cloud_config_modules模块的runcmd配置项配置DNS,由于配置项package-update-upgrade-install在runcmd之前,cloud-init会先安装软件,这时外网是不通的,所以报错。
" f5 x( w+ f6 E( m1 B- h2.centos的hostname设置不生效 尝试了很多参数组合,都没有到hostname,原因待查 尝试过的参数 hostname: loong576manage_etc_hosts: truepreserve_hostname: truefqdn: loong576ubuntu没有这个问题,只需设置hostname即可,重启系统也任然生效。 $ r' X8 L( ]0 W) `
3.DNS配置不生效
& q. f! G3 [" N, B" _4.runcmd执行命令是应该是双引号 这个有点坑,在用sed命令执行关闭selinux和配置DNS时,正常的单引号''需替换为"",否则执行报错。 " e" v K: g) ~6 M* |" N
5.某个配置项不合法则整个配置不生效0 t: ~: w/ g( e; `3 A5 ?: b
runmcd有个配置非法 报错日志 此时整个centos.config配置文件不生效
J) ~8 o$ ]/ x5 g4 L M& l |