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

ansible使用roles

[复制链接]

70

主题

73

回帖

1201

积分

网站编辑

积分
1201
发表于 2019-10-17 21:25:19 | 显示全部楼层 |阅读模式
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代码查看一遍,然后再去使用。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-12 04:26 , Processed in 0.017130 second(s), 20 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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