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

ansible使用roles

[复制链接]

70

主题

73

回帖

1201

积分

网站编辑

积分
1201
发表于 2019-10-17 21:25:19 | 显示全部楼层 |阅读模式
ansible roles & T; m! }! Z* g* n+ u
; `* T5 t& C3 l: W, L& x; r% Y; \
  在实际的工作当中,一个完整的项目实际上是很多功能体的组合,如果将所有的功能写在一个playbook中会存在如代码耦合程度高、playbook长而维护成本大、灵活性低等一系列的问题。使用roles能巧妙的解决这一系列的问题。roles是ansible1.2版本后加入的新功能,适合于大项目playbook的编排架构。
9 t- ^, D* |# |/ \) b4 U
) j  q8 [1 V9 t. r* s1、ansible playbook中使用includes / `) Z! `; ]0 n* b+ W
5 e6 Y. x7 v% }( x  q$ H; S+ Q
    include在ansible中起引用功能,不仅可以引用ansible的playbook文件,也可以引用vars、handlers、file等文件。
; |- ]6 }$ c; i# [5 Y  g! R; G# d; h# t4 o& \/ Z
(1)includes的使用场景, ~8 W4 c! O) j+ \7 v5 l& Z' S

' B& _- k! q0 ~* O) c         大量的playbook内容需要重复编写% L7 f! h0 R$ K1 h' l* e% d% _) r

$ f: b$ u) I' j- Q0 q         各tasks之间的功能需要相互调用1 e# L( L8 e4 l
2 N. |9 |# R7 Z/ Q+ y7 w0 x
         playbook中的内容过多
' n  H8 P4 r6 c1 h: q4 c1 l, U8 S2 p& ^! p: ^
(2)include的用法
4 {* j" @" P  l5 }& }' [: v% O" Z1 s# R+ E/ W8 l  d3 U* U
         用法:/ E* k' n9 b  z7 d0 k
* N% J0 ?: ~$ s4 ~6 U
                tasks:
# m2 Z. `" e# T" a5 W3 @' B
  R' g- R3 y0 v  X4 c; f5 R                - include: playbookname.yaml4 A1 \3 X: m; e( y3 W) j
$ G2 F+ x( b7 X: m+ J1 Z
        修改主机名并添加用户admin,在修改主机名的playbook中使用include导入添加用户的playbook。                                   
2 n1 @7 Y8 t8 g; h- t: I5 ?9 m* A
5 G& a- R' s! A# @/ A#修改主机名的playbook3 r1 N6 T$ [  v! r4 Z# m
---
5 t2 e5 v) y; ]( n  S- hosts: test( R* I- n$ f( h( t9 ^) i
  remote_user: root" D0 K0 L2 B7 D
  tasks:( q9 q& p9 ^. Z) W1 ^0 j7 @
  - name: change hostname
$ T# K; f, q7 G" {! I7 D    hostname: name={{ servername }}
+ V! i* V& O3 U5 J1 _: t% x  - include: useradd.yaml4 L, N" o8 H' |+ }
#添加用户的playbook/ G, M4 s$ l5 K3 D0 i# F* I
---) p: b( [4 {% ~: Y4 O
- name: user add
& Y, E. D' t- w' {- J, }' S' [/ Y" {  user: name=admin state=present: c' _1 t/ D# T7 F+ P
                           2 ~+ a8 k& v+ B1 R9 o, @6 C" g
(3)动态includes
7 @! w/ E7 o9 _) g8 s* _' G+ O- H  b/ G% f
   动态的includes是指在满足一定的条件时,加载includes。+ b2 t+ Q8 B0 F1 B' i

9 P) A) D! E0 A   编写安装配置zabbix-agent的ansible playbook如下:8 F9 x7 A* Y: @6 I9 ^

0 A4 m# ^& x5 u% \0 O4 W---/ p4 Q4 l  T# V8 ?7 A
- hosts: "*"
$ o& A: U/ h! c  remote_user: root
5 ^" Q: h( x* \  tasks:
" _( p; Y% W+ L! y # 将安装文件拷贝到远程主机的/tmp目录下* A7 j0 q- V3 d+ M1 ?2 _; {" A
  - name: copy zabbix-agent) D4 e$ J) }* p: k& T
    copy: src=/tmp/zabbix-agent-3.0.9-1.el6.x86_64.rpm dest=/tmp/
