找回密码
 注册
查看: 4230|回复: 0

ansible使用roles

[复制链接]

70

主题

73

回帖

1201

积分

网站编辑

积分
1201
发表于 2019-10-17 21:25:19 | 显示全部楼层 |阅读模式
ansible roles
' V9 H6 ]4 Q2 M. D* A1 W; i+ _
' x' ]6 |# d5 \5 U& U  在实际的工作当中,一个完整的项目实际上是很多功能体的组合,如果将所有的功能写在一个playbook中会存在如代码耦合程度高、playbook长而维护成本大、灵活性低等一系列的问题。使用roles能巧妙的解决这一系列的问题。roles是ansible1.2版本后加入的新功能,适合于大项目playbook的编排架构。; S6 R$ p# q* \% |/ v, T0 [# w
2 }3 \, ~5 G! x7 n( S
1、ansible playbook中使用includes 1 J/ W0 V. @3 b
7 w% L% {8 t* u; y- e2 d' r) l
    include在ansible中起引用功能,不仅可以引用ansible的playbook文件,也可以引用vars、handlers、file等文件。2 f" t) w' ~7 f5 ^

. \4 @' X+ D4 S$ r+ [(1)includes的使用场景/ `. G  n- T' b0 v" j
% d  ~: `% ^; |4 U- q
         大量的playbook内容需要重复编写+ N# z$ c8 b' |
2 }" U1 a$ C  p) m1 h: c/ L3 R7 v
         各tasks之间的功能需要相互调用9 Y8 B; K; w& b+ y/ T

; z! y7 \) N, ~* r, h( z# i         playbook中的内容过多
' V- s& Z/ ^6 ]. X3 [- S9 t
8 F. d& C6 t  x. k3 F(2)include的用法
7 A8 H: L( `: B! m, R! I" p- Z1 L  u; h) h- l3 y/ G% Y$ K
         用法:9 L$ w' L  u# K2 X# i7 I

8 w! K' g- _) f                tasks:
% y" a. {9 K$ [; S. p9 N( J1 h4 W5 }. b* J- x* |
                - include: playbookname.yaml. y% l) w% N4 R. j1 C1 v9 n

- k9 K/ o+ Q6 H) z        修改主机名并添加用户admin,在修改主机名的playbook中使用include导入添加用户的playbook。                                   ! B* b) F1 {: V, W# J; h

9 T, |" j! |5 s+ S1 Z( \7 l" ]#修改主机名的playbook
4 j, ~6 b" ~, I+ V& ]( A- r---
: P9 r1 u9 q' K1 [- hosts: test
: z+ @7 V& V7 P, G; o: J  remote_user: root
1 V( w; Y( [$ H" V4 D! h3 c6 M- I  tasks:3 `) x+ a/ I* d1 r$ B8 j! S
  - name: change hostname7 d3 _( L+ _' ?! n
    hostname: name={{ servername }}, h( F1 t3 v  q% v& X0 K' m  q
  - include: useradd.yaml4 k! j8 b/ ~- ]7 x$ v
#添加用户的playbook
, j: {4 \+ n, n* q---% Y* @2 C5 H' w+ Z4 Q$ D
- name: user add
9 i" e0 \! |2 V; H% v! D! J3 C  user: name=admin state=present6 _  \5 p* d7 d$ d" [9 ]* r
                           
2 l6 C; X  {- T9 v: R(3)动态includes- P& m' p% ~! l- A% d7 d8 {9 y

# A* t) v9 }, T6 }8 F   动态的includes是指在满足一定的条件时,加载includes。
; q+ t3 ~( X8 z/ ~+ \' s
' f, V8 c1 A: p% l- a+ b' |   编写安装配置zabbix-agent的ansible playbook如下:
' T1 t/ Z3 K) B# f, b; f) z
% B2 p: F* Q; ?+ i& P- \& G---
4 l8 ~+ r% N  x4 ?+ O: G- hosts: "*"
  ~3 ]+ @; f; e% ?  remote_user: root; m! O' q& I# B1 @7 W
  tasks:
! O/ o4 Y8 p- V3 a1 j # 将安装文件拷贝到远程主机的/tmp目录下" @8 L3 X) E. A# ?
  - name: copy zabbix-agent
5 O/ G% b$ E# o7 @- L# K) N& U    copy: src=/tmp/zabbix-agent-3.0.9-1.el6.x86_64.rpm dest=/tmp/' V6 J: A+ F8 ^4 \1 g5 |) v- N
# 安装zabbix-agent. x7 {. X9 L* y" E* q! _6 h. ]1 E
  - name: install zabbix_agent
; X! P+ c# C# T  f% u7 S; q    yum: name=/tmp/zabbix-agent-3.0.9-1.el6.x86_64.rpm state=present  R9 i0 L, e- r" a
# 启动zabbix-agent3 A' V. s/ D! H  H" V1 ?
  - name: start zabbix_agent7 c7 W% i$ q1 p
    service: name="zabbix-agent" state=started0 J1 j( S- |5 M+ a# e
# 导入配置zabbix-agent的playbook
* ~3 \* C; E# i( T  - include: configzabbix.yaml
' j  t/ {/ @+ @+ |    # 只有当系统为centos6时才导入configzabbix.yaml) S8 X8 T, S- l2 v; H$ B$ V
    when: ansible_distribution_major_version == "6"6 u: [9 V5 z) T( w: `
# 导入重启zabbix-agent 的playbook
6 x- p; K8 m1 j$ h  - include: zabbix_agent_restart.yaml/ G/ ]' {4 V& Q9 R' x/ x
congfigzabbix.yaml的文件内容如下:
- f2 G% B4 E& A1 ^5 k! G---
1 a1 e; n* v3 v( c$ n- name: configure zabbix_agent
5 l4 k/ A/ i1 c# q  template: src=/home/dayi123/ansible/0418/zabbix_agent.conf.j2 dest=/etc/zabbix/zabbix_agent.conf
- a! d0 v& x; X' V7 _# z重启zabbix_agent的配置文件zabbix_agent_restart.yaml内容如下:
" ?" z3 n* F( m5 U5 ~5 t. u& I4 g/ x/ U$ Y/ B) v& j
---
& }! @* X) Z* [0 R9 h) B. j: j- name: restart zabbix_agent
  Z4 ?$ Q! @$ R: F- o* A  service: name=zabbix-agent state=restarted; i$ E4 Q) }4 A: @  g# w1 ~
2、ansible roles
9 |+ L+ E8 S, a- D   通过includes可以在playbook中导入playbook,在一定程度上解决了将代码写入一个playbook中耦合性低及维护困难等一些列的问题。如果使用include导入大量的playbook及模板文件时,没有规范及统一的存放目录及命名规范,也不利于维护,roles正好解决了这一问题。( W# T0 v' @" X: u

- u2 [/ k; s! A7 _0 V9 c        roles主要依赖于目录的命名和摆放,默认tasks/main.yml是所有任务的人口,使用roles的过程也可以认为是目录规范化命名的过程。roles每个目录下均由main.yml定义该功能的任务集,tasks/main.yml默认执行所有定义的任务;roles目录建议放在ansible.cfg中”roles_path”定义的目录下。
0 t/ C6 ?5 t4 W. s& g6 _- B% M
- o+ w9 `- i" s0 v(1)ansible roles目录结构; l. B2 n% e( `( a& n
! l9 Z6 e3 {, [( i! ~; r7 J: }
    一个完整的roles是由task、handlers、files、vars、templates、meta等一系列目录组成,各目录存放不同的文件实现不同的功能,在调用时直接下文件名即可调用。ansible roles目录结构图如下:( e; L" o! v# x* ]! j, d' G
  g: _9 [: [  J2 k$ n

, O9 Y/ R& I! w0 B- s8 I
1 f8 q% @2 a0 [2 D8 t$ ]7 Lansible roles 目录结构( @; c- h$ ^- ~8 ^5 [1 v% |

2 c0 c: W9 C; e& b  ~- }, N1)tasks目录
2 C8 u  O; d7 }- a9 L3 ^
- ~- O1 w3 |% ~  D1 u" k     tasks目录用于存放ansible执行的任务,tasks目录下必须存在main.yml文件,main.yml为主函数,用于导入需要执行的任务。0 c4 ^) N8 Z/ {+ V
0 [% R4 k% O% {
2)handlers 目录
1 d9 Q/ o7 N8 s4 n! _  n+ N) ^2 K4 u
' r" o0 Q" W) D     handlers经常和notify搭配使用,当文件、进程及返回状态发生变化时,notify通过handlers做响应的变更。handlers目录下也需要包含main.yml,包含在在main.yml中的handlers将被执行
$ v+ g  G# T5 Q# e6 d/ M. w" `( _3 k. V% _. S
3)templates及file目录) a" X9 p5 l5 T4 ?

4 E3 I7 V' F/ w3 m8 \     templates目录及file目录均用于ansible目录文件处理,两个目录下均用于存放传输的文件,但templates目录下存放的是”.j2”格式的文件模板,文件中可以写变量。2 P: T; @# x1 c8 c/ z

4 A* A+ x8 Y5 y8 I8 }5 k4)vars目录
& F* h- Z* p8 e; q; S0 @
* Q2 G1 y% {/ p- Q     vars目录下用于定义当前roles执行时使用的变量,应当存在main.yml文件。9 E: N; p8 p6 p4 O: \$ O( D
- h2 {+ P" {2 L" T" x4 y
5)default目录! m! v( x5 t+ }
+ ^* S- u/ p/ V! H6 X
  为当前角色定义默认变量时使用此目录,应该包含一个main.yml文件6 i8 e# T% ]. ~

3 a* n0 L& ^0 E6)meta目录
. y: P5 g- l6 N( H  J  x' S. E/ k8 p# U4 V/ P9 r
  应当包含一个main.yml文件,用于定义此角色的特殊设定及其依赖关系。
; T7 ]5 m, u0 E  ]$ l! W
$ Y5 X4 X* X1 \5 m( s, E(2)ansible roles的执行方法, w& {' o* `" J5 w2 b8 ^

5 F. V; ~/ Q  \9 g     roles的执行方法同ansible-playbook执行方法一样,需要调用roles的调用文件Rolesname.yml文件- |4 D- e4 y0 _9 [- V, E
( t$ R  P5 s( R; ^
rolesname.yml文件格式如下:
, {. e! u, C' e6 c, N+ Y6 e, |. Z8 b, |3 |  w. r
---+ A3 ^3 T! C. l: D; x2 e, N& |
- hosts: all
4 U# D, H: z5 C8 x' r% k! d  remote_user: root
* `. {2 r/ @+ P: Y5 Z  roles:7 l( T" L- [% ?0 t2 X
  - Rolename9 ~& A3 F7 l/ h. A. R4 E0 E
如果存在不同版本的操作系统是,roles调度文件可以根据不同的操作系统类型执行不同的roles。5 {/ @4 P3 \1 P4 t/ [3 L; o
) o6 `5 N  ?" H& s. {3 h4 Z& y
---
5 s/ d6 u, O# t" g& s) Y- hosts: all
9 `2 u. Q# E; R; p3 x* S  {  remote_user: root
/ n' @4 q  z# j6 _2 y7 U& \& F  roles:6 n9 S( w: K; Q
  - { role: rolename1, when: when: ansible_distribution_major_version == "6" }
. _. k/ O! L+ g% F- @4 c+ S  - { role: rolename1, when: when: ansible_distribution_major_version == "7" }! T4 N# |, y  `8 V4 `
roles执行方式如下:
1 |$ t) b' X+ K' G" j
0 Q* v  ]8 c" C' w% k; x2 d& M* X9 Pansible-playbook rolesname.yml
2 O4 q) P8 W& |) d+ x; z3、创建roles初始化系统
" @0 M5 @4 }* o' F9 s# D8 U1 q(1)系统出书化的roles目录结构:
- a& R1 u' c: e2 Y
5 X( i, [0 n9 p[root@ansible-server ansible]# tree roles/
9 L& h8 Q* Q, Q3 jroles/
+ N8 V/ R; H5 [├── init_system6) r# Z* `& U3 K+ x
│   ├── files
( A2 B7 k# P) s│   │   └── zabbix-agent-3.0.9-1.el6.x86_64.rpm
5 q! z4 F% y- k  b│   ├── tasks+ `& f3 ~( ?1 x' R' I, V) S$ m
│   │   ├── init_system.yml; ^, }: K; e; t* y; G
│   │   ├── installpack.yaml  j" O0 p$ \' M0 j9 c, U# i, r
│   │   ├── install_zabbixagent.yml  _; b- q! L- ]3 e8 k. r
│   │   └── main.yml
$ o8 `2 Q' T3 n4 X! n( {│   ├── templates
6 J9 B$ m, o9 ^0 U, u: |3 }│   │   └── zabbix_agent.conf.j2$ G" @' k& m1 M7 b4 c# q. h
│   └── vars
' N3 P, f5 z7 P- Y5 B1 F│       └── main.yml) G: M4 {0 u; n0 n0 p. Z( t( a
└── initsystem.yml
! C" ^% X) [* [$ _# v3 @8 R(2)各配置文件内容2 M' j+ m: v% X, W9 A  \! V; m( V" t

/ R( ?0 o* z) `" E4 R/ s roles/initsystem.yml 中的内容:7 P' n) @# B( u4 O5 Y  ~% ~
5 G7 R$ }% j/ }+ W4 E7 a8 s
---2 O* C5 ?. Z! J. i
- hosts: 10.0.0.137 C# c  ~+ x7 i8 W
  remote_user: root
+ P: Y! W7 C# s) q# X" Z: c  roles:
# X: _& `  x5 Y7 y7 @2 V    - init_system
& r% @8 M" J+ n roles/init_system/tasks/main.yml 中的内容:
! t6 }# B: ^- z0 Q* A. k7 w1 G0 Q  g  V: {) [0 G
    ---8 J/ _+ B* U9 h% j
     - include: init_system.yml
9 u# z% @( U$ k! c     - include: installpack.yaml  a8 m+ [; ^5 O8 P  ^6 ?; {) c
     - include: install_zabbixagent.yml1 _- O( ?" G- S. t
roles/init_system/tasks/init_system.yml 中的内容(变量”servername”是配置在/etc/ansible/hosts中):
! Y( t5 y! P+ c4 S8 q' [+ c5 k
. U4 }' W! i( l---
! K( A2 v' C8 u- L1 j - name: hostname8 O  {7 D# @3 S: E0 ^
   hostname: name={{ servername }} ( a7 L# C# [+ q! E  d7 k

2 S# H, l) O: J, J5 R8 {6 {) Z& g - name: disabled iptables3 Z6 w1 L2 W8 [1 p, f6 C5 Y
   service: name=iptables state=started enabled=no1 `$ j, H/ ~% [% w- e0 ~" @6 |

( L) d- N1 {, K* |/ Q5 d6 u - name: shutdown selinux
6 }& M% x) n9 s/ y0 x3 r: ^  S7 v   replace: dest=/etc/selinux/config regexp=^SELINUX=enforcing replace=SELINUX=disabled
& W; \- W! y1 s& ], Y. t   tags: selinux& V5 `! I1 M8 I% W3 ?# F

! k5 T( |# D; P0 v# Q$ r4 D" o - name: install ntpdate
* K1 p8 B8 z( R. m- T8 S. s   yum: name=ntpdate state=present; J$ V2 I9 e: a( C( r" u, F) B, }
- name: lock-in time
; [4 e4 v/ y- L8 z( N' e   shell: ntpdate {{ timeserver }} && hwclock -w: P, G, Z1 K) |" u1 K- c
- name: crontab ntpdate% A2 U! u' L& C* C  S3 p8 e: K% a: x
   cron: minute=1 hour=*/2 job='/usr/bin/ntpdate {{ timeserver }}' name=ntpdate" H" c  [, o0 U3 ?: z7 W" Q; V/ @

5 ]$ A& q9 N1 B - name: Change nofile limits.
! N* L% r5 q% z/ i  }2 V) a% {   lineinfile: dest=/etc/security/limits.conf line={{ item }}6 d3 @7 A6 E  R2 m) C
   with_items:: B- i$ J0 b# u
     - '* - nofile 65535'! H' b+ h& R6 M/ T- s+ j8 ^6 @7 f
     - '* soft nofile 65535'
0 P* N9 k, B. N) A; y3 G     - '* hard nofile 65535'  L4 J- }9 D  g
roles/init_system/tasks/installpack.yaml 中的内容:- ]$ c$ o1 G( x

$ Y! O3 o: J, o# ]- name: Install RPM package
* R* N# ^; I, u4 k   yum: name={{ item }} state=present4 r" Y9 Y+ g. a% j2 B
   with_items:+ W+ p: u6 b/ m' C  x+ Q
    - gcc
, \' R$ h1 b! Q5 }$ R" ]2 N9 `    - gcc-c++
( U  s3 i) n, x    - make9 k2 M* C/ ?+ a& \
    - lrzsz
9 p" o( d4 ]" ^    - vim
% T. {& ]6 A7 U' l3 Troles/init_system/tasks/install_zabbixagent.yml 中配置:
  t- t  z$ @% X  c; y% j; g3 ^
. H* X4 Q/ _0 Q' i  |( w---
3 I/ Z0 g1 ]8 G8 D1 | - name: mkdir /tmp/tools
+ H0 l4 n  d8 Z% L2 o  S   shell: mkdir /tmp/tools -p9 m# m+ w- s% G% q: ]& k4 T
- name: copy zabbix-agent( K" P3 C# i& ^. K
   copy: src=zabbix-agent-3.0.9-1.el6.x86_64.rpm dest=/tmp/tools/8 a' W6 D8 q6 U9 X( s
- name: install zabbix_agent7 p: K( c3 j) h' d# G5 l; h
   yum: name=/tmp/tools/zabbix-agent-3.0.9-1.el6.x86_64.rpm state=present
5 C4 i* s1 }( C2 u; V$ f - name: configure zabbix_agent
& w( z9 @5 n6 l9 K   template: src=zabbix_agent.conf.j2 dest=/etc/zabbix/zabbix_agent.conf
7 E$ L+ c& J6 d3 @/ \1 _' L - name: start zabbix_agent
& _3 r5 e: b* ^1 R  z   service: name="zabbix-agent" state=started
' |1 B' x- I# v) ]* v5 droles/init_system/vars/main.yml 中的内容:# J+ r: Q; R* H- ~) g
7 N6 u" h% ]% S1 H, {% v! ]. C' t
---# C1 l* a9 d! Q8 r
timeserver: time.windows.com) k8 M. S/ \3 E2 C+ O5 ~+ r/ v- l
roles/init_system/templates/zabbix_agent.conf.j2为zabbix的模板文件,其中部分配置了使用了模板:
! A. V2 J5 {6 A
1 D, K: I5 s' q" M3 `, Z3 n5 }[root@ansible-server ansible]# egrep ^Hostname roles/init_system/templates/zabbix_agent.conf.j2( G  s8 v  @8 D; O' F* b
Hostname={{ servername }}9 [  v4 q1 a' H, f
4、ansible galaxy
$ I) }# O3 f0 h. Z# f, x5 K      ansible galaxy主要用于管理galaxy.ansible.com上的roles,默认下载的roles存放在/etc/ansible/roles目录下,也可在ansible的配置文件中自动以存放目录。在ansible使用过程中,我们可以下载别人写好的roles直接使用,也可将自己的roles上传于galaxy.ansible.com上,在下载使用别人的roles前最好能将下载好的roles代码查看一遍,然后再去使用。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

返回首页|Archiver|手机版|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )

GMT+8, 2026-6-12 05:31 , Processed in 0.022887 second(s), 21 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表