- 积分
- 1193
在线时间 小时
最后登录1970-1-1
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?开始注册
x
ansible roles 4 M; V( M% J+ y8 e( `9 i! ~) a
4 h1 h# i8 [+ n- h7 \2 T
在实际的工作当中,一个完整的项目实际上是很多功能体的组合,如果将所有的功能写在一个playbook中会存在如代码耦合程度高、playbook长而维护成本大、灵活性低等一系列的问题。使用roles能巧妙的解决这一系列的问题。roles是ansible1.2版本后加入的新功能,适合于大项目playbook的编排架构。/ z/ V2 K/ Z9 m2 I
9 ~( D7 o# ]5 ^7 ^. H+ }3 Y
1、ansible playbook中使用includes
' N4 q0 z3 P$ J$ r) S5 q% [2 Z1 V2 _: L; v6 d' R
include在ansible中起引用功能,不仅可以引用ansible的playbook文件,也可以引用vars、handlers、file等文件。3 T4 x9 _1 v5 I o$ m7 o3 y
3 F5 x/ E3 K i, o
(1)includes的使用场景3 ^( g+ {/ c$ C8 R% J
0 M* ?, G* M) `5 X
大量的playbook内容需要重复编写' G1 ~ p _3 s* R
' P8 m. T" S7 @# J" h 各tasks之间的功能需要相互调用: L& ?, H6 D: }- N) Q
l# P% v/ |- [; A! L7 ?7 |2 _
playbook中的内容过多( r5 ?' Y4 ?/ h( X1 n, V
i6 Q, w0 Y( R6 v- R" ]* d# d
(2)include的用法" Y7 Y! p, E+ U+ A
7 z1 S5 {! o; O
用法:
& S* \* i3 G& t) r& X! e4 w
* B/ A" U- K8 G7 j tasks:
3 Z5 a8 q' r( w' o% G" O P- f, K% A6 G t$ U/ T
- include: playbookname.yaml% H' w) N0 N; |# v) O
! z$ z# F2 J1 H) Y: m4 Z$ K# A! y
修改主机名并添加用户admin,在修改主机名的playbook中使用include导入添加用户的playbook。 6 A7 D& b) l1 e7 q
' b' g, e- t( G5 h: Z#修改主机名的playbook9 ^( y. ?; }, P) ?) X5 n
---4 L$ H4 R. G+ e, c( v2 G
- hosts: test
" o- P- m* T# n7 J6 C* A: s' ~; j remote_user: root
0 l. H' k. L8 d/ g- }3 z1 ? tasks:
$ k* b. f: E, Y$ U6 i9 } - name: change hostname
) X1 ?1 r) K8 J4 _- g hostname: name={{ servername }}8 W7 i+ [4 D$ l5 f/ f
- include: useradd.yaml5 F+ ^+ [- O5 o. N
#添加用户的playbook
) c4 ~: }6 h y ]& w---$ m/ E' C: U/ \3 X8 e& i& X6 |- }7 h
- name: user add
- F% t0 |3 |4 \) `4 {. ?: X6 B user: name=admin state=present( X1 ^& X8 n3 }" i5 y
3 ]& B$ e8 w/ F: G4 n$ u) Y, A(3)动态includes
' K5 I! {* b8 ?9 R7 j8 G* @& Q, V* p& L! C
动态的includes是指在满足一定的条件时,加载includes。
+ @& C) N& }& z+ H! j7 ?* ?5 W, t% a* J- o, V: h0 I2 _5 J
编写安装配置zabbix-agent的ansible playbook如下:+ G9 l# v- K) R: C+ a
c3 b% W$ e! P* o/ r
---
. }/ d5 H" B" M- hosts: "*"
( W9 N" y# S& A7 t5 h0 l remote_user: root
) L1 R0 ]& w% L' i4 n8 ^, U4 C/ o9 |) O tasks:4 G. \4 U3 K. G) v6 G
# 将安装文件拷贝到远程主机的/tmp目录下( b; J: S; k O: Q. K5 _
- name: copy zabbix-agent
1 H9 l5 J: i1 Z+ F% g9 m copy: src=/tmp/zabbix-agent-3.0.9-1.el6.x86_64.rpm dest=/tmp/0 v/ |7 A8 \) x3 X- B
# 安装zabbix-agent. r5 ~& n% f9 F& A
- name: install zabbix_agent7 V; a/ p/ P. p- }8 T# ^ | y
yum: name=/tmp/zabbix-agent-3.0.9-1.el6.x86_64.rpm state=present
2 x. @* E2 D: g# 启动zabbix-agent
4 E: Z6 t$ |5 c* g% U" |( H - name: start zabbix_agent
3 I; y8 ?9 h! _6 e$ W& k service: name="zabbix-agent" state=started
( F) z2 ]" m+ ^4 N! v # 导入配置zabbix-agent的playbook
( ?( { o* A. ~3 f' k - include: configzabbix.yaml# E! J" ^6 j6 B \( y) x
# 只有当系统为centos6时才导入configzabbix.yaml
. `7 s5 z: u( j; q# h/ ^ when: ansible_distribution_major_version == "6"4 r6 s7 {$ Q6 k4 u
# 导入重启zabbix-agent 的playbook, |1 p! L* i0 }; F$ |
- include: zabbix_agent_restart.yaml# u& D0 ?5 o" ?9 U3 [. Q
congfigzabbix.yaml的文件内容如下:) x9 p; m# [- V, I! w, ]* F
---
# X4 H! l8 @4 V7 V7 O. U- name: configure zabbix_agent C% _: w9 O$ a- O; _- q- a' H
template: src=/home/dayi123/ansible/0418/zabbix_agent.conf.j2 dest=/etc/zabbix/zabbix_agent.conf
+ l; d. n9 g) E' D1 t6 S# ~4 x重启zabbix_agent的配置文件zabbix_agent_restart.yaml内容如下:
Y% M1 J, E3 \4 g1 Z$ r! n1 r6 V2 b1 G* W$ q8 N- Q& a
---
W( P# E( x% \5 S2 F8 T- name: restart zabbix_agent
$ T. b* p" Z$ {$ r service: name=zabbix-agent state=restarted
- |+ e" G6 |7 c9 o& B1 H2、ansible roles7 U/ ]* E' J8 [' n
通过includes可以在playbook中导入playbook,在一定程度上解决了将代码写入一个playbook中耦合性低及维护困难等一些列的问题。如果使用include导入大量的playbook及模板文件时,没有规范及统一的存放目录及命名规范,也不利于维护,roles正好解决了这一问题。
' o& s! J5 O1 ?$ a' M$ p" g" Z) A
4 T3 X1 g, ?: E" p2 q% q; W roles主要依赖于目录的命名和摆放,默认tasks/main.yml是所有任务的人口,使用roles的过程也可以认为是目录规范化命名的过程。roles每个目录下均由main.yml定义该功能的任务集,tasks/main.yml默认执行所有定义的任务;roles目录建议放在ansible.cfg中”roles_path”定义的目录下。) a+ D' w3 R0 S
d/ i5 e9 R. f7 G+ @& `# B(1)ansible roles目录结构
( Q* j' D% s# a% M6 W; i8 p# X D3 c2 E$ o( u! b
一个完整的roles是由task、handlers、files、vars、templates、meta等一系列目录组成,各目录存放不同的文件实现不同的功能,在调用时直接下文件名即可调用。ansible roles目录结构图如下:
8 O( k+ v# k/ a/ E: a) K) B5 _
0 [. B! s' S: f/ p + j- ~2 _1 b0 T( k% r8 W- @
% [9 F/ U4 R; ~3 G7 H6 m" tansible roles 目录结构
$ `# }. t% S5 S4 z4 b/ `4 e1 V5 n+ v& G: m/ ]" ] K
1)tasks目录
7 l. p) ? r" b, E1 V, j1 U* I; n7 s3 ]/ Z% A! X# q; u
tasks目录用于存放ansible执行的任务,tasks目录下必须存在main.yml文件,main.yml为主函数,用于导入需要执行的任务。$ k( z+ E3 I; @8 @% }9 T
4 _+ j: z9 {/ C: C2)handlers 目录. l( g: p& C4 f9 X7 A
5 r" L4 Q0 r8 b7 G6 n handlers经常和notify搭配使用,当文件、进程及返回状态发生变化时,notify通过handlers做响应的变更。handlers目录下也需要包含main.yml,包含在在main.yml中的handlers将被执行8 \; ]% A z& z$ m
: l3 k! T$ _8 D' P) S. m+ E5 n
3)templates及file目录0 g b* z9 m- G& C3 M& k, [" ^8 A
; u* [& @% [9 K" i+ K, q( ~- v templates目录及file目录均用于ansible目录文件处理,两个目录下均用于存放传输的文件,但templates目录下存放的是”.j2”格式的文件模板,文件中可以写变量。( w: d5 p2 z( C
: Q6 i* J' z: b4 q& M, {4)vars目录
$ i, P m% t2 g
2 v4 b4 v2 t% o vars目录下用于定义当前roles执行时使用的变量,应当存在main.yml文件。. I! `9 F/ R' m- T; }8 w8 p
; A6 ]' g( ~- h% @% v% `6 d5)default目录
& k! }( M0 y @! K( L+ Z' \/ e. `% n$ H% N" K! }
为当前角色定义默认变量时使用此目录,应该包含一个main.yml文件" H# w) l6 o: X
$ k/ n' r) l f' j( p6)meta目录' c" B2 l0 C# P0 y7 V
; ~* V$ k3 i% a/ V- V( N% D" G 应当包含一个main.yml文件,用于定义此角色的特殊设定及其依赖关系。* X$ D: o/ E& n9 r/ v
" c& L2 m5 y9 M0 i! E5 U
(2)ansible roles的执行方法
, `2 u C. g" v8 B N
+ e4 G) n) W' K roles的执行方法同ansible-playbook执行方法一样,需要调用roles的调用文件Rolesname.yml文件0 f6 n' i+ o* O. W* w$ r& P: F. i
& V9 ^8 o' Z. Q) [8 i5 s- J$ W. e7 Trolesname.yml文件格式如下:
( E1 z1 B- G8 V
0 Q2 O1 V' L# ~1 D---( {1 y: K0 k: j) X8 n6 \
- hosts: all7 [0 i- t, F3 x* {
remote_user: root
, v, }+ g% }0 ?$ v4 I6 g roles:+ f7 @% G, Y$ `2 h3 q
- Rolename
0 h! B2 x% @( H如果存在不同版本的操作系统是,roles调度文件可以根据不同的操作系统类型执行不同的roles。
% A) W' s" b7 p4 G* ]/ z. B5 i4 D! N: `1 d
( W* B9 a2 }8 i, F% w---
* O, G1 S0 [+ {: n- D- hosts: all
4 N: M3 c2 n1 }$ w4 j q& L remote_user: root% q9 _8 s. v. C7 _; f/ A+ B+ N% r0 d
roles:/ V5 M; m( L; @+ u- d5 h3 z5 N
- { role: rolename1, when: when: ansible_distribution_major_version == "6" }
: j" R2 u* d. c# I. N/ Q - { role: rolename1, when: when: ansible_distribution_major_version == "7" }
5 }. r! w* k, Froles执行方式如下:
4 g, K: I. [/ J( p5 V9 g! F- \. S2 H4 P) F7 `+ u" }
ansible-playbook rolesname.yml9 X8 Y, ~' o/ l, L h
3、创建roles初始化系统
4 C2 ]6 |2 r0 a$ L9 W(1)系统出书化的roles目录结构:
3 T/ M0 D/ P- f
& E" H( J/ i* I( \ D; g[root@ansible-server ansible]# tree roles/ S. K7 j4 |6 K* ~8 |
roles/; `* m1 T+ m5 K0 ?
├── init_system6( ]/ y3 S5 j- r/ s& A- h
│ ├── files# ]1 X& O9 a$ r+ J6 ^ V
│ │ └── zabbix-agent-3.0.9-1.el6.x86_64.rpm/ D& X; g8 J6 p4 j# v5 N- f
│ ├── tasks
! J! L% F7 d, c0 a; f9 @3 r, y2 s, t│ │ ├── init_system.yml' l) v$ J3 P5 k% w& H7 y7 d
│ │ ├── installpack.yaml
+ V9 \' s+ [' G, _" }! I/ T3 z│ │ ├── install_zabbixagent.yml
! z/ W- g" i9 {│ │ └── main.yml
: z8 h5 `. P2 ~│ ├── templates5 s' o( k. Y! t7 x
│ │ └── zabbix_agent.conf.j22 n# `2 W" \' O1 Z. F
│ └── vars/ i% A. k. B1 y. H! l) B; E" H
│ └── main.yml2 B, x" \5 V' y! r$ O9 T( G
└── initsystem.yml
: h1 F6 |, Y/ @ z(2)各配置文件内容4 J z. x6 j3 q" b
) c- \+ r Q% ~1 N. C! o! |
roles/initsystem.yml 中的内容:
. I$ u" U e/ m3 U2 u4 r& _8 p& M. D1 N6 n
---6 P( _/ B6 w. I2 a& l0 G' `
- hosts: 10.0.0.13
+ c$ F3 K1 ~ P remote_user: root
6 w& ]- ]$ |* i roles:
( Y7 D7 G! P- a( a/ v) Q - init_system) ]- n! v) Q5 G% R9 u1 M
roles/init_system/tasks/main.yml 中的内容:# _2 B! L% X; B _# v% f
! o2 y z9 Q2 {8 ^/ @
---8 y( q* J3 c; W5 u2 p& p
- include: init_system.yml
' y- S% K% |$ i7 w% e; g - include: installpack.yaml* i" b% e4 K) U L# N6 F2 ~
- include: install_zabbixagent.yml
( @6 F0 N( N/ R roles/init_system/tasks/init_system.yml 中的内容(变量”servername”是配置在/etc/ansible/hosts中):
! T* t# e* K: c4 Q
. q/ Q$ {4 K- w% ?7 R---
i+ D1 a7 y& h* _& ` - name: hostname+ X( K1 P' s4 v8 e* j1 e
hostname: name={{ servername }}
: d$ h) v3 ?! ^2 O! m0 H8 Q$ X' N
0 v! ]% F: R6 m! I0 k - name: disabled iptables
2 Z& E: h/ H% N' c$ z$ c; m service: name=iptables state=started enabled=no
4 t5 x! J1 K" l; ]' A2 f; P
, P8 F/ X( Q6 Q" I3 d9 [ - name: shutdown selinux
: Z6 C+ y, e- f' F1 [4 B1 ? replace: dest=/etc/selinux/config regexp=^SELINUX=enforcing replace=SELINUX=disabled" z9 _" R1 ^% R- t
tags: selinux
$ Y9 Z# L* s0 q& b0 f+ {7 ^
+ y# A% e4 s( P+ U. r - name: install ntpdate! U1 `- n0 y6 V3 V7 v
yum: name=ntpdate state=present
! y b' O+ p% S, b# i4 U' a9 W: [ - name: lock-in time
' d0 e# e& i* g% ~2 F& ] shell: ntpdate {{ timeserver }} && hwclock -w
( H" {$ t. R4 k/ E - name: crontab ntpdate
! H5 C! c5 ?- C6 O K' Z* q cron: minute=1 hour=*/2 job='/usr/bin/ntpdate {{ timeserver }}' name=ntpdate
- K s$ `* K/ W8 g1 H0 S8 e% Y/ q' C; ?* @& @, m) m$ ?# F
- name: Change nofile limits.% Z2 L1 j; h/ K+ ~. ?: _, D
lineinfile: dest=/etc/security/limits.conf line={{ item }}. }' y/ r! R+ F1 J3 D$ \' K
with_items:5 V/ E2 d2 x+ C
- '* - nofile 65535'1 a# S' n1 _: D& D
- '* soft nofile 65535'4 r: p$ g, b5 v7 |" q5 ?$ h
- '* hard nofile 65535'
& C' J3 T4 {5 H% p! \; S- U2 \roles/init_system/tasks/installpack.yaml 中的内容:) |( h! K. l) Q' \) ]
! S' W# V3 M/ M6 i- name: Install RPM package
- Y$ w1 y) D6 H; | yum: name={{ item }} state=present
/ U6 ~# a5 t/ G G7 n& C with_items:' Q& W. L) |" @! h
- gcc
0 O$ C4 q3 n. S" E. N - gcc-c++. @' G( t: a% s% u; _' W9 R8 _" Z. J
- make# X# C1 R3 ]3 P$ R+ d0 P B
- lrzsz
9 S& m6 r) N) B7 X - vim
4 z8 U7 w- i! y# Qroles/init_system/tasks/install_zabbixagent.yml 中配置:+ L/ ?: M" B$ E8 I6 j
( [- \3 ~/ ?2 |# Z2 \ S6 Q# z7 O---
, x' ^% A. V) a4 \; F8 y7 f. E - name: mkdir /tmp/tools
3 ~- L! M; W. | shell: mkdir /tmp/tools -p' L4 z) [5 E/ Q1 Z3 z
- name: copy zabbix-agent& c. Q( c, b) N
copy: src=zabbix-agent-3.0.9-1.el6.x86_64.rpm dest=/tmp/tools/
: Q2 W( T% z6 D - name: install zabbix_agent
' O1 H3 K. P+ t+ h yum: name=/tmp/tools/zabbix-agent-3.0.9-1.el6.x86_64.rpm state=present ?' |7 _, z. s3 u% F
- name: configure zabbix_agent
5 \, c" c! Q3 l L template: src=zabbix_agent.conf.j2 dest=/etc/zabbix/zabbix_agent.conf$ X) ^: X* ^" [ n8 j
- name: start zabbix_agent
1 C& O7 |4 z8 k service: name="zabbix-agent" state=started
2 I2 e5 ]7 A7 y% t# a; d* broles/init_system/vars/main.yml 中的内容:
; {& z: N% g+ Z) i" e' U' q2 c E" e2 E Y7 Y- {2 E4 {
---
@/ G5 N1 d# G+ g3 `timeserver: time.windows.com% g2 s y6 A2 i. d4 }3 @/ F
roles/init_system/templates/zabbix_agent.conf.j2为zabbix的模板文件,其中部分配置了使用了模板:8 E3 y% G- Z0 B( |
; f$ K7 T. T1 w" Y[root@ansible-server ansible]# egrep ^Hostname roles/init_system/templates/zabbix_agent.conf.j2
1 x0 w7 ~9 K2 M( L9 IHostname={{ servername }}% A2 K1 t* z/ T
4、ansible galaxy/ l: w- I1 r8 {
ansible galaxy主要用于管理galaxy.ansible.com上的roles,默认下载的roles存放在/etc/ansible/roles目录下,也可在ansible的配置文件中自动以存放目录。在ansible使用过程中,我们可以下载别人写好的roles直接使用,也可将自己的roles上传于galaxy.ansible.com上,在下载使用别人的roles前最好能将下载好的roles代码查看一遍,然后再去使用。 |
|