9 P# }" T* ^5 Q* h$ Y3 M- k+ } # 安装zabbix-agent
  x/ m4 u; W5 V+ e, v+ \0 p  - name: install zabbix_agent; x9 h  t: q; L" n3 _8 P
    yum: name=/tmp/zabbix-agent-3.0.9-1.el6.x86_64.rpm state=present6 J4 Q" P0 ?6 g! ?+ N
# 启动zabbix-agent+ {) s/ k/ B8 F. `! |% n# ?
  - name: start zabbix_agent5 I3 V" E0 \2 d7 t* \# T
    service: name="zabbix-agent" state=started# @! `/ _/ w4 U( q: {
# 导入配置zabbix-agent的playbook
5 R5 O1 f1 o# i& S6 O: Y/ u# w% p  - include: configzabbix.yaml
% P" ]+ T' I2 E& s    # 只有当系统为centos6时才导入configzabbix.yaml( y) u8 ]8 @7 t" r6 w
    when: ansible_distribution_major_version == "6"; z4 C4 {9 \3 u5 U. T: j
# 导入重启zabbix-agent 的playbook! u% w1 Y) H7 o0 [
  - include: zabbix_agent_restart.yaml& ?) e2 d* C3 |7 p1 a" w
congfigzabbix.yaml的文件内容如下:* T4 H- B5 h; Z" n5 d$ x( O
---
# u$ L) n$ z" D5 x; g- x- name: configure zabbix_agent
: t, N5 D! S& l6 ]9 g. w  template: src=/home/dayi123/ansible/0418/zabbix_agent.conf.j2 dest=/etc/zabbix/zabbix_agent.conf4 ^/ a) {& E7 s) d3 d
重启zabbix_agent的配置文件zabbix_agent_restart.yaml内容如下:, t9 w, _) o3 |$ m+ S

7 E/ F" C0 F( ?& J, E* s---
; q' ]8 j! g8 E; `. i+ ~& J- name: restart zabbix_agent
# X% j9 W: u/ H3 v  service: name=zabbix-agent state=restarted# F5 n$ ~. g8 e$ `3 }- ]
2、ansible roles  V8 ^5 Y3 {( y' B
   通过includes可以在playbook中导入playbook,在一定程度上解决了将代码写入一个playbook中耦合性低及维护困难等一些列的问题。如果使用include导入大量的playbook及模板文件时,没有规范及统一的存放目录及命名规范,也不利于维护,roles正好解决了这一问题。) U) _) k8 x. i. n
: T% b4 T, w$ _
        roles主要依赖于目录的命名和摆放,默认tasks/main.yml是所有任务的人口,使用roles的过程也可以认为是目录规范化命名的过程。roles每个目录下均由main.yml定义该功能的任务集,tasks/main.yml默认执行所有定义的任务;roles目录建议放在ansible.cfg中”roles_path”定义的目录下。: x8 Z5 p8 b. R8 e

# d; L  `2 o' L. W(1)ansible roles目录结构
3 {, o$ {/ b) A  y1 i- i
) V1 ~4 X/ i/ |. D/ U$ x    一个完整的roles是由task、handlers、files、vars、templates、meta等一系列目录组成,各目录存放不同的文件实现不同的功能,在调用时直接下文件名即可调用。ansible roles目录结构图如下:: h4 u3 I. v: n0 _7 |) H9 Q

