|
环境: | openstack版本 | pike | | 控制节点主机 | openstack-controller(ubuntu 16.04.5) 172.27.34.373 L4 q( N: M4 X- ?' K$ u
| | 计算节点主机 | openstack-computer(ubuntu 16.04.5) 172.27.34.38 | vxlan1006 _8 n5 v, V: H P0 R+ u$ s
| centos7-init(172.27.100.2)、ubuntu1604(172.27.100.20) | centos7镜像
$ P/ j* M) X+ C' ~/ {- Z | CentOS-7-x86_64-GenericCloud-1809.qcow2c | ubuntu16.04镜像. C/ u3 Q3 i( J! @' _; C/ a
| xenial-server-cloudimg-amd64-disk1.img | cloud-init
4 C' x% U1 M) \7 H; n7 e | cloud-init 0.7.9 |
0 l/ a: w' `: W; c- uubuntu安装详见:Ubuntu16.04.5以lvm方式安装全记录 openstack安装详见:OpenStack实践(一):Ubuntu16.04下DevStack方式搭建p版OpenStack 浮动ip搭建详见:OpenStack实践(九):Open vSwitch方式实现floating IP
" K4 ~! \$ D8 B4 D! b4 J
- v b9 C6 o" k' {
4 Z$ D5 q8 c) _/ Z9 p9 O) ~$ ` g8 |$ S$ n
+ Z8 u5 f' V" v& {0 {+ b# E" f( \
cloud-init简介/ U4 f- g& s, t/ y4 B7 B
cloud-init是linux的一个工具,当系统启动时,cloud-init可从nova metadata服务或者config drive中获取metadata,完成包括但不限于下面的定制化工作:
3 J6 U" T( n6 Z9 A$ A1.设置 default locale
( Z( W- A i2 w% R) ?2.设置 hostname2 F1 S4 n f6 x# }5 b: e2 B7 U
3.添加 ssh keys到 .ssh/authorized_keys2 R$ R" D9 l, K' R7 |
4.设置用户密码# N4 O) I! u' E$ f6 d% r
5.配置网络& y( M$ h8 U4 M/ g1 C. N
: e# i( U& G6 ~% X为了实现instance定制工作,cloud-init会按5个阶段执行任务:
% S- B1 ^! S9 t0 Y- Z7 k1.Generator (cloud-config.target)% x. S3 l7 ]6 O( Z
2.Local (cloud-init-local.service)4 p8 H+ c# g: m3 m
3.Network (cloud-init.service)
$ x- l$ k' H3 d& N* W0 w+ y$ w4.Config (cloud-config.service): _; x2 \9 M# K2 _
5.Final (cloud-final.service) 如下服务: [root@ltestwithoutdhcp ~]# systemctl list-units|grep cloud-
3 ^" a. U2 C. E3 ~2 g cloud-config.service loaded active exited Apply the settings specified in cloud-config' `' e' r* n$ S; l9 v
cloud-final.service loaded active exited Execute cloud user/final scripts! c+ E# e v5 x, I. W
cloud-init-local.service loaded active exited Initial cloud-init job (pre-networking)5 T& f" O5 L: f( V
cloud-init.service loaded active exited Initial cloud-init job (metadata service crawler)
! s- d- R$ Q5 o2 W cloud-config.target loaded active active Cloud-config availability
8 N: K2 A- ?) z8 ^ cloud-init.target loaded active active Cloud-init target
( m$ {5 @' u3 O, Q% l
$ R/ ?3 X: i1 x. K& ~6 ~) [4 ~2 v5 D5 }9 X! N. Q
各阶段作用 Generator:读取配置文件cloud.cfg; Local:定位“本地”数据源和配置网络; Network:读取cloud_init_modules模块的指定配置; Config:读取cloud_config_modules模块的指定配置 Final :分别读取cloud_final_modules模块的指定配置
7 x/ p" y: f7 l1 n# A h( e l6 ncloud_init_modules:1 b% M1 K+ ^8 L/ @
- disk_setup
3 F$ T0 z2 ? i$ f* P/ c0 e* a& j - migrator- E. r; b, s2 `' P) ?7 I
- bootcmd
1 F! P6 d& F: Q - write-files
, o4 O" l9 ~. t) H8 V - growpart2 m! e: `# G$ `" J' L1 E
- resizefs5 K' ]) x4 k! T8 y1 ?5 N
- set_hostname3 `$ Z7 {' ?" i/ W; x
# - update_hostname
4 [0 ?$ o% q2 d& n& { - update_etc_hosts
( i) P1 Y0 j$ w# m) I% d - rsyslog
' p4 ], A* I/ Y9 [! N5 x* b - users-groups+ h l" X7 H8 Y
- ssh cloud_config_modules:8 f. Q' H* g) r p
- mounts
@6 K8 X6 X0 N! Y4 X - locale
9 y2 ?7 N- q- N) \1 w& x - set-passwords/ b8 w$ t6 ^$ N D% ]0 A6 f1 I
- rh_subscription
% M0 R5 X8 R* Q; h' b7 u$ A - yum-add-repo/ x% p4 |8 q# Z
- package-update-upgrade-install
) M$ i. I2 }2 D/ ~ - timezone
6 ` v7 p! u& a. f - puppet
, B# O3 D e7 M0 v6 T1 o/ i2 ~ - chef
- H8 u) l3 l& |" F2 ?6 k6 A2 d - salt-minion
( j$ e( R" {7 v3 R% a1 X - mcollective
5 J" H( y* i1 ]( C - disable-ec2-metadata
0 a% l1 w& O; g3 X! h# k* J/ Y# e - runcmd cloud_final_modules:. y1 C) }$ n$ F8 D# ~
- rightscale_userdata3 a& J, ^9 y/ l2 Q% d% X
- scripts-per-once
* {7 b/ D9 `. N$ S - scripts-per-boot
f: n1 f- | ~0 ?. t% E! R - scripts-per-instance% h, b- V* `, [$ h# }( ?: J
- scripts-user* @( N# i0 R& P. e7 g! J j
- ssh-authkey-fingerprints& J( D$ A" W. \5 P2 P0 _
- keys-to-console$ u7 [+ \5 B; ]
- phone-home s4 X: g$ g% q
- final-message
4 |8 H$ ^) `* D% @7 n: S7 m- ] - power-state-change
G2 U0 k2 p$ Q. d% p; `8 K
; s5 _& R9 [7 h& d1 m/ B
7 j8 Q# |- c q) C
& {5 q T. A" _7 Y& Y/ l; Econfig drive- h" x8 K! j' v3 X6 W
当无dhcp服务时,可以通过config drive获得metadata 配置config driver [root@compute01 nova-compute]# view /etc/kolla/nova-compute/nova.conf
& y8 w" X5 k+ [[DEFAULT]
2 H6 \7 I& n& f; J6 b d! d1 R9 t: ~/ _% a; L; D
@4 n/ k, Y. x4 s
flat_injected = True
( D. F" p" A# B* C' @8 v% J A' y$ \& N/ r# |# H- L7 M
该配置是为了关闭DHCP服务时实例网卡也能被正确配置,重启计算服务后配置生效。 stack@openstack-controller:~$ sudo systemctl restart openstack-nova-compute.service
. A6 S/ U0 L( ]$ X- A1 r0 {" }
5 `8 w$ o# D+ k! _关闭dhcp 为确保实例通过config driver获取的metadata,这里关闭dhcp服务( H. F) p% g, ]4 w% D e
9 R+ C4 }, p: ^企业微信截图_163763823247 ...3 z# K$ f' G) v1 f) o3 [% @
启动实例 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
- B( ]0 \7 K2 V) n" v; h绑定浮动IP
' N0 d7 m, E! w; z) h+ y
1 o& c( R8 L- i; Huser-data:centos.config #cloud-config1 u( M8 B& Q8 K6 f' l
chpasswd:
+ y8 Z2 F' H# k- ]2 T3 s: y list: |
* o+ B" J! k" ?) ]1 b! G8 r7 L root:rootroot; P; T8 J, e9 u$ {2 M F+ b/ o
centos:centos
2 d# J, b, P8 F' T expire: false% B' Q) t( g( L7 F$ Q
ssh_pwauth: yes
4 j r$ P( h) c7 V. phostname: loong576- Q/ Y( M7 ~6 Y* A* e F
yum_repos:
! D! S: d. X4 c- p1 f epel-163:
( B: f- u1 n3 t ?: n, b baseurl: http://mirrors.163.com/centos/$releasever/os/$basearch/
. V9 q, T9 q. @) a; X name: Centos-7
* d+ G* ~# s0 s enabled: true# V* a A( i4 y3 p K
resolv_conf:: Q1 G1 S$ U* Q+ d) l3 }+ Z
nameservers: ['218.104.1xx.1xx', '8.8.8.8']7 ~( u8 b$ z6 `' b) t) \
searchdomains:
5 h7 t M7 n; r P; }! G. l - localdomain
, @0 |' d% E% z. H( f domain: localdomain7 O. E) f$ q3 m: r$ v/ O- f7 G
options:
: z* T. E% M0 ^" P3 X. | rotate: true
6 g) L% p; t+ F& N* L+ v timeout: 1
( b* V' }. J, e/ s, C4 Z5 ymanage_resolv_conf: true* w( o/ S# w' M O+ c8 ^
' H4 u% t. L& [4 \6 r# npackages:
6 i: G- P J, |3 M+ n+ | - vim6 n2 \, L" ^& E% Q- [9 I
- wget- L, S; M% s7 H6 b+ u* d7 g- j. c
- httpd' A5 r7 I/ M$ D+ h& j( [
timezone: 'Asia/Shanghai'6 K( u& l5 y1 ?: M, ~& |
runcmd:
7 T: M- y6 J+ L - [ sed, -i, "s/^ *SELINUX=enforcing/SELINUX=disabled/g", /etc/selinux/config ]
2 P w5 X/ T& r/ i6 s* R! c - [ mkdir, /dropme ]5 Z& S0 k) v" t9 G1 T2 q, D
- [ touch, /root/abc.txt ]) t% M& A8 ^1 G ^) @+ s- v
- [ sed, -i, "s/^ *nameserver.*/nameserver 114.114.1xx.1xx/g", /etc/resolv.conf ]
* @" E3 }+ h, s+ Y, h& L - [ rpm, --import, /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 ]
. p9 z' G' [( d# M% S1 \power_state:# R; `" L. j1 T0 a
delay: now
; C4 R/ f S' ^. F mode: reboot
0 }& a' s" ]) g2 i+ v5 X message: reboot now
8 \ Y- m9 V% O8 k timeout: 30% c6 E* m j" o2 G* G0 }0 b# A- o
condition: true
7 \0 F- B4 G1 D: V' r
/ Y3 g* V' y; ^. l, a6 ?% K验证是否生效
, S- i7 n2 B+ U5 F2 B$ U1 L A 验证定制的配置文件centos.config是否生效 16376386143172.png
* ]1 t$ z+ K* i. ]& S$ R
5 [2 G q( U: j实例可以直接root登陆(默认只能通过创建密钥对方式登陆)成功获取到ip,配置了yum源、时区,runcmd运行正常,关闭了selinux(power-state-change正常),产生了测试文件,修改了[url=]dns[/url]信息; p- g4 r& q! {' A- z" u
. K, j' e$ N9 q- b: a( d( I
user-data:ubuntu.config root@openstack-controller:~# more /tmp/ubuntu.config( `5 R0 q. B \, ?
#cloud-config
3 `2 I7 R3 t0 ?chpasswd:
( n' e' Y5 h; `2 ? O' z( ?, Q7 ] list: |3 A, n. j: ]! J2 u
root:rootroot5 K# Y/ ~; p9 |9 Y _
ubuntu:ubuntu$ B- Z, `) ]7 W5 T8 y' ~
expire: false
' A4 A8 \+ `( E; d5 n u: x" d3 Sssh_pwauth: yes" d% h$ I( c* N
0 v. j& a6 T5 j+ ]hostname: ubuntu1604$ C8 ^0 d m3 M; K; z
apt:
! I8 E \- k8 g2 e7 C5 w1 m primary:
7 _( d7 w$ d- C% B( N0 h+ m4 n; c5 d - arches: [default]! n1 F2 }2 F- b9 ^2 Q
uri: "http://mirrors.aliyun.com/ubuntu/"9 ^* U2 o D7 |* M. p0 g0 }( b
search:
* O/ E+ ~- C; [7 ^( P - "http://mirrors.aliyun.com/ubuntu/"
8 r/ O( u4 ?1 u, B. E- J
w/ x2 p% C* X M5 v6 oresolv_conf:+ A$ f4 r" h1 h) ?3 j, d" ]# N
nameservers: ['218.104.1xx.1xx', '8.8.8.8']
9 {9 v# }: m h/ t/ x5 ?* m1 J searchdomains:4 P( A! d. [; J0 B: P
- localdomain# ~# ~6 ]7 t$ G- w( z
domain: localdomain7 W8 K- W' `( D7 i: C. m2 ?
options:: i( g+ }. m b' j D/ w- y: e
rotate: true
5 n0 y3 E3 y+ Z" D: ^4 u, G timeout: 1
( s. r! L% s% `/ w" `manage_resolv_conf: true ?' w w. i$ Q8 o0 g- ?% J
packages:8 L+ |0 o% U1 j5 N& e5 S
- apache2
+ B& a/ F K [! [9 H) R& Ytimezone: 'Asia/Shanghai'9 Q( d7 u" {# C$ V9 D" g
runcmd:4 z8 g: h( G9 c* ^5 k2 s/ D
- [ mkdir, /dropme ]
- u3 k: f `! l! u& U9 A# i" u - [ sed, -i, "$a nameserver 114.114.1xx.xxx", /etc/resolv.conf ]
: t: j5 z$ J( Z
; a1 l7 @, F% |2 S: Y' F
( \7 y* n4 M! c; k验证是否生效- |* i/ Z4 T' O2 J& G( m
验证定制的配置文件ubuntu.config是否生效 16376386143172.png
9 R1 d( N+ Y* g& g1 d+ L) X5 K 实例可以直接ubuntu登陆(默认只能通过创建密钥对方式登陆)成功获取到ip,配置了hostname、apt源、时区,runcmd运行正常,产生了测试文件,修改了dns信息
4 R- U7 Q6 ^* }$ V$ q6 C$ f' R6 {查看config drive sr0就是config driver,挂载并查看( J) `$ T( O5 l. r
[root@centos7-init ~]# lsblk
$ A/ ~" R: V6 Z( L3 U% y7 I) |9 o, B. i7 r
[root@centos7-init ~]# mount /dev/sr0 /mnt
% Y, A& U5 C, y7 ^4 Q[root@centos7-init ~]# cd /mnt/openstack/latest/ && ll
4 I$ q9 J* n( H6 Q
, {9 `9 ]3 z1 l/ Z! w, T% {[root@centos7-init latest]# more meta_data.json
8 S- @% x) [! O9 w" E[root@centos7-init latest]# more user_data
9 B R; ^1 ?3 q! H4 U+ ^/ Q% w! Y' x: j/ q& M( j
7 R7 t9 M% }/ g4 r. w5 {
$ K/ n; v! N+ l! k% F& Ameta_data.json中存放了public_keys,hostname等信息,user_data对应centos.config。
+ l E! a A, f8 Y) t- b% \cloud-init.log日志分析 [root@centos7-init ~]# view /var/log/cloud-init.log第一阶段服务
2 M/ I% d7 I. o4 F
& ^. J2 g6 h$ e8 T( j* l) b5 X, Y" c第二阶段服务' c! l( C, _1 M
- T- v6 W1 p' K( u; q" a- ]
第三阶段服务/ N, t* ?6 T2 B( t' K: \8 U
在第三阶段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 2 `$ R% o% K O! Y; y% s4 ]
第四阶段服务 在第四阶段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 . O: h* J# ? Q+ @" j) F7 J+ o; x
第五阶段服务
. ^, l7 w6 m# U, w 在第五阶段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 $ M# O" s* X, X4 e8 z
cloud-init调试 各服务单独调试4 }: K/ L9 V& J+ I, y6 f& @
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
& \2 e( A" q2 _) V调试某模块的某个配置 [root@centos7-init ~]# cloud-init single --name timezone调试cloud_config_modules模块的timezone配置 " w7 A, z; w. Q. W
实践总结: 1.各模块的各配置项依次读取生效
% Q7 X3 I' c+ { S1 ?$ M0 e 在定制实例时,会依次读取配置文件cloud.cfg配置项。 实验环境的主机需配DNS才能访问外网,通过cloud_config_modules模块的runcmd配置项配置DNS,由于配置项package-update-upgrade-install在runcmd之前,cloud-init会先安装软件,这时外网是不通的,所以报错。 # y' H, e- ]! Z# \
2.centos的hostname设置不生效 尝试了很多参数组合,都没有到hostname,原因待查 尝试过的参数 hostname: loong576manage_etc_hosts: truepreserve_hostname: truefqdn: loong576ubuntu没有这个问题,只需设置hostname即可,重启系统也任然生效。
L6 a5 ` B# _2 t. i! {4 `3.DNS配置不生效
1 Z: l! Y9 ~0 f4.runcmd执行命令是应该是双引号 这个有点坑,在用sed命令执行关闭selinux和配置DNS时,正常的单引号''需替换为"",否则执行报错。
$ B1 a0 K+ J5 ~$ B5.某个配置项不合法则整个配置不生效6 G7 T0 h5 \: N1 z- n4 i
runmcd有个配置非法 报错日志 此时整个centos.config配置文件不生效
, p8 O! s" k- w# `3 B |