|
|
ansible roles
- W& E$ a% \, r9 D, M
+ d8 q# d; n2 w! Y 在实际的工作当中,一个完整的项目实际上是很多功能体的组合,如果将所有的功能写在一个playbook中会存在如代码耦合程度高、playbook长而维护成本大、灵活性低等一系列的问题。使用roles能巧妙的解决这一系列的问题。roles是ansible1.2版本后加入的新功能,适合于大项目playbook的编排架构。
" `$ h a% c; a6 e% ?3 | }: ?+ I* O# h! ?2 K% W
1、ansible playbook中使用includes
: [. ]- x* r( U8 D
8 P: E, H* N* s& u include在ansible中起引用功能,不仅可以引用ansible的playbook文件,也可以引用vars、handlers、file等文件。
) h" C M% K; q$ W8 d* } U# ?+ h+ K' G" x! ~
(1)includes的使用场景5 Q$ G& I, o. U. o
) t: n" ]- U) h& k! r! E
大量的playbook内容需要重复编写
; l$ T% D$ ?$ t* v. i
/ d! W- ], T2 ^2 t: m1 G/ K# x 各tasks之间的功能需要相互调用
: N. f- f/ d# I+ U2 l: u. I! h9 y
& |8 c9 u' G7 F4 } playbook中的内容过多
' x" ~3 Z, @$ ]. Q/ E5 _" z# z* F+ |8 ]- B, o R D7 P, T( O
(2)include的用法/ R6 H H& X# K+ k! @4 W
5 w% S4 ^0 W" X% \6 a$ p- x 用法:
- {! X7 r: _3 F" h5 V! B# z- _/ l
% ~& r6 h' E1 G5 S3 \ tasks:
0 Y5 L1 J$ P; F% o$ F( k
+ T. T) w2 w% r - include: playbookname.yaml
% W+ n0 B9 t! G5 F% t, E, e8 n/ U" Y4 b8 _- k) y9 l
修改主机名并添加用户admin,在修改主机名的playbook中使用include导入添加用户的playbook。 9 m" n; D+ q' a) u2 l- O9 q
2 N( d) @* B) E' j. `#修改主机名的playbook3 {" b) _) K( \: L p3 U( v3 [
---
2 t6 q$ u* @; C3 m- hosts: test
# _' F& F. M" H- B remote_user: root* Y/ V: C+ f* P. P: O% R, r
tasks:, }8 ^7 h/ b; \; ^5 Z
- name: change hostname
+ P2 |4 h* O# H1 m. z% g, f$ N/ r4 t2 U hostname: name={{ servername }}+ C; B, s( ^; {& A; {
- include: useradd.yaml0 g. f' X) y) ?0 Y! k4 \( z
#添加用户的playbook
% D# y) h' H L% q7 g3 u---. } X0 H( l9 @3 t0 G7 F" l
- name: user add
: d& `1 C d1 v user: name=admin state=present& U& i* q) K3 v
# I" l1 F- T" c) f- u(3)动态includes( b5 l+ P% ^& {: y# t' _
' t+ u( c$ [' o8 |4 d0 ]
动态的includes是指在满足一定的条件时,加载includes。, K5 |* y9 o# ~$ v% @3 f
. W" |$ S% ~% a' ]$ G3 Q# b* d
编写安装配置zabbix-agent的ansible playbook如下:) T8 |( {7 t; @0 Y O1 N+ p
$ I' |" F' P' P& z
---" F3 h% |6 D7 d' Y8 [) Y; ^3 m
- hosts: "*"
- J: J E! D1 U* L- v; d+ n remote_user: root
3 t/ {; w8 K) `- ~* X$ j! }: q tasks:
& k# i Z1 e# v! E' I! t # 将安装文件拷贝到远程主机的/tmp目录下
7 G& x D' A x: C/ Y! G( V( x - name: copy zabbix-agent, A! | K. G/ a6 M
copy: src=/tmp/zabbix-agent-3.0.9-1.el6.x86_64.rpm dest=/tmp/
) [9 I V1 _4 d1 ~9 R0 r; G1 ?& ~2 } # 安装zabbix-agent
( ?5 w6 D" }9 c - name: install zabbix_agent
# d, F8 B: c$ b+ j! ~ yum: name=/tmp/zabbix-agent-3.0.9-1.el6.x86_64.rpm state=present
1 l I d/ s7 F# 启动zabbix-agent% l+ d! D' v, x, k
- name: start zabbix_agent. L: Q" ^4 B; W/ e" S, M: ]1 r
service: name="zabbix-agent" state=started* `) z; `6 R& {* N' a( I
# 导入配置zabbix-agent的playbook$ N+ \) j0 r, n8 H) A
- include: configzabbix.yaml1 `6 ^5 |5 |! }
# 只有当系统为centos6时才导入configzabbix.yaml2 F4 W$ v s# z3 B1 j
when: ansible_distribution_major_version == "6"% F7 G9 Y. x% d0 Z! [0 S
# 导入重启zabbix-agent 的playbook
& C) z) w% R0 M$ |5 b4 ~ - include: zabbix_agent_restart.yaml8 x w! f. `$ n6 r3 I, C
congfigzabbix.yaml的文件内容如下:
; _. H# ?8 `- c! E8 {9 ?8 |7 R# ^% y---; U- h7 F; J5 t( C& e7 I/ E$ Q+ Q
- name: configure zabbix_agent1 b, p/ b$ o. S
template: src=/home/dayi123/ansible/0418/zabbix_agent.conf.j2 dest=/etc/zabbix/zabbix_agent.conf( Y! y7 A, d) y8 D
重启zabbix_agent的配置文件zabbix_agent_restart.yaml内容如下:
6 L W) W8 n: }/ h2 K
7 l, `( J d1 l' s, p; r7 f---
5 U2 G. `2 i& u) t Z- name: restart zabbix_agent% T7 d6 q! u5 p# H
service: name=zabbix-agent state=restarted6 r; Z4 P! g) p1 v) I
2、ansible roles8 Z2 U; G9 L1 f D. V
通过includes可以在playbook中导入playbook,在一定程度上解决了将代码写入一个playbook中耦合性低及维护困难等一些列的问题。如果使用include导入大量的playbook及模板文件时,没有规范及统一的存放目录及命名规范,也不利于维护,roles正好解决了这一问题。
+ Z+ i, O0 C2 g- O4 i+ {8 U
' u- u7 X" j- Q% | roles主要依赖于目录的命名和摆放,默认tasks/main.yml是所有任务的人口,使用roles的过程也可以认为是目录规范化命名的过程。roles每个目录下均由main.yml定义该功能的任务集,tasks/main.yml默认执行所有定义的任务;roles目录建议放在ansible.cfg中”roles_path”定义的目录下。7 T. f% A$ C) o1 u2 v" t" {
: T6 L7 u$ `9 @, K7 L(1)ansible roles目录结构
9 A1 B" ]4 c9 a& i
9 |& {: }7 [7 Q4 Z0 S: B4 {3 | 一个完整的roles是由task、handlers、files、vars、templates、meta等一系列目录组成,各目录存放不同的文件实现不同的功能,在调用时直接下文件名即可调用。ansible roles目录结构图如下:
& v& _* k( |5 [. G, J4 H+ w
; ^9 s3 g- L" F ) P# {' L' z' k: \& q
) s, e% V$ g; }) n7 Y o) y
ansible roles 目录结构( @3 a) P8 S) [( P1 z# d; X
( z/ w# }- T) w+ @4 ?1)tasks目录
0 ?) [- c) [6 I4 Z% F, Y7 I- h
) w g7 t$ D& W \: g' Q. k+ \ tasks目录用于存放ansible执行的任务,tasks目录下必须存在main.yml文件,main.yml为主函数,用于导入需要执行的任务。
; x+ ^4 s W) I! L, @- X" X2 E& {5 q5 u- J
2)handlers 目录
- E! u) Z: t* R' I8 y' J* K( C: D I) a: D8 o$ B# E" b5 U
handlers经常和notify搭配使用,当文件、进程及返回状态发生变化时,notify通过handlers做响应的变更。handlers目录下也需要包含main.yml,包含在在main.yml中的handlers将被执行
+ r6 ?% v0 P$ F; |& V0 j9 m
6 }7 \ q8 P) N5 X; N+ c" M) _; A3)templates及file目录
# a0 v, ~# L/ y: ^; w" ^
) a7 b( T- O) ?6 Z/ r templates目录及file目录均用于ansible目录文件处理,两个目录下均用于存放传输的文件,但templates目录下存放的是”.j2”格式的文件模板,文件中可以写变量。3 g& m0 B9 K. ~) [0 _/ g
! g7 N- o& F9 p0 a' R4)vars目录
0 P- M5 U' c( Q
6 O3 w/ w J' ?4 @! W% g+ p) e* w vars目录下用于定义当前roles执行时使用的变量,应当存在main.yml文件。( h0 V1 H( l! K" |% d
7 @; A) T8 Q4 \- I( f5)default目录. X9 y8 R6 G0 g# W6 r- ^
( w8 P: B+ J/ p 为当前角色定义默认变量时使用此目录,应该包含一个main.yml文件8 [ V# [ V: |$ K7 h7 ^3 E
9 R ~( J \. r. u; V6)meta目录3 _- ^6 I3 r9 |4 v
# c0 i0 T6 V) A6 k4 u 应当包含一个main.yml文件,用于定义此角色的特殊设定及其依赖关系。1 V: l, R& \# r1 |
4 e5 b4 Z/ I6 Z5 f% v4 ^# ^. v(2)ansible roles的执行方法
, r! O( d- K& L" R* s1 n' U
5 O9 Y- l' c' f6 z roles的执行方法同ansible-playbook执行方法一样,需要调用roles的调用文件Rolesname.yml文件
( w w' z3 r/ O4 x/ {& m& f( {3 p7 i; V; R1 H
rolesname.yml文件格式如下:3 z- O! m! L- J9 G
4 f$ c& r' A0 v---
& l: j2 y: A) T, e% M- hosts: all
$ |- [, w/ b: o, \( e2 ^ remote_user: root/ \- m7 {6 H0 Z7 o
roles:
. H9 h% y r. |& a - Rolename" M3 {3 m" ]( K1 x
如果存在不同版本的操作系统是,roles调度文件可以根据不同的操作系统类型执行不同的roles。: u8 m0 `. H' |7 d. T
6 Z; f" C8 }+ _4 m1 I0 w/ @---
' h: z0 p3 N! A" y4 g& l$ l- hosts: all+ q0 c, _5 `# C' i% ?
remote_user: root' u7 m! P' d% }& f& e; ~9 {# N' @
roles: v" X& _, r$ @) p
- { role: rolename1, when: when: ansible_distribution_major_version == "6" }
( w. C$ _1 ~2 X: Z" B - { role: rolename1, when: when: ansible_distribution_major_version == "7" }; F) r& _ e) s2 `3 F
roles执行方式如下: M) G0 i9 c$ u9 k% f" a
- `7 K5 R1 D3 n% U5 j; ^" @
ansible-playbook rolesname.yml* V/ C+ Z+ D1 |( h( Y
3、创建roles初始化系统
) X/ L! W/ H8 @; `( Z Y(1)系统出书化的roles目录结构:8 p7 @- ]- _# Y
/ A: ]1 w( w) n8 q) T' a[root@ansible-server ansible]# tree roles/ }. }% X' e$ [+ ^# u6 E+ r+ h8 S
roles/9 E- n7 |3 h% k6 j( h+ ]
├── init_system6
! s( M/ Z. Z1 _; }7 G7 b% `│ ├── files
( n% ?9 a$ l; w [- e│ │ └── zabbix-agent-3.0.9-1.el6.x86_64.rpm+ I; S% y( B+ y q; Q4 W5 X% h9 }2 _
│ ├── tasks
& H7 n" `8 g& @# z│ │ ├── init_system.yml4 T |' S$ z# E1 M' F& I1 t
│ │ ├── installpack.yaml
3 T) x$ \$ v, Y$ q4 `│ │ ├── install_zabbixagent.yml+ H& r' O; a8 u0 |8 A! n3 d
│ │ └── main.yml
0 e4 {( ^" |: W0 u0 G2 X1 I│ ├── templates
" M; E4 [* e2 h$ U/ S3 E│ │ └── zabbix_agent.conf.j2
! v% C' T3 {+ j v│ └── vars( M, W% M3 q9 v4 U# t
│ └── main.yml
0 O& Q6 b( ]5 f: W└── initsystem.yml
$ Z* U* Y- i1 m$ B" B(2)各配置文件内容2 \! O5 F# V H9 [, Z' o
1 [3 X6 x9 O% i% _2 }
roles/initsystem.yml 中的内容:
0 ^: f0 q. W9 m1 [/ x! i/ u3 N3 [4 f, H5 v1 T8 E3 i8 m/ `
---
# u1 P" j. L& x0 |5 z+ I- hosts: 10.0.0.13/ v7 y) X7 }0 ?+ v. I
remote_user: root
5 k' R4 g8 E# E4 T roles:
# H% O: K" \' i* R+ \ - init_system
' J. t2 S2 Y: M0 y roles/init_system/tasks/main.yml 中的内容:1 U# j1 D3 ?8 e# L
K8 c4 w- T/ C5 P ---: `% g. @: S6 C
- include: init_system.yml
) {$ c- I+ R; v6 e6 A" d& i+ y4 ? - include: installpack.yaml
* D6 m/ a* P1 B# y+ ~ - include: install_zabbixagent.yml- Z: d0 {6 n6 V9 b7 K% k
roles/init_system/tasks/init_system.yml 中的内容(变量”servername”是配置在/etc/ansible/hosts中):# i5 t* v ?7 W% P; U
, N' S1 N3 J$ @9 P---: b# w" ^! S# L( W2 v1 N3 G w
- name: hostname
& I! [# D, F( j. S4 J hostname: name={{ servername }} / ^# d% G0 I4 j. {
$ l& B$ X @; M4 B; M9 _: q - name: disabled iptables9 A/ w) V e7 ^# }5 E* f
service: name=iptables state=started enabled=no9 v7 M' N% N4 p) D: N
" _* o# @9 I, C! q# p/ j. a
- name: shutdown selinux
# y; V g3 p: I4 c replace: dest=/etc/selinux/config regexp=^SELINUX=enforcing replace=SELINUX=disabled
4 |' h$ g z( }/ i" Q tags: selinux% c& L, N+ W! X0 a
% `4 w7 g3 Q7 V. B
- name: install ntpdate$ w7 }- E) e+ R- Q9 P1 K8 ?
yum: name=ntpdate state=present
! D0 @% w( p/ I& u9 I, i3 {# u" R$ L& }8 J - name: lock-in time$ c( I7 g5 U- l( g) O% ^
shell: ntpdate {{ timeserver }} && hwclock -w
( K2 j* \0 p! l' N - name: crontab ntpdate
9 ^5 X) }3 ~% M: b cron: minute=1 hour=*/2 job='/usr/bin/ntpdate {{ timeserver }}' name=ntpdate
3 B- S9 r Z# ]1 V+ b
) r8 v6 ~5 R; `2 }# X - name: Change nofile limits.
- t2 [1 M* D+ p: d2 q; m lineinfile: dest=/etc/security/limits.conf line={{ item }}2 }# V7 i5 v+ G; g) I- N
with_items:
! A$ [$ X2 q+ f9 d - '* - nofile 65535'
$ m" ^1 v* |2 n4 G7 u5 z$ c/ p - '* soft nofile 65535'2 m% k, K) ?# d
- '* hard nofile 65535'2 |0 M' O# b: i( ?; c; @
roles/init_system/tasks/installpack.yaml 中的内容:3 O$ A+ ?7 r$ o4 _9 j& V
* _2 v* z) b" {
- name: Install RPM package
( r! y z; q% _/ V5 j8 g- t yum: name={{ item }} state=present$ A- O; f5 _6 G" ]& }1 V( i
with_items:
( ^0 f* R+ o! R8 E: ?4 w - gcc) e/ y9 l( N6 m1 ]
- gcc-c++ [7 \ P3 F) Y8 j8 d% F
- make/ _& y: p! H/ [
- lrzsz
1 x- K- w1 r: G+ h- P - vim
* E2 k3 l' D( g6 [5 M# nroles/init_system/tasks/install_zabbixagent.yml 中配置:. V G1 ^- S* |: |8 `7 V
5 } v% y' T4 X
---" y, _, V3 Y) u" m0 L8 H6 U# ~
- name: mkdir /tmp/tools8 Y0 G. X6 j) ]% N, r% @
shell: mkdir /tmp/tools -p& P9 G- ^3 u, a' f( }5 N4 ^
- name: copy zabbix-agent
6 G' f# u: }) i8 o$ O7 \! j copy: src=zabbix-agent-3.0.9-1.el6.x86_64.rpm dest=/tmp/tools/
: w* x' ?8 g6 O( q. e( i - name: install zabbix_agent' J; W- l' X+ O$ i. Q' m, ^0 Q8 W
yum: name=/tmp/tools/zabbix-agent-3.0.9-1.el6.x86_64.rpm state=present# Z& U3 `* P; k I: J2 j O9 Z3 v9 p
- name: configure zabbix_agent
( s8 `6 @$ [% e( J7 f7 C2 T template: src=zabbix_agent.conf.j2 dest=/etc/zabbix/zabbix_agent.conf$ Y; @& u1 I$ x) ^$ l( m7 e4 i
- name: start zabbix_agent- N ~( a0 j. Z* l+ z7 P" w- w
service: name="zabbix-agent" state=started
" }! D+ D1 P! k4 w/ ^% Z( H2 Q1 Froles/init_system/vars/main.yml 中的内容:1 ?2 Q/ q4 s! p& s2 D
2 K% L/ Q0 }2 e---$ p% C+ ~' q& U" m# D. J0 f% k
timeserver: time.windows.com
; _* Z0 t2 }* U+ y5 B2 _roles/init_system/templates/zabbix_agent.conf.j2为zabbix的模板文件,其中部分配置了使用了模板:
( d5 [- k+ ^& r
, I+ N a! p, U9 o; `[root@ansible-server ansible]# egrep ^Hostname roles/init_system/templates/zabbix_agent.conf.j2
/ I8 J H5 s1 LHostname={{ servername }}1 I+ [" J5 |, S* }9 p
4、ansible galaxy
2 y+ R0 y% o5 Y0 O# F5 O ansible galaxy主要用于管理galaxy.ansible.com上的roles,默认下载的roles存放在/etc/ansible/roles目录下,也可在ansible的配置文件中自动以存放目录。在ansible使用过程中,我们可以下载别人写好的roles直接使用,也可将自己的roles上传于galaxy.ansible.com上,在下载使用别人的roles前最好能将下载好的roles代码查看一遍,然后再去使用。 |
|