7 V7 Z  r  w* x9 G" k! X1 h
# B( a; b7 E( O2 V* q0 n
; z! B2 N7 x: m  }' B6 ^; \4 W/ Pansible roles 目录结构
7 r1 d0 Y8 G, s$ m
' ^% a3 ~4 j: g0 Q3 V) s8 }( K1)tasks目录
' y  A3 a* T  w9 x: Q! m% p6 C! G' x
     tasks目录用于存放ansible执行的任务,tasks目录下必须存在main.yml文件,main.yml为主函数,用于导入需要执行的任务。
  S  R5 h  `% g% T( g# C. D; ?% N' b+ o  }6 V( Q5 p
2)handlers 目录3 p$ d$ ]( c3 v" N
/ C3 r" n+ J8 |4 f6 ^' c  e7 e0 a
     handlers经常和notify搭配使用,当文件、进程及返回状态发生变化时,notify通过handlers做响应的变更。handlers目录下也需要包含main.yml,包含在在main.yml中的handlers将被执行
( r' [6 T, g5 S. n5 U- Y( D% q5 c; h- w5 X+ L
3)templates及file目录
" s6 y) H" @/ Q, C$ [- Q. Y4 Z
+ t6 m& O+ T3 K9 i* j" B* }( i4 X     templates目录及file目录均用于ansible目录文件处理,两个目录下均用于存放传输的文件,但templates目录下存放的是”.j2”格式的文件模板,文件中可以写变量。
  ]  S, R0 A4 X) T0 i  V, X  P; K6 ?& K6 A- J4 z) W6 F
4)vars目录6 _2 t! f  z; c& M8 s9 B4 B; |
; c! Y) E9 Y, r) J5 F
     vars目录下用于定义当前roles执行时使用的变量,应当存在main.yml文件。
9 a  z- r2 z7 a$ o% S5 T$ R7 y
/ ~* e0 G  W8 B# r/ l' n5)default目录
7 u+ u+ L+ b8 _! H/ ^/ D3 x$ e. e9 L1 }1 o2 f
  为当前角色定义默认变量时使用此目录,应该包含一个main.yml文件$ e2 ^, m1 Q/ B; ?, Y! Q

! T. X1 z) x& M7 Y8 J) Q; |% l6)meta目录
* \5 j  a' Z0 u) h( g3 v) G4 \/ k% J
  应当包含一个main.yml文件,用于定义此角色的特殊设定及其依赖关系。
  W3 G8 x) \7 O2 d' g" N( o  O. g6 x6 y
(2)ansible roles的执行方法- t6 M9 Y4 x# N8 Y6 w9 P8 s1 v
* J# F  [. q: c, |$ d, b
     roles的执行方法同ansible-playbook执行方法一样,需要调用roles的调用文件Rolesname.yml文件
5 G. E: E) p9 O: }. n, \" s, u, g* ^. m1 ]9 v
rolesname.yml文件格式如下:
$ ^! W& W" C9 {' X0 K& q7 ~, ?8 [9 Z1 d
---
: w: Q! t5 T+ W# T& w$ a- hosts: all
; w/ Q) Z; d- ~4 B6 _& L" h# K  remote_user: root4 H3 C# y; ^- n4 W9 a
  roles:
/ @6 F- e* {9 I2 ?; c# b1 K  - Rolename  L8 k# n- o1 a7 @& E2 Q
如果存在不同版本的操作系统是,roles调度文件可以根据不同的操作系统类型执行不同的roles。
8 L1 P2 U# R8 O5 E2 Z5 i
8 N- E3 q3 U; C" O2 N9 `  U/ S---1 L) g+ l7 g1 }" ]6 u, D
- hosts: all( z0 A! O! c+ h: }
  remote_user: root
