- 积分
- 1193
在线时间 小时
最后登录1970-1-1
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?开始注册
x
ansible roles 1 x: g* A: o8 l/ U/ V- N; g9 N
+ J0 t$ c8 H9 r3 k( W 在实际的工作当中,一个完整的项目实际上是很多功能体的组合,如果将所有的功能写在一个playbook中会存在如代码耦合程度高、playbook长而维护成本大、灵活性低等一系列的问题。使用roles能巧妙的解决这一系列的问题。roles是ansible1.2版本后加入的新功能,适合于大项目playbook的编排架构。
4 V3 ?# F: }0 W
5 i' e4 Z/ K% t: L6 o; L/ P1、ansible playbook中使用includes 0 h+ P: M! f, N0 w- j
1 T" A, b9 e- Y' {6 Q3 J2 q' z8 E
include在ansible中起引用功能,不仅可以引用ansible的playbook文件,也可以引用vars、handlers、file等文件。 [. w- X; h* |0 `# L+ A; ?
w$ i# V' t5 \
(1)includes的使用场景
' t7 [7 N7 T$ X( c3 l4 f
& H- W |1 b" G: a6 O8 [1 ~( @ 大量的playbook内容需要重复编写
% e) |7 e; u1 \/ m( R" v
0 V2 p0 E+ S9 `, O7 ?% S+ ~ 各tasks之间的功能需要相互调用. a: l- @& Y! I# O; Y' q
/ w) M6 \1 B$ H8 O* W6 Z playbook中的内容过多( f2 B% d+ Z: Q- [: V0 p$ q
" g6 F) J0 r. D4 K# o, t- |(2)include的用法
: z% e5 F5 a' A' W0 p4 u! ^! B4 }
) A; j; i, r. Y" L# h5 P 用法:
( m) n7 Q9 J- N0 C
" ~$ l- V. R1 P1 _0 D/ [ tasks:
; k. k( Q' Y/ T% ~4 T. o' x
: B4 F. F6 Q3 s$ s' E - include: playbookname.yaml
0 t! r* M# d7 y9 {" `. v
- c& e. y( C) F# v7 x 修改主机名并添加用户admin,在修改主机名的playbook中使用include导入添加用户的playbook。
+ P. A' q- S. {# Z; U$ N8 U" }, W+ h: T q8 B
#修改主机名的playbook
' u# N/ z* ?$ ]5 b* {9 `' m---
; A9 i: a$ U1 I! w5 E( f- hosts: test0 M- T6 @2 K3 G- }+ X# A
remote_user: root- e. O C' o9 Q7 P, h0 o+ r
tasks: V( H, H; r' V4 g' S
- name: change hostname$ h) }2 L& t& C2 Q" }
hostname: name={{ servername }}8 R- T5 @' m6 N) i, H2 N: H
- include: useradd.yaml' H1 f; L2 L( j" f7 L9 h6 y
#添加用户的playbook3 L7 N* Q7 q, a& U1 ~! Q: @3 Y+ J
---
9 m& m) n( |+ J( |( F8 s v! u: z9 Q- name: user add
6 k6 M2 r# Q4 Q5 f2 J user: name=admin state=present
: R/ O2 ?7 C. N- u) }* ?) s 7 l5 ~6 U [0 d) Y! T/ O7 |) g
(3)动态includes0 A |, v" d3 J; ^# K
6 E4 Y3 P5 D; z 动态的includes是指在满足一定的条件时,加载includes。
( {! c- U! h w, I$ E! S) V" Z. g3 d8 ~# k
编写安装配置zabbix-agent的ansible playbook如下:* j8 G: |# E- N' O/ i# W. _/ O' p
8 I1 g( T: J# B/ @4 g1 _, u
---
/ Y' K: q. A$ `- X/ V2 F& v- hosts: "*" F: D5 b( @* [: f8 {0 e: r
remote_user: root% d2 i( V7 u! a" `. j4 p% m3 _
tasks:: m# r+ G6 X8 d0 A6 [
# 将安装文件拷贝到远程主机的/tmp目录下
Q( j) S4 b' g1 K% Y* Z - name: copy zabbix-agent1 ^9 q0 {# X7 B$ \
copy: src=/tmp/zabbix-agent-3.0.9-1.el6.x86_64.rpm dest=/tmp/& E5 w- B2 B' D- T/ [ E) R. U
# 安装zabbix-agent
1 m, {7 y4 g. [. w* c8 } - name: install zabbix_agent) c7 h* D2 [4 ^. n* U* O. A% H
yum: name=/tmp/zabbix-agent-3.0.9-1.el6.x86_64.rpm state=present0 x5 A# N1 n2 i6 S; {
# 启动zabbix-agent( D4 D. Z$ j; J0 E! V1 q7 o
- name: start zabbix_agent
; f0 W9 { D# n# n4 W service: name="zabbix-agent" state=started
7 V; \! s# f4 `8 ?: w5 `& M: ?2 ^ # 导入配置zabbix-agent的playbook
' s# U# a# T* Q. }! P/ u - include: configzabbix.yaml
0 s D. j9 @: @2 W # 只有当系统为centos6时才导入configzabbix.yaml
7 c; \2 N+ g ~ when: ansible_distribution_major_version == "6"! ?7 u' }) I( t# \6 \1 g
# 导入重启zabbix-agent 的playbook
# ~: _2 E0 D* K7 Z! V, F! E* r* O - include: zabbix_agent_restart.yaml- O* S( _! A9 i
congfigzabbix.yaml的文件内容如下:
0 i/ } L+ \8 A! D4 f---& F6 s! `3 F# H5 Z+ [
- name: configure zabbix_agent) H& e8 C/ m3 d) k
template: src=/home/dayi123/ansible/0418/zabbix_agent.conf.j2 dest=/etc/zabbix/zabbix_agent.conf
6 [4 s# d+ G1 ]! U: k重启zabbix_agent的配置文件zabbix_agent_restart.yaml内容如下:
4 U; e& K a7 U. _- e) O+ F$ p( m/ L1 \
---
8 U5 l) Y3 U* g- z; X% g- name: restart zabbix_agent2 k6 L* F# u. G
service: name=zabbix-agent state=restarted! h& k! x8 U8 l% K* ?
2、ansible roles
( R; o+ a4 X3 i7 u0 Q6 U 通过includes可以在playbook中导入playbook,在一定程度上解决了将代码写入一个playbook中耦合性低及维护困难等一些列的问题。如果使用include导入大量的playbook及模板文件时,没有规范及统一的存放目录及命名规范,也不利于维护,roles正好解决了这一问题。# \9 \% {8 j/ w3 f6 w' D
' y3 ?8 w4 {* B5 p3 h roles主要依赖于目录的命名和摆放,默认tasks/main.yml是所有任务的人口,使用roles的过程也可以认为是目录规范化命名的过程。roles每个目录下均由main.yml定义该功能的任务集,tasks/main.yml默认执行所有定义的任务;roles目录建议放在ansible.cfg中”roles_path”定义的目录下。$ o; Y j; R: t
% Q5 q% \; ]1 k+ i; O
(1)ansible roles目录结构: A k _$ G. n
6 b1 P6 [$ L+ A; V, z
一个完整的roles是由task、handlers、files、vars、templates、meta等一系列目录组成,各目录存放不同的文件实现不同的功能,在调用时直接下文件名即可调用。ansible roles目录结构图如下:
7 c3 O7 I4 e& X0 I5 y7 M8 j
( x, c% M: R/ @; v2 q5 S' \: \ # w! U. p7 M$ h* \
' E; D# j2 o6 {/ y! b% N3 Qansible roles 目录结构
+ o4 J6 Y9 n1 J3 S8 j* N9 `( w! G! V
1)tasks目录
) [, r' L) g/ F( v
7 q7 |- B4 t* |: M4 N tasks目录用于存放ansible执行的任务,tasks目录下必须存在main.yml文件,main.yml为主函数,用于导入需要执行的任务。
2 k. h! z9 ]5 `6 g: D+ }! [8 z& K4 E
2)handlers 目录( E. d P- x) u) d- L; |. ]
$ Z8 Q, }0 t7 g$ Z- ~
handlers经常和notify搭配使用,当文件、进程及返回状态发生变化时,notify通过handlers做响应的变更。handlers目录下也需要包含main.yml,包含在在main.yml中的handlers将被执行% v7 O# N* K( _' Y# ^
% s! r m4 g+ t3 b3)templates及file目录
$ B6 ` E; |+ N! X* R1 n; a( l& Q. C [" t/ c1 x
templates目录及file目录均用于ansible目录文件处理,两个目录下均用于存放传输的文件,但templates目录下存放的是”.j2”格式的文件模板,文件中可以写变量。; k6 F! P# @- [% @9 |7 I6 H
2 v; l/ `! _9 x+ V! K4)vars目录1 ^; g6 t* U% @$ V+ a
% w" a+ f' r8 q$ W# b/ L vars目录下用于定义当前roles执行时使用的变量,应当存在main.yml文件。
4 G9 J; [1 l; e @6 ]2 N, ?9 q$ h5 Z. m: B- ^+ W0 @( m4 V
5)default目录
( G* V7 R' k6 m& w/ \5 n' M0 A
+ {( Z* M f$ t 为当前角色定义默认变量时使用此目录,应该包含一个main.yml文件. _7 ^' H" K- R9 }) u2 `
5 [9 C7 i: O" Z# i- _. X* M8 A. n
6)meta目录, H& b7 p: S% A8 H" f t: Y
0 C) W' J2 N* a: h 应当包含一个main.yml文件,用于定义此角色的特殊设定及其依赖关系。. N9 O) t8 e0 |) l
+ M4 e% U' P0 _, ~9 x$ [' ?(2)ansible roles的执行方法& u6 }% a4 j2 H, K
# v! R1 H6 X3 ?5 O! w5 C1 `+ p5 b roles的执行方法同ansible-playbook执行方法一样,需要调用roles的调用文件Rolesname.yml文件+ E# x7 J' V8 d0 d9 e3 b
/ K9 U# t1 B9 e8 y, D0 Srolesname.yml文件格式如下:( O. R8 b# T: C8 U. s! v
: h- u% J1 u' [1 E0 Y* j---; y/ M# ~8 |& B9 b
- hosts: all
1 z- J; D/ s- ]' r remote_user: root0 \+ p: w9 s- ^" J* ]
roles: b6 y4 `& w2 T7 F/ W- g9 M# q
- Rolename
1 {9 O+ Y& N( u6 X如果存在不同版本的操作系统是,roles调度文件可以根据不同的操作系统类型执行不同的roles。- N( @# M; s/ K9 V. w% _- B* {
3 y: z+ t% W) I y8 c O
---6 v7 k0 v! [* b
- hosts: all
+ d' a# ?6 ^+ q0 w3 k) w remote_user: root3 }% D! q6 Y6 d$ W5 t% X( ~8 _
roles:/ d- U# h2 D( H l
- { role: rolename1, when: when: ansible_distribution_major_version == "6" }3 ?8 V! n0 \8 m9 n# Q' T' z ?
- { role: rolename1, when: when: ansible_distribution_major_version == "7" }
$ V3 X: {1 E* t5 y/ y# X; h. F, _0 c/ n; Rroles执行方式如下:7 o/ ]* c" @2 P" ~# m
8 L0 f& @& a y+ D6 H/ Gansible-playbook rolesname.yml- z J# ~; ~+ o! M8 V& r5 e" ]
3、创建roles初始化系统
4 t/ l6 |( m" ^' p l8 O- b* n(1)系统出书化的roles目录结构:1 ]8 p1 ? d% R
- j" ?' {, U8 s5 i4 c: _5 s% k7 \[root@ansible-server ansible]# tree roles/* S5 g, c3 [. O
roles/
! I6 k/ W* F) |7 T: K4 \, d. h├── init_system64 n# a4 E! {5 e6 |- l
│ ├── files
8 o2 V& |5 |, ]. ^0 y' F# u│ │ └── zabbix-agent-3.0.9-1.el6.x86_64.rpm5 A- {9 y" e' i) m/ A
│ ├── tasks- r& c' M( ^: [ Y& S% y
│ │ ├── init_system.yml5 n R: f* n- A
│ │ ├── installpack.yaml
! C) j J2 O9 ~& B│ │ ├── install_zabbixagent.yml
5 N+ K: y- h# F. b* Q# z│ │ └── main.yml
! e( P r6 S- J, K: ~│ ├── templates
6 l! Q; w5 L' s. F│ │ └── zabbix_agent.conf.j2. ?, i' K9 Z: t8 [
│ └── vars6 j+ _- m0 m4 ^# L" J, u; @
│ └── main.yml
4 h' |& J, E# _0 D- U└── initsystem.yml; y& P; z; Z! v- k; H/ r! u) ~
(2)各配置文件内容
! w4 ~) k* ]/ i1 _" V
2 k5 J( f, O/ l0 F" B* {5 O1 G roles/initsystem.yml 中的内容:
5 j$ h. J1 S- e* n6 B$ j* X ?0 U: b% I, Y0 g$ s2 O U: U2 x5 \
---
2 U6 T0 W$ `1 q8 _- hosts: 10.0.0.13& @" Q5 s, t3 E* {* P H O- [
remote_user: root, j* q' D3 y( B9 s
roles:
5 i7 |) E* }0 V( z1 O1 V% X - init_system& k' Y3 A, X! P9 l
roles/init_system/tasks/main.yml 中的内容:
8 i: b6 J! x/ D2 n
5 |+ N3 k; @8 s- t+ z ---" `( s- L9 F& m6 S: A2 {- }( L, U
- include: init_system.yml
3 m: _9 F! y/ S1 [9 T0 t" ]4 X - include: installpack.yaml
1 M* v5 P; O$ Z: w, m; \2 @ - include: install_zabbixagent.yml& P0 R& k5 `% ]) J( ?2 B
roles/init_system/tasks/init_system.yml 中的内容(变量”servername”是配置在/etc/ansible/hosts中):) q; g" b9 W0 }0 ^) T( p
" p1 a6 t# T% l) k---
7 C( g3 G/ c2 u) e2 t& q - name: hostname
3 ]% S* ^6 J) t/ O- W hostname: name={{ servername }} + d9 T- t! m# L& [ x/ ~2 W
" ^( j3 d/ F1 G9 p, [( W+ ~& N - name: disabled iptables
4 S$ R# i; S8 z service: name=iptables state=started enabled=no
$ x% V' `2 P! R# C9 w7 a- r4 M$ N+ c& {6 ~: Y e& b
- name: shutdown selinux) R# W+ `; s2 L! V6 L2 a( ~/ z; _
replace: dest=/etc/selinux/config regexp=^SELINUX=enforcing replace=SELINUX=disabled
- i8 Y4 C% c) [$ \* x tags: selinux
3 B, R- V$ Q3 {; ?% W
# [" Z9 z- I1 d; [( x/ z - name: install ntpdate
# x% ^: O, ~( G% [- z yum: name=ntpdate state=present% _) k1 X3 U) S2 l
- name: lock-in time% F% H* e2 ]7 K! d$ |: Z/ T
shell: ntpdate {{ timeserver }} && hwclock -w
2 U% v& t4 r; e& N8 k - name: crontab ntpdate
$ E6 ?4 |% z3 ?0 ~ cron: minute=1 hour=*/2 job='/usr/bin/ntpdate {{ timeserver }}' name=ntpdate8 d1 u; k. F4 Q5 [
$ n& w; y; x5 ?. Y) ^4 ]2 B6 x0 q - name: Change nofile limits.
$ _, m- O' v, ^4 [' {5 V lineinfile: dest=/etc/security/limits.conf line={{ item }}0 r' K/ `. Z* T: ]* {4 {5 Y
with_items:
2 G5 W% h7 e. r8 D - '* - nofile 65535'- }1 P4 e6 t4 K/ y
- '* soft nofile 65535'
! X% W. D) M. J! g5 h) Q- G5 B - '* hard nofile 65535'
2 l( E1 `2 v6 k5 N/ m; V8 aroles/init_system/tasks/installpack.yaml 中的内容:
! Q' v m5 Y7 ]- P3 r m
1 |5 [8 j8 W A( i/ k- name: Install RPM package, n. a* Z5 M! P! J0 ?. [% m
yum: name={{ item }} state=present# I/ e8 Q; C3 U
with_items:
+ N; {& u. I J8 Q0 M - gcc8 ^5 i9 `, v: h
- gcc-c++! { J6 L3 C) R9 I* v, H+ ]. A2 Y
- make
$ J$ L6 G3 C- f, Z' T5 a3 [ - lrzsz
@! X9 l) C3 D7 |; b/ n - vim
& a) P9 X. e$ _- b' }7 ]! iroles/init_system/tasks/install_zabbixagent.yml 中配置:
5 i3 i' W) ?, }: H. v: R* [9 @( I5 p" T& N) o
---0 p8 Z: W4 `0 h! D" m& Z- N
- name: mkdir /tmp/tools7 m3 d% ?/ b# s; r `8 c
shell: mkdir /tmp/tools -p: T U7 d- m6 k) `6 L
- name: copy zabbix-agent/ T$ C9 k" k3 L
copy: src=zabbix-agent-3.0.9-1.el6.x86_64.rpm dest=/tmp/tools/
& z1 ~ b5 T7 `) J5 y& ] - name: install zabbix_agent
. ~/ e2 j) x2 |! X" H; z. I+ {( U yum: name=/tmp/tools/zabbix-agent-3.0.9-1.el6.x86_64.rpm state=present
% f+ l; j2 a3 G1 B - name: configure zabbix_agent5 ]; Z' O# _! K6 ?* s
template: src=zabbix_agent.conf.j2 dest=/etc/zabbix/zabbix_agent.conf) N' g; G9 c! R
- name: start zabbix_agent" [8 ~/ u, H* g$ e
service: name="zabbix-agent" state=started
0 p# U, O# r" j0 v' n6 hroles/init_system/vars/main.yml 中的内容:: v) i/ o1 f% K0 n1 i; a/ l. P
$ R% I! I) t1 o$ m. S' s2 @5 E
---
/ R2 K5 P9 R. utimeserver: time.windows.com
( r, I' v7 N6 i6 d+ P: e; _6 Proles/init_system/templates/zabbix_agent.conf.j2为zabbix的模板文件,其中部分配置了使用了模板:+ H! \6 T+ S7 j8 x2 h# a# g" p6 b
* {, k) ^. O3 r3 z
[root@ansible-server ansible]# egrep ^Hostname roles/init_system/templates/zabbix_agent.conf.j2
l, @! ~. q& u( m& P% rHostname={{ servername }}9 _3 P- H+ a6 u2 j5 u, b8 ?4 \5 j
4、ansible galaxy+ c/ W2 m8 {3 D) t
ansible galaxy主要用于管理galaxy.ansible.com上的roles,默认下载的roles存放在/etc/ansible/roles目录下,也可在ansible的配置文件中自动以存放目录。在ansible使用过程中,我们可以下载别人写好的roles直接使用,也可将自己的roles上传于galaxy.ansible.com上,在下载使用别人的roles前最好能将下载好的roles代码查看一遍,然后再去使用。 |
|