|
环境: | openstack版本 | pike | | 控制节点主机 | openstack-controller(ubuntu 16.04.5) 172.27.34.37* N9 ]$ s0 I9 ~
| | 计算节点主机 | openstack-computer(ubuntu 16.04.5) 172.27.34.38 | vxlan100* W3 o2 g0 y7 y# w2 W
| centos7-init(172.27.100.2)、ubuntu1604(172.27.100.20) | centos7镜像
0 I, ?# J; f5 b& K% d | CentOS-7-x86_64-GenericCloud-1809.qcow2c | ubuntu16.04镜像0 k1 y2 X6 @' @
| xenial-server-cloudimg-amd64-disk1.img | cloud-init9 k' O; p! U8 b; i$ B6 P* ~
| cloud-init 0.7.9 | / z) F6 n% N r7 c+ ^
ubuntu安装详见:Ubuntu16.04.5以lvm方式安装全记录 openstack安装详见:OpenStack实践(一):Ubuntu16.04下DevStack方式搭建p版OpenStack 浮动ip搭建详见:OpenStack实践(九):Open vSwitch方式实现floating IP5 a/ I' b0 _7 S$ R0 z
3 U" n0 a; U0 D( Z5 O2 ^
1 c. Z- _3 \" o3 a/ y [& V9 a/ H
; Q2 p3 Q4 Z7 y5 t
8 @7 |. N- T7 t) J! w }cloud-init简介
* s8 R. `4 h; l! k8 d- x% t7 G cloud-init是linux的一个工具,当系统启动时,cloud-init可从nova metadata服务或者config drive中获取metadata,完成包括但不限于下面的定制化工作:
; d2 [5 b0 Y i1.设置 default locale5 v. y e2 i9 W( n9 f/ M7 @$ v) i, z
2.设置 hostname0 d4 V5 g( w" Z9 P1 S
3.添加 ssh keys到 .ssh/authorized_keys
. @1 `) A) {4 S% O) }) x% m" z4.设置用户密码( @- U) e5 x5 H8 ^# U
5.配置网络4 B- b1 Z: M- R+ w
( B/ i0 `2 r) m) B5 t为了实现instance定制工作,cloud-init会按5个阶段执行任务:
. c; L! `% Z0 H$ ?4 X) v& e1.Generator (cloud-config.target)5 @( s2 P1 ^% k5 I, x
2.Local (cloud-init-local.service)
1 f5 h8 @/ O) C& A4 B# L3.Network (cloud-init.service)
* ~3 D4 s( g) }/ a8 X, X9 \9 r4.Config (cloud-config.service)
7 h0 R2 r3 O- D5.Final (cloud-final.service) 如下服务: [root@ltestwithoutdhcp ~]# systemctl list-units|grep cloud-4 D4 V* Q6 f% V( N/ y) M" I A
cloud-config.service loaded active exited Apply the settings specified in cloud-config, P/ E6 X" t' C+ K
cloud-final.service loaded active exited Execute cloud user/final scripts
, @- d$ a" c3 o/ K cloud-init-local.service loaded active exited Initial cloud-init job (pre-networking), a* w7 _1 J# n% `+ N
cloud-init.service loaded active exited Initial cloud-init job (metadata service crawler)9 f2 r' Q$ X8 ]+ Q8 E0 z
cloud-config.target loaded active active Cloud-config availability
+ y% V. ? h% W6 ? cloud-init.target loaded active active Cloud-init target . G [% j) |; `' S% v, N/ K
6 i7 `2 S; O) H& k: k
w4 X- z$ ?; F7 Z' g各阶段作用 Generator:读取配置文件cloud.cfg; Local:定位“本地”数据源和配置网络; Network:读取cloud_init_modules模块的指定配置; Config:读取cloud_config_modules模块的指定配置 Final :分别读取cloud_final_modules模块的指定配置
1 A# t5 V5 B2 b f) Ocloud_init_modules:$ }0 \* J3 M ~' U" r: ^
- disk_setup
6 S! j2 C; N; u: G4 e/ D3 t" U( J6 A6 | - migrator0 e# [% Y, q( A. q% f1 L9 |
- bootcmd
+ l& H; t) L% B" ? - write-files
% J9 C, R: L9 X! k$ s- B - growpart
: T* `: X, W4 d7 Y - resizefs. \4 Q, U8 }+ `# d2 \7 T
- set_hostname
5 P. U( X" l- f j) E5 ^6 c7 t4 ]# - update_hostname& {3 r/ K5 ^3 H
- update_etc_hosts
: o# ^4 r; a+ q2 k, J - rsyslog
! h+ F( N% u4 x; Z% n: f - users-groups- m, M" R2 s% Q* {7 f: G5 A
- ssh cloud_config_modules:
$ u+ m2 Q: a7 Z0 q/ Q1 b - mounts
% C6 X- W1 L( g$ V' ], I. { - locale: [1 u( `6 e* S% q' \' T5 Z2 H k& T
- set-passwords
+ f( S6 v. Q( d1 x6 b" K - rh_subscription+ W f# }# e5 O: M9 J ~1 e
- yum-add-repo' K3 S4 V. \ I0 e6 W
- package-update-upgrade-install
2 R0 E0 a% S) G% n7 @0 I, B7 g8 O! E - timezone
* J- p$ y/ k2 ]' R' l% @! p G% [ - puppet& J; o* e- X, y |& s! o6 J* ~# g1 _
- chef2 c( a+ Y1 G/ Z4 ]8 W) i
- salt-minion+ M" e7 ~" h; A* u
- mcollective9 k3 f5 Q# b H" H* g2 q! O+ G. H
- disable-ec2-metadata/ u4 |6 o! m. T% D0 ~4 z+ N
- runcmd cloud_final_modules:
. Q) z. Y' y+ J" {! Y( H4 c - rightscale_userdata
6 e: G% C, A1 S3 E: ]7 G - scripts-per-once
: v9 x5 W5 G, O/ `" i: q - scripts-per-boot
5 ^- Y) [& ^2 B( T$ C- X% y - scripts-per-instance
: _$ c- ]6 |: | - scripts-user
+ \3 Q7 W# {/ {# g$ | - ssh-authkey-fingerprints
$ Y. C- C2 k9 K k0 j: u - keys-to-console4 l2 j4 o- |( K( }, w/ b7 j7 _
- phone-home: v+ b7 j9 ]# h# [
- final-message
9 h: h# U, f% c0 r3 V/ y% S/ ` - power-state-change - s2 a& Z! v& N' l W: _! A; T
4 E- s$ \1 |2 c N
/ u9 n- X; C* e: g0 K! @9 U& x% m# x% Q
config drive
( p1 ] Q# `# [) Q D" s5 R 当无dhcp服务时,可以通过config drive获得metadata 配置config driver [root@compute01 nova-compute]# view /etc/kolla/nova-compute/nova.conf / o( e7 S( B( E- A5 U9 c7 [' |* L }
[DEFAULT]
! K4 b0 C) ~4 `: a+ y$ I! W
4 N0 ]3 d; T, E4 a
0 u7 W+ R# }, Bflat_injected = True9 J& `' O8 |& V3 U! X' f
: b$ e$ B3 ], N& m, k7 b0 O该配置是为了关闭DHCP服务时实例网卡也能被正确配置,重启计算服务后配置生效。 stack@openstack-controller:~$ sudo systemctl restart openstack-nova-compute.service7 ^5 p2 U* n" i( g" F1 ]
^% h2 Q1 C( O R' p Q
关闭dhcp 为确保实例通过config driver获取的metadata,这里关闭dhcp服务
) ?/ D) n8 i# S/ v. _& |6 t 4 o V, v7 X, D8 ?+ y
企业微信截图_163763823247 ...' h& H& @" G# B( l$ B$ Y
启动实例 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 9 T% W- p# {$ s; Z/ Z
绑定浮动IP
( E( f) Z8 c9 p/ p
9 l+ p$ s( P4 J7 e1 ^user-data:centos.config #cloud-config5 C. Q5 V1 o2 y/ K: o( `" G5 N
chpasswd:
2 M8 h( W' A3 V7 Q3 _' V! g3 G$ n list: |
4 n7 l2 I5 I( o* c! g root:rootroot( W8 C& [; x. c. \2 a. e" D- m
centos:centos
+ ?4 @" ]% K n expire: false" p' M1 e, k, d+ L
ssh_pwauth: yes
3 a, c: E- ^+ q5 j+ Thostname: loong576
1 }4 l2 I1 N7 _yum_repos:" e9 k' J+ b& B
epel-163:, L9 R* a$ ^) ^% r9 q
baseurl: http://mirrors.163.com/centos/$releasever/os/$basearch/
6 s( w, a, u# R name: Centos-7
1 [' I: h: @$ K enabled: true
# j( q& q% t% ?1 H# s# Gresolv_conf:
$ i6 N: I2 N2 ^ nameservers: ['218.104.1xx.1xx', '8.8.8.8']
$ o2 i) ~( E) A3 _' P0 `& Q% I searchdomains:- Y# \$ R3 G: B, X/ L3 S
- localdomain( \$ c4 G$ o0 j
domain: localdomain. T) V) q& F/ b1 A& D' D( z4 h, I5 S) x
options:
1 `8 I: K% d% M V rotate: true
5 z# K' J Y; k8 K9 i s, h" q. I timeout: 1
7 q i% i/ I/ `' G3 m8 c, Dmanage_resolv_conf: true
3 o. V; C! M k/ S
9 a2 t- u4 X6 a+ f! a' q5 k3 Upackages:) K3 L, W& I/ E5 K
- vim4 d. G3 t/ `0 ~1 ^- L
- wget% l( T5 H6 M( i! |
- httpd
4 C9 ~- t; ^/ P, J- z- D: ]2 `timezone: 'Asia/Shanghai'
) K/ F& Z3 g+ k1 C3 e, o( f! jruncmd:! |' G& Q/ _% ^: @5 k K* q* V
- [ sed, -i, "s/^ *SELINUX=enforcing/SELINUX=disabled/g", /etc/selinux/config ]
. f( a& h6 o3 d9 S - [ mkdir, /dropme ] b6 E$ p) x o, D" D
- [ touch, /root/abc.txt ]9 A$ z( O! ^. g+ ]7 W
- [ sed, -i, "s/^ *nameserver.*/nameserver 114.114.1xx.1xx/g", /etc/resolv.conf ]
5 j5 w/ v, F0 w) y8 G) \ - [ rpm, --import, /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 ]
: }/ s+ b$ k: J. _8 e) Gpower_state:
, _- L- \& \8 g! @: K5 f delay: now, i- O- |; L8 h2 Z
mode: reboot
: r9 g' ^9 x2 ?6 ?+ f2 ? message: reboot now
! i+ @6 O3 b& M/ b% ^1 B8 u timeout: 303 N- r4 b* Q! h
condition: true3 a* a8 ]5 h; F" U- {& g/ L
; u' y3 i2 b! @) y- p, [( B8 Y验证是否生效3 ?, u9 P5 U4 s6 @. c: T8 w
验证定制的配置文件centos.config是否生效 16376386143172.png
$ r% M) J2 O, M6 ~3 a8 f: t- I" L8 t
实例可以直接root登陆(默认只能通过创建密钥对方式登陆)成功获取到ip,配置了yum源、时区,runcmd运行正常,关闭了selinux(power-state-change正常),产生了测试文件,修改了[url=]dns[/url]信息4 R/ m& G# B& a0 |
$ I+ n, ]9 w i( @8 U6 y
user-data:ubuntu.config root@openstack-controller:~# more /tmp/ubuntu.config( p( H0 q; k* n) q2 B
#cloud-config, N6 e$ l0 P0 T
chpasswd:
2 u. m/ W" f8 `! S' M1 A, b' l1 U list: |/ b, y5 T' w) S
root:rootroot1 f2 F+ o9 d* z9 c0 ^3 ?8 Q
ubuntu:ubuntu. I$ N5 U) |6 n
expire: false
# o" o2 S7 d( b& P+ Lssh_pwauth: yes z! m7 ^$ E$ F2 V: {* x+ {
0 o3 H3 l, v% [8 b2 i
hostname: ubuntu1604
- O3 }: \% A3 N9 aapt: u+ \7 N, W- i) y3 ?0 z
primary:
# u$ U5 w# W" A1 ?3 O - arches: [default]- `4 E2 v$ F6 N" M8 _4 Z
uri: "http://mirrors.aliyun.com/ubuntu/"8 }4 h* P( P* r8 i" q( A
search:# t0 w+ @- |# A& u7 k
- "http://mirrors.aliyun.com/ubuntu/"
3 `6 t6 s) O9 k
" {, O0 o. W4 Kresolv_conf:
3 M) R4 h; i6 J) J4 x+ w% V% h4 ]+ E nameservers: ['218.104.1xx.1xx', '8.8.8.8']. |) l) `* w6 Y' l# s' U6 Y+ B
searchdomains:
# `* ^4 ?2 Q1 x. S( G - localdomain5 _/ s4 G$ O% ~$ M
domain: localdomain
4 Q7 M) o# F0 ?. n options:: i, B `2 B" E$ N8 R
rotate: true
- i, F/ t0 }0 S7 b4 w* [- S# H/ n timeout: 16 V5 K P% h# p
manage_resolv_conf: true9 }0 l- |. [1 z
packages:! p$ K- E; z( S$ i: b( S5 S
- apache2
7 P i' t. f+ |4 H F. P, T$ [timezone: 'Asia/Shanghai'
$ |+ U; ^5 v0 a5 z, ]runcmd:
; ?9 H. m) N. i0 _3 I$ r - [ mkdir, /dropme ]
3 `& R9 U* p7 E( ~" i, A - [ sed, -i, "$a nameserver 114.114.1xx.xxx", /etc/resolv.conf ]
) O1 N" ]" I9 ^( j: M7 m5 L& H- J( ?7 ~9 i+ S
3 d# Z# z& N! p8 r9 v4 B
验证是否生效# S, H0 C8 Z% k# U5 [0 Q* C
验证定制的配置文件ubuntu.config是否生效 16376386143172.png) T# u; C2 D1 B: S3 e' x
实例可以直接ubuntu登陆(默认只能通过创建密钥对方式登陆)成功获取到ip,配置了hostname、apt源、时区,runcmd运行正常,产生了测试文件,修改了dns信息 2 {. G2 G% } w5 ^2 p( d3 s
查看config drive sr0就是config driver,挂载并查看
) d2 |# k# q( q6 ]. ^ [root@centos7-init ~]# lsblk : G3 E- }; C0 V
$ J( r% P, q* K; f# r Y[root@centos7-init ~]# mount /dev/sr0 /mnt3 R3 e* \5 Q3 P
[root@centos7-init ~]# cd /mnt/openstack/latest/ && ll5 W# _, e, v: `' C
, Q1 ]' b+ y0 x" c! A' N$ i
[root@centos7-init latest]# more meta_data.json
* r. E# b3 E. v- G+ e& y[root@centos7-init latest]# more user_data
% U$ X+ A. f3 [) T! D1 o6 H( ~- ?# H; `- }: l- i
# ]1 w6 y* z) K0 @4 G# n3 W7 E$ f3 j/ R# @
meta_data.json中存放了public_keys,hostname等信息,user_data对应centos.config。 ' j. t! X2 h' f6 e! z5 [
cloud-init.log日志分析 [root@centos7-init ~]# view /var/log/cloud-init.log第一阶段服务3 a4 t* a k; {* Z" ?4 v
6 O W+ h4 T. `第二阶段服务4 Y( h6 i% n+ F5 o( P: m
4 a0 E% w2 A4 r: A* H# y4 j
第三阶段服务. R7 M4 ~% _) O4 S: u8 l$ y7 u s% I
在第三阶段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 $ _8 p1 d2 A! w; r4 d; @8 {
第四阶段服务 在第四阶段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
: q0 C- Z4 Q1 D( d8 f第五阶段服务# Y/ K& e$ ]) E& m- M% ~
在第五阶段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 f0 |6 Q3 y! t) |
cloud-init调试 各服务单独调试0 W5 J. N% {/ [# b2 I- Q/ O! V. V
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
+ @' W8 `5 c; R* u* ~3 f调试某模块的某个配置 [root@centos7-init ~]# cloud-init single --name timezone调试cloud_config_modules模块的timezone配置 ) _' d& G1 f2 M) |9 f# Y: Z
实践总结: 1.各模块的各配置项依次读取生效6 x: `7 n3 \7 F
在定制实例时,会依次读取配置文件cloud.cfg配置项。 实验环境的主机需配DNS才能访问外网,通过cloud_config_modules模块的runcmd配置项配置DNS,由于配置项package-update-upgrade-install在runcmd之前,cloud-init会先安装软件,这时外网是不通的,所以报错。
: x7 N2 p; l8 \ W/ `. v+ [. e2.centos的hostname设置不生效 尝试了很多参数组合,都没有到hostname,原因待查 尝试过的参数 hostname: loong576manage_etc_hosts: truepreserve_hostname: truefqdn: loong576ubuntu没有这个问题,只需设置hostname即可,重启系统也任然生效。
: d- M# x/ H3 X! K. V+ O3.DNS配置不生效 l# U# w/ ?4 \
4.runcmd执行命令是应该是双引号 这个有点坑,在用sed命令执行关闭selinux和配置DNS时,正常的单引号''需替换为"",否则执行报错。 & X2 A9 Y1 [" D! Z8 ?* x
5.某个配置项不合法则整个配置不生效4 ~ X1 j+ }+ K1 n7 W$ d7 D% ~
runmcd有个配置非法 报错日志 此时整个centos.config配置文件不生效 ' |% V G3 x& ~
|