|
环境: | openstack版本 | pike | | 控制节点主机 | openstack-controller(ubuntu 16.04.5) 172.27.34.372 S' x: q9 i* q! ?, C7 b- N
| | 计算节点主机 | openstack-computer(ubuntu 16.04.5) 172.27.34.38 | vxlan100
& [- M2 Y, x5 g+ j! k | centos7-init(172.27.100.2)、ubuntu1604(172.27.100.20) | centos7镜像" g) H- W2 U2 g, I
| CentOS-7-x86_64-GenericCloud-1809.qcow2c | ubuntu16.04镜像, a/ T, d3 U3 A
| xenial-server-cloudimg-amd64-disk1.img | cloud-init
9 C) I7 _/ x8 q9 [) B | cloud-init 0.7.9 |
( e( |. R; H" k+ ~: G9 ^5 kubuntu安装详见:Ubuntu16.04.5以lvm方式安装全记录 openstack安装详见:OpenStack实践(一):Ubuntu16.04下DevStack方式搭建p版OpenStack 浮动ip搭建详见:OpenStack实践(九):Open vSwitch方式实现floating IP h: j% U) x0 ^# W
7 q# E0 r& K) F) T( L! I1 a4 N- T$ `: G% S# ]/ F: J" _
; t1 w( A2 y/ x
8 A5 @: t/ F' B9 F; P! Hcloud-init简介
& M( }/ z! Y/ z: e; [ cloud-init是linux的一个工具,当系统启动时,cloud-init可从nova metadata服务或者config drive中获取metadata,完成包括但不限于下面的定制化工作:
% T/ p1 w* z$ w: M1.设置 default locale
' \8 D! T: V9 l) E2 A6 R2.设置 hostname, p; d4 Z& `2 U2 R( H% G9 D/ z+ b+ v
3.添加 ssh keys到 .ssh/authorized_keys
: \- F3 e }$ T( h4.设置用户密码4 L5 U7 i- \3 m2 ]- u
5.配置网络1 v- T/ L; Z' `/ m( P; `' W0 Y7 ~
6 @9 C7 ]" j2 h8 l; ^" O为了实现instance定制工作,cloud-init会按5个阶段执行任务:1 H9 _0 K( i2 v/ H
1.Generator (cloud-config.target)% {7 B7 y9 L6 l5 N
2.Local (cloud-init-local.service). J# V: [7 M2 a6 d4 I+ Q8 j
3.Network (cloud-init.service)1 C2 U8 o" y; _0 p- q2 B- J
4.Config (cloud-config.service)
& D, X- G% \3 d$ Y( s5.Final (cloud-final.service) 如下服务: [root@ltestwithoutdhcp ~]# systemctl list-units|grep cloud-
2 j; z! J6 [2 ?% W cloud-config.service loaded active exited Apply the settings specified in cloud-config1 N3 r; \1 L; ^7 h( g
cloud-final.service loaded active exited Execute cloud user/final scripts
' {2 y4 L6 f3 \ cloud-init-local.service loaded active exited Initial cloud-init job (pre-networking)- u, ~8 f/ a+ Z/ I
cloud-init.service loaded active exited Initial cloud-init job (metadata service crawler)
' T, ]3 S" S+ O4 Y9 d cloud-config.target loaded active active Cloud-config availability
2 D4 r+ @$ h% N% m8 Y cloud-init.target loaded active active Cloud-init target 8 A Y6 u8 h2 i, ?
: F0 p/ t, {5 s z# d( V$ {0 A
) S$ z1 o* i9 F% A+ ]6 m各阶段作用 Generator:读取配置文件cloud.cfg; Local:定位“本地”数据源和配置网络; Network:读取cloud_init_modules模块的指定配置; Config:读取cloud_config_modules模块的指定配置 Final :分别读取cloud_final_modules模块的指定配置 , ~! @4 f+ ^/ [+ \
cloud_init_modules:" P0 }/ r0 d7 }/ z0 G9 D
- disk_setup+ z! U! b9 }& Z: e* T9 K
- migrator: b, @* H& P/ c' @* P+ l
- bootcmd
% q) g' o7 U u8 V9 ]: [/ n+ L - write-files
- H1 a4 R/ F* ]$ W$ j0 w - growpart
$ S- F, V& V4 h, I N - resizefs' G2 y$ z. Y( [4 L% D5 M
- set_hostname
3 F M# R8 Z( S# - update_hostname4 c9 J5 i$ B4 r% Q$ p
- update_etc_hosts
* f. J7 V0 K+ M* T1 p j - rsyslog
7 r9 M2 Q% @& q# ^ a5 r9 o2 w - users-groups8 l% Z% ~! o3 N& p+ V
- ssh cloud_config_modules:
$ ]' i& y% Z+ d1 d - mounts4 P N8 }8 `" B5 E
- locale3 S( g5 ~" n8 \ G
- set-passwords
4 k1 y% E) C" M4 D1 L - rh_subscription
! e Q( p2 W D6 i2 @( ^ - yum-add-repo5 x/ D6 O4 z8 g/ _6 w1 C% N% z
- package-update-upgrade-install
$ w; w6 U5 ]8 f9 @ - timezone
8 U; K0 K5 H0 y- n0 D - puppet
) f1 I, E2 A8 F, c' K - chef
6 H6 _9 t) _. T i6 Y$ w( m - salt-minion
1 V' H' z* c& l& l$ v: Y- s n - mcollective2 U$ ?, q/ O5 a( `
- disable-ec2-metadata2 I6 P2 Q: h1 G ]! L
- runcmd cloud_final_modules:
1 s9 Z3 u$ k0 ^7 _ - rightscale_userdata' b1 N: h/ _( |, t
- scripts-per-once( T. n6 c5 A3 v t8 [- Q: O9 o! O
- scripts-per-boot" a: p1 j! S5 R/ \* G
- scripts-per-instance
6 T& K4 z" z' k p( M- M - scripts-user6 u: @/ u u/ i# h3 j; R
- ssh-authkey-fingerprints6 j8 z9 t9 y4 w) t' J9 Z
- keys-to-console" C9 k; l/ C# G
- phone-home
0 Y/ E3 G$ M9 d1 b) X' U- \ - final-message
[1 T& \5 w4 C6 V - power-state-change . U/ f2 `! o! ]5 u9 ~* w' ?
; q* y& R. n% h# c: @5 I3 I% O
3 @! E j D8 {( M0 C8 C4 n$ Y9 {0 G7 ?& N
config drive
' b) J# r8 S# l- H" G 当无dhcp服务时,可以通过config drive获得metadata 配置config driver [root@compute01 nova-compute]# view /etc/kolla/nova-compute/nova.conf 4 G3 T P6 t$ F5 ^7 y
[DEFAULT]
* y$ N+ l. a% V! _' K
0 o4 a7 D g+ Z" G, U! q0 r5 C# x& h2 W4 ?! V( l2 |
flat_injected = True- b$ Q: z3 n4 }1 q1 W
" N+ _# i: k9 B& Z
该配置是为了关闭DHCP服务时实例网卡也能被正确配置,重启计算服务后配置生效。 stack@openstack-controller:~$ sudo systemctl restart openstack-nova-compute.service+ }; F2 x8 s6 r) ]6 U. w$ z$ @6 S2 P) u
+ |0 o: j7 I0 b0 h ]$ h
关闭dhcp 为确保实例通过config driver获取的metadata,这里关闭dhcp服务' [7 W; r- i4 t J
- h/ r+ |3 r1 [ U. y' n
企业微信截图_163763823247 ...
. `7 M e+ X) C5 @( m! C: }启动实例 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
+ t, I6 r% e0 A; X6 l" z8 b: a% t绑定浮动IP 8 Y" M0 `, M3 Q2 C
# ?$ v, i% O9 F7 Q8 ^& R: q+ f
user-data:centos.config #cloud-config* v4 o$ r9 f$ n) @ X
chpasswd:
! y! U# T. D. |; ]- `4 Q list: |
: d( L& ]) R& B7 a0 ^3 q. ^ root:rootroot
. _- z: O4 J' j centos:centos6 t2 S$ j) y5 J) J) J) z
expire: false
/ M& l4 w5 N9 m$ r1 J wssh_pwauth: yes6 e5 d- o F$ Q9 D6 m
hostname: loong576) J+ Z6 O, D6 X; x# |. t6 K% u/ Z
yum_repos:$ r+ h1 B' k+ B+ |
epel-163:
- ^$ u4 X$ I" y5 M/ R0 F- [- | baseurl: http://mirrors.163.com/centos/$releasever/os/$basearch/
) v5 h7 i7 P! ^2 {# `& h name: Centos-7
, p6 C! n- `2 l* v; M enabled: true3 r0 R# ~! E, w, K
resolv_conf:- u5 E1 N7 C, w# D9 u' z7 g; {6 `
nameservers: ['218.104.1xx.1xx', '8.8.8.8']# K" P, Z- Y8 p) b, [$ K, S" P
searchdomains:
! k( I" G: R+ \$ P1 z7 j& G6 q$ x - localdomain
& v) ]# z' G2 C0 n domain: localdomain
8 m. Z4 Y2 a( L/ o# i options:
/ Y) E* V: [0 Y# P rotate: true. V. f8 H7 Y' G
timeout: 1
+ w, {, o- c @% B0 z8 qmanage_resolv_conf: true
& ^! o, E4 B: P3 @
s+ U* a9 D% z; B- ? Wpackages:) b) Y5 f7 r9 F
- vim0 k4 ?0 f; @% f
- wget6 h" R W% W! Y( {9 m1 e9 Z
- httpd) H1 t8 t* O8 p$ w; M, o
timezone: 'Asia/Shanghai'
' @% E* {1 K, U, {: M: {5 druncmd:
. {9 T o% Y3 q5 D - [ sed, -i, "s/^ *SELINUX=enforcing/SELINUX=disabled/g", /etc/selinux/config ]
, [ L3 m+ m- c; O$ M9 |' K - [ mkdir, /dropme ]- R* X+ L# c/ H/ \: J6 |( W5 H: J
- [ touch, /root/abc.txt ]
: K9 V8 S/ x6 q4 @1 e! [ - [ sed, -i, "s/^ *nameserver.*/nameserver 114.114.1xx.1xx/g", /etc/resolv.conf ]9 Y/ {* z! I! q4 U
- [ rpm, --import, /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 ]( }) J; k! o" V% A5 g! a
power_state:
7 K) P, _* {- Q6 s/ E delay: now
2 O B) L3 q. G( G+ w/ N( T mode: reboot
: ]5 G& K( H; R6 d; } message: reboot now
' V/ S" E1 A6 w# x* N4 k0 R- p$ _! @ timeout: 305 Z1 V7 M1 U3 r) K* p- W; N1 r
condition: true2 G' \& m( y# E4 V& b5 u
5 W( k6 ~. l; R/ q q h1 Q
验证是否生效
, P2 A" k; d4 o9 Z 验证定制的配置文件centos.config是否生效 16376386143172.png ' }$ c3 h- T% q! l' _* T5 r+ ^# o
* u( P2 b) k R; w, ]
实例可以直接root登陆(默认只能通过创建密钥对方式登陆)成功获取到ip,配置了yum源、时区,runcmd运行正常,关闭了selinux(power-state-change正常),产生了测试文件,修改了[url=]dns[/url]信息( ]3 ]0 B, k4 o' x) j9 l5 v
C, T0 Z6 O$ h! C$ _- ]2 P
user-data:ubuntu.config root@openstack-controller:~# more /tmp/ubuntu.config$ H/ U+ i8 E9 R6 f. Z" F/ m
#cloud-config
4 ~5 \& p4 d9 r& `$ k$ p7 U8 }chpasswd:3 @# x) V/ g8 M
list: |
# n; C0 Z& B1 ~- X" }7 I root:rootroot
6 E+ i# E) ^6 J+ q ubuntu:ubuntu6 N, w" t! Q; g, V8 D, P
expire: false f- J- `& A3 h& O7 ^
ssh_pwauth: yes4 [, @; l) e! b+ `) G+ u
+ v9 l0 l0 O) A2 O
hostname: ubuntu1604& |/ P7 i9 t' [! u( }2 j
apt:
8 {+ d5 v: J1 Z" g1 q& X/ M! x/ J+ j primary:" ^2 W. x; E( Q, O6 A
- arches: [default]
1 P. y; A6 P4 {) f1 A uri: "http://mirrors.aliyun.com/ubuntu/"5 Y. j& `% W5 G& l# b" d
search:7 I/ W, U) s" S& M% Q2 s- h' {
- "http://mirrors.aliyun.com/ubuntu/"5 W8 \* q6 R3 R, I' |6 D
& m% ]9 j# |5 \8 C, sresolv_conf:
& u0 @4 o& @* e. @9 a @9 T nameservers: ['218.104.1xx.1xx', '8.8.8.8']( B9 a1 n; v' @6 s% v: e0 n
searchdomains:
: z8 Y# s( I( h( P& L - localdomain B! h9 }6 s1 @- ~8 x# R4 s
domain: localdomain
4 }# E5 U6 @2 ?- f options:
9 ]' D$ I8 Z/ W1 g; `4 M, W rotate: true
- m9 B) l+ {, J( K; a7 A timeout: 1
3 {" u3 x$ l; B5 X1 \manage_resolv_conf: true
/ @# k& t" k4 z% J! wpackages:
- e3 \ I% ]& j3 k9 U5 |' P7 K - apache2: }9 @1 d! U+ w( ?; ` A) d
timezone: 'Asia/Shanghai'
; |# N6 ?$ b/ X4 ]runcmd:. ~* f* d E! n: ]& V1 u: Z
- [ mkdir, /dropme ]
5 o6 Q5 ~7 \: c* N3 ? - [ sed, -i, "$a nameserver 114.114.1xx.xxx", /etc/resolv.conf ]
7 ^* i) S1 \( M7 m, T; K( |! y5 x z4 i! _ R2 x7 H0 i6 [
0 k; {# d+ ]8 n验证是否生效( I2 R8 O; w& d' l9 }
验证定制的配置文件ubuntu.config是否生效 16376386143172.png5 f2 N e& t5 T+ b6 D, T
实例可以直接ubuntu登陆(默认只能通过创建密钥对方式登陆)成功获取到ip,配置了hostname、apt源、时区,runcmd运行正常,产生了测试文件,修改了dns信息
4 t F, Y4 |$ h% \+ C6 e查看config drive sr0就是config driver,挂载并查看
0 x7 e& p/ ?; v [root@centos7-init ~]# lsblk
6 g% Q3 c4 z) l& b/ j7 X/ [0 g+ P$ G' A, c, _5 k' ~' l, f+ W, n
[root@centos7-init ~]# mount /dev/sr0 /mnt! ?/ m" x$ r8 k2 s
[root@centos7-init ~]# cd /mnt/openstack/latest/ && ll6 {1 }: U H5 o
9 [( q) E% {- T9 ^9 \- F' A5 Q[root@centos7-init latest]# more meta_data.json 1 p3 h* {$ V$ ]1 d# v7 [
[root@centos7-init latest]# more user_data
8 @" H6 `$ k8 I" x$ I7 j. N: a( e; c+ F2 ]0 o7 B9 E" X- E
- N! |8 F4 _8 h" ~/ G& @6 }# B! J- q! n+ S3 P! A/ B9 k6 g$ U2 O! h
meta_data.json中存放了public_keys,hostname等信息,user_data对应centos.config。 U: G" x P( i" x
cloud-init.log日志分析 [root@centos7-init ~]# view /var/log/cloud-init.log第一阶段服务' T7 D- S3 E# d% }! O- D' h; e; D4 k
" c" c& I" \) q, B3 A- x5 ?; x第二阶段服务. I$ J% P0 Y7 e8 C
5 m. E9 b% U) g
第三阶段服务8 z: D' a6 r8 j2 Y% c
在第三阶段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
4 q# {- `( Q; v& w% _4 o, K _第四阶段服务 在第四阶段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
. l& I9 O! Z) t% R8 [8 P" q第五阶段服务
5 C; G) e, E: a5 i L6 { 在第五阶段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
3 R( h' L! ]# E, v: Zcloud-init调试 各服务单独调试3 a+ J5 L7 G$ Y" N: |/ ]8 h' n
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 % k, O; S; o0 D! W$ a& d2 M; F
调试某模块的某个配置 [root@centos7-init ~]# cloud-init single --name timezone调试cloud_config_modules模块的timezone配置
5 W" T+ M" O8 [# I7 C$ f实践总结: 1.各模块的各配置项依次读取生效; q0 b, k/ L& z. v
在定制实例时,会依次读取配置文件cloud.cfg配置项。 实验环境的主机需配DNS才能访问外网,通过cloud_config_modules模块的runcmd配置项配置DNS,由于配置项package-update-upgrade-install在runcmd之前,cloud-init会先安装软件,这时外网是不通的,所以报错。 8 Y6 B m* _4 Q, b2 U }
2.centos的hostname设置不生效 尝试了很多参数组合,都没有到hostname,原因待查 尝试过的参数 hostname: loong576manage_etc_hosts: truepreserve_hostname: truefqdn: loong576ubuntu没有这个问题,只需设置hostname即可,重启系统也任然生效。 7 e8 E5 \8 M0 m- b2 U+ h
3.DNS配置不生效
; R6 Y) Q. f- q( K! @$ H& e4.runcmd执行命令是应该是双引号 这个有点坑,在用sed命令执行关闭selinux和配置DNS时,正常的单引号''需替换为"",否则执行报错。
+ e& o! X3 \2 z* e* K5.某个配置项不合法则整个配置不生效. g* p) U( Z6 l) P- g* b) E, Q) F
runmcd有个配置非法 报错日志 此时整个centos.config配置文件不生效
) I; l+ ]. L" D9 y; p |