* c1 U2 A( u# U0 E  roles:5 v) |& g: B; r, l
  - { role: rolename1, when: when: ansible_distribution_major_version == "6" }
( g6 }* H) b. `) q  - { role: rolename1, when: when: ansible_distribution_major_version == "7" }
" I, `' ]( I' G0 N& q& _7 i. Oroles执行方式如下:
" ]1 u: g/ {# z" v  v* a6 D' ]. q* _; e
ansible-playbook rolesname.yml
$ O7 W+ Q: S8 H6 Y+ `. ^3、创建roles初始化系统
' B" v( `: U  Y(1)系统出书化的roles目录结构:
: u$ R( A, T/ C- C, k
& r$ Q9 _; M% y6 C) d! C. R2 v[root@ansible-server ansible]# tree roles/$ h9 ^8 T9 q5 W* b
roles/
4 G) C% v2 N$ }: u$ \├── init_system6( K; T* D- \* O& J, s) q
│   ├── files+ M" i0 l4 C  G( e
│   │   └── zabbix-agent-3.0.9-1.el6.x86_64.rpm% S! x6 L6 g( d( W: l
│   ├── tasks
( _  y* }9 M/ M1 g* J- p: N1 q" {│   │   ├── init_system.yml$ B& B' V) v# o9 F+ p
│   │   ├── installpack.yaml
# U: b% m2 @. r: Z" x. R; _│   │   ├── install_zabbixagent.yml
2 N! f( E1 K3 R5 j  @/ n# @│   │   └── main.yml, C8 C0 z8 m' X  i: N- q
│   ├── templates) m2 G4 b, j& S
│   │   └── zabbix_agent.conf.j2
9 P! S# Z6 v7 D/ d7 O- D│   └── vars/ A/ f# u; V8 N  @6 |" f) y
│       └── main.yml
7 n2 ?9 b, P, [$ J└── initsystem.yml
7 p/ h, a7 F( H* b7 X* w(2)各配置文件内容4 B" O8 G9 l5 j9 R# Z0 |
+ {9 V* `8 u" P5 A1 j* ]4 z5 [, _: E  K
roles/initsystem.yml 中的内容:
( k: ?0 [4 W- g  d8 f1 Z+ c! Q2 y  K7 N1 s  I
---
( \' ]4 _8 o( u9 a( h5 S- hosts: 10.0.0.13
- S( @% H* F. F* J* g0 B  remote_user: root+ B  Q3 v. r( o( r; ~
  roles:
6 o- S1 `1 r2 W1 k- Q# |3 l    - init_system. t8 L5 W+ }. j0 e( j
roles/init_system/tasks/main.yml 中的内容:
; B1 [, V* s- {/ [1 j* C) B# n
  t% h$ p& y" Y    ---% `/ r% J7 S) m5 p+ \' O2 U
     - include: init_system.yml
! L5 m& Y/ }# u' x7 }. C4 f; H     - include: installpack.yaml" b! r2 ^* w5 h3 Z( y
     - include: install_zabbixagent.yml
3 V- T0 a" U, T% s roles/init_system/tasks/init_system.yml 中的内容(变量”servername”是配置在/etc/ansible/hosts中):
+ l5 G5 A" O1 z' W; k, e" _( X+ S- T( O" ~% ~
---
: [- b+ m- J* m1 I& H - name: hostname7 m- {0 Y; b; R1 E
   hostname: name={{ servername }} ' d& o4 C6 j2 x, l) v
% w4 |: [" [! y4 ^& y  d7 T
- name: disabled iptables" Z( b: c, w( u' q
   service: name=iptables state=started enabled=no
4 G' M! _# l% O! `
6 v, {( U2 F: j- u9 N  ~- B - name: shutdown selinux2 U9 D' t; Y( r8 j' G- O
   replace: dest=/etc/selinux/config regexp=^SELINUX=enforcing replace=SELINUX=disabled8 r% _5 r4 o8 M# [$ i* F
   tags: selinux
/ P+ E" z# _/ W7 e0 C/ t4 ^% R
) z' ~9 X2 b- W2 u( c$ z) m9 ? - name: install ntpdate
1 k9 L, `, ]" b   yum: name=ntpdate state=present
4 M6 w$ ]3 O# }/ ]3 G" Y4 e6 a2 F - name: lock-in time
8 R/ D( K- f0 R   shell: ntpdate {{ timeserver }} && hwclock -w. E% w& ~( J- {+ d" ?
- name: crontab ntpdate
0 Y3 A7 c) `! a, }# L   cron: minute=1 hour=*/2 job='/usr/bin/ntpdate {{ timeserver }}' name=ntpdate" t5 V3 ]& \! T" u. Y! |. h
: g# Q3 _" E/ A1 O7 o
- name: Change nofile limits.
* n  E2 _) s, m7 g   lineinfile: dest=/etc/security/limits.conf line={{ item }}
6 H7 L+ u) d: N$ `+ E   with_items:
: r. N* B! i/ |     - '* - nofile 65535'8 a. n4 p* }) e3 Q3 J9 M, _9 r2 ^7 l
     - '* soft nofile 65535'
! t5 o" I" _$ t+ k) b6 K' T     - '* hard nofile 65535'
0 M" R$ m0 ?4 H7 E& Oroles/init_system/tasks/installpack.yaml 中的内容:0 e7 b; J, w$ S& h( X" T. S

5 z* P; i! a' ^- name: Install RPM package
+ m; p3 Q! {* n  ]* v5 U   yum: name={{ item }} state=present( ]' ?$ k- ], j
   with_items:
: U0 M6 a- U  j6 J8 g/ P7 n4 p% J    - gcc* Q( e& h! t+ Q0 c
    - gcc-c++5 Q+ u3 J% e6 U$ _
    - make
" S+ c$ P0 Q, c7 I1 A# t: U' z    - lrzsz9 w- s4 p4 z6 @7 ^8 t  D
    - vim
- r4 S# u* u4 vroles/init_system/tasks/install_zabbixagent.yml 中配置:
: Z$ n& i+ {3 Z
3 [5 L. Z6 w0 k---
$ n' F2 Q( a9 M1 G2 ^# D# U - name: mkdir /tmp/tools) g8 w( d9 C, f
   shell: mkdir /tmp/tools -p! R$ [5 _) M9 }, f7 K2 ]% s
- name: copy zabbix-agent
# d8 [6 E/ d% j5 r( c; T   copy: src=zabbix-agent-3.0.9-1.el6.x86_64.rpm dest=/tmp/tools/
: s0 Q4 M. w: q4 `: m8 x - name: install zabbix_agent  v, t' ]; `( W1 z5 ~
   yum: name=/tmp/tools/zabbix-agent-3.0.9-1.el6.x86_64.rpm state=present
' j3 e! `  |5 S. O& l  P - name: configure zabbix_agent8 Y4 z! q5 X! ]  [
   template: src=zabbix_agent.conf.j2 dest=/etc/zabbix/zabbix_agent.conf
3 j, e( F: i+ t/ h - name: start zabbix_agent  d* ^2 R3 w$ N' v& e* i
   service: name="zabbix-agent" state=started, f4 ]* q0 U  y; V& E
roles/init_system/vars/main.yml 中的内容:5 d) e% l7 W: `: q5 _, _

' a( c9 [) A* N, {3 Y---4 H6 @2 g8 X% ]5 X
timeserver: time.windows.com8 d7 ]" Z( T) U% p. q! S
roles/init_system/templates/zabbix_agent.conf.j2为zabbix的模板文件,其中部分配置了使用了模板:- ^4 \  {( N7 A9 R" ]

1 y1 [7 R: N" X, ]+ C[root@ansible-server ansible]# egrep ^Hostname roles/init_system/templates/zabbix_agent.conf.j2
% B( y( b1 b. L% p4 m' nHostname={{ servername }}: `( {7 L1 R  f4 Y; K+ _
4、ansible galaxy5 c7 F2 f3 R7 e9 L3 ~
      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 04:28 , Processed in 0.016400 second(s), 21 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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