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

ansible使用roles

[复制链接]

70

主题

73

回帖

1201

积分

网站编辑

积分
1201
发表于 2019-10-17 21:25:19 | 显示全部楼层 |阅读模式
ansible roles
4 P0 D2 Y) D- \; s$ Y. z
/ }1 E$ U) x/ g( G# _  在实际的工作当中,一个完整的项目实际上是很多功能体的组合,如果将所有的功能写在一个playbook中会存在如代码耦合程度高、playbook长而维护成本大、灵活性低等一系列的问题。使用roles能巧妙的解决这一系列的问题。roles是ansible1.2版本后加入的新功能,适合于大项目playbook的编排架构。5 o4 G  R) G# f% y1 v' _, d/ h
. g0 r8 V0 F* F0 K3 x( Z
1、ansible playbook中使用includes & |6 r0 y1 h' Y' Q8 l, u1 e: y  {

+ k: i1 Q% }/ K  ~, F    include在ansible中起引用功能,不仅可以引用ansible的playbook文件,也可以引用vars、handlers、file等文件。% P7 w2 ~( u! ]+ a. L6 T& T
/ A6 d; g9 q  i
(1)includes的使用场景, U( c# }7 g& f; m5 Q
+ U4 n% s, u- L7 o
         大量的playbook内容需要重复编写# X9 n( p3 p  T- a! c
& a# {* m2 V# \
         各tasks之间的功能需要相互调用4 q# }1 A: K  S+ z/ U" W

& Y/ t% [6 q& w7 h# r& a         playbook中的内容过多
$ D0 X5 u. e* f' S* y! B0 E6 s. O% o; z1 o$ @
(2)include的用法
& [; j# n% B& X" |) [1 N# o+ y6 j; o
5 S2 ^2 F5 v- p- u2 A         用法:
: t  f. I! c1 k; @* T5 _. v& \- o  I/ f! R) l
                tasks:
5 b; E% b9 l) ~$ }: n8 j3 d( o! v' t/ B/ I- }  Q' J9 @
                - include: playbookname.yaml; x: f% \, d6 i1 A
$ f' l7 ~: T) }* F
        修改主机名并添加用户admin,在修改主机名的playbook中使用include导入添加用户的playbook。                                   - z0 P1 f: K/ K- l

0 `. E' t! V" o/ G; P  \# ~#修改主机名的playbook0 I4 b& ]' {! C$ x  l4 M5 b: r
---
5 ~; G' h3 ?) q0 I! f7 Q- hosts: test3 r3 b. b' ?' s$ ?& f" v4 E( D
  remote_user: root
) f8 N$ B! K; G& V  K: t  ~, p  tasks:
7 W& H0 ~8 q) @% o6 }4 a  - name: change hostname% h* I. m) }1 S8 y+ m, d  T; P$ i
    hostname: name={{ servername }}, |' I" H6 G/ f8 W: a3 n% E
  - include: useradd.yaml7 L7 `( T& \% o9 p2 v
#添加用户的playbook
1 |5 A: F( x9 r5 u( P---8 g, u1 t% s1 K6 ^( k: W8 b" Z
- name: user add& m; `1 u" g/ [7 b* O/ N
  user: name=admin state=present: q. y1 c9 i9 i
                           
9 K$ |. ?* y3 m  T3 F(3)动态includes9 G& ]  K, A0 f6 `: p, G
1 L4 J9 c  c8 h. g
   动态的includes是指在满足一定的条件时,加载includes。% Q" T, r4 ]9 G7 G5 N- L

# P  L$ O& l- X. R   编写安装配置zabbix-agent的ansible playbook如下:
8 H+ H+ A# |( K, [: C' b% d! J! x
/ k3 Y" T* V9 n3 I' R0 [---) U: m  z) l" B2 a6 f
- hosts: "*"
" H/ P3 b1 o& G1 g$ K! f8 f  remote_user: root5 d0 d, R# C) h  y+ t) @' G
  tasks:
# u7 o- H( h* e # 将安装文件拷贝到远程主机的/tmp目录下
# {( e( ~" X9 x6 T9 R% l  - name: copy zabbix-agent  ^! x3 {5 i, I/ U; }
    copy: src=/tmp/zabbix-agent-3.0.9-1.el6.x86_64.rpm dest=/tmp/
0 V  \' I8 C9 _" m$ Y7 ~ # 安装zabbix-agent' J; h8 u9 P4 O' I3 ^0 e
  - name: install zabbix_agent
2 O: m+ ^2 l7 {% N0 q) x+ ]    yum: name=/tmp/zabbix-agent-3.0.9-1.el6.x86_64.rpm state=present
' O; [4 N  t* j0 a; `# 启动zabbix-agent
; v+ Y' n! v* H- N3 @3 a" O  - name: start zabbix_agent
6 @4 R( W) ^3 ^# \2 Y2 Y7 w7 n    service: name="zabbix-agent" state=started7 J' q; V0 A' D% n! E
# 导入配置zabbix-agent的playbook( P+ d6 Z. N& l8 z/ G3 o" x! {
  - include: configzabbix.yaml2 ~5 R2 c, t* M0 W6 V: i
    # 只有当系统为centos6时才导入configzabbix.yaml' }; u. x$ k+ ]
    when: ansible_distribution_major_version == "6"
1 R8 N9 |- O/ L- j9 T3 B6 |. i # 导入重启zabbix-agent 的playbook
, }# q7 ?7 N3 K0 c  - include: zabbix_agent_restart.yaml
/ s, q( Q. t1 _7 Ucongfigzabbix.yaml的文件内容如下:
5 X; \7 [7 y; N# ~* n' K---
6 l4 x; n$ R( b$ B, x, ^- name: configure zabbix_agent8 j, w& f; g; V8 m$ c& [  d
  template: src=/home/dayi123/ansible/0418/zabbix_agent.conf.j2 dest=/etc/zabbix/zabbix_agent.conf
3 m* x1 i' D  i$ w2 S重启zabbix_agent的配置文件zabbix_agent_restart.yaml内容如下:
$ K& R1 e! Y! U2 w6 k5 ~# ^! ~+ u* @' W: I  s" U
---
& C7 V7 Z4 s8 {0 B5 I" V1 t- name: restart zabbix_agent
0 i4 X1 Y5 v) g# ?  service: name=zabbix-agent state=restarted
: d3 g! b1 i% l. j2、ansible roles
6 P8 k' P" e' O' m1 o3 z. N) u   通过includes可以在playbook中导入playbook,在一定程度上解决了将代码写入一个playbook中耦合性低及维护困难等一些列的问题。如果使用include导入大量的playbook及模板文件时,没有规范及统一的存放目录及命名规范,也不利于维护,roles正好解决了这一问题。
8 ?* T5 J+ W% N) [# @
1 I* ~. s( I& M( b* X9 I        roles主要依赖于目录的命名和摆放,默认tasks/main.yml是所有任务的人口,使用roles的过程也可以认为是目录规范化命名的过程。roles每个目录下均由main.yml定义该功能的任务集,tasks/main.yml默认执行所有定义的任务;roles目录建议放在ansible.cfg中”roles_path”定义的目录下。4 _; q. n, }  R/ _, J4 x" @

& ]2 q* j( c4 w3 v. j(1)ansible roles目录结构- D" ~) e8 I/ ?9 \0 \/ s5 `' `

7 o6 \4 {5 g* z+ M# e, J    一个完整的roles是由task、handlers、files、vars、templates、meta等一系列目录组成,各目录存放不同的文件实现不同的功能,在调用时直接下文件名即可调用。ansible roles目录结构图如下:7 p7 Z# q# R% u5 @5 f1 ]

: `1 g: h% {9 T2 c % `- h& s8 ?0 M; x) y

6 k/ n0 e0 U/ r4 K/ A. \1 J9 p6 xansible roles 目录结构
: Y; f3 N+ C+ |8 t5 c9 R" h. ^1 J  E' u
1)tasks目录
# ]7 C! [: @. e/ N% S$ W; E- l4 b+ E7 N) G; T
     tasks目录用于存放ansible执行的任务,tasks目录下必须存在main.yml文件,main.yml为主函数,用于导入需要执行的任务。
3 a: {% t! [% e/ b! e
# ^4 j- R7 y2 V9 Y8 `* B2)handlers 目录6 e/ `' ]* \4 F# z! j7 t. |+ z6 @

2 W2 w' p9 g# B6 }     handlers经常和notify搭配使用,当文件、进程及返回状态发生变化时,notify通过handlers做响应的变更。handlers目录下也需要包含main.yml,包含在在main.yml中的handlers将被执行4 `( r' ~5 E$ [. f$ O5 p6 G$ e
8 X6 i+ z9 D- w/ g$ g' U  m4 Q8 ~3 C
3)templates及file目录
) C* T' a' `. i/ C2 S& ~% N
" E5 ]% L% \5 Z9 R) o. P6 C% c     templates目录及file目录均用于ansible目录文件处理,两个目录下均用于存放传输的文件,但templates目录下存放的是”.j2”格式的文件模板,文件中可以写变量。' X# _1 Z& }* c# T
+ @: x- J7 k: x% C# r3 U9 f# L
4)vars目录
5 d3 H# ~! i: k7 H
# H6 f. m4 y! _& M# k     vars目录下用于定义当前roles执行时使用的变量,应当存在main.yml文件。8 A6 ~8 k9 ]# a. F2 A$ m, L8 [

4 [! W7 W5 Z, \+ j6 ^5)default目录
' G7 }/ k& @0 H. ]$ M
/ L$ V* v) g7 c3 |/ O  为当前角色定义默认变量时使用此目录,应该包含一个main.yml文件
# w& [# o( V7 \, _$ v  Q3 d
+ g. t$ E3 H  R# q$ k5 N6)meta目录
6 i% v4 g& X( E8 ~5 y4 e& d5 p+ K  A) A/ o  s& ^: z% |% ~; H
  应当包含一个main.yml文件,用于定义此角色的特殊设定及其依赖关系。/ T8 S" @# }# p/ J( O2 G, D2 u
. g3 R- ]' V* _, i
(2)ansible roles的执行方法: I% M# v  n& k) I& s! {* L( [
2 B. X5 M% \3 ^5 Z1 d* k9 \' i
     roles的执行方法同ansible-playbook执行方法一样,需要调用roles的调用文件Rolesname.yml文件3 G# X! e" h2 c% i, J3 Y$ H1 G9 v

: N3 O' j2 m+ H) D' trolesname.yml文件格式如下:; t  E3 R6 h( G- J

2 Q6 N( M* J( u5 A7 \---0 j. y% W! S8 v8 W7 J2 X3 b
- hosts: all) L6 I7 H* ^$ t* n- U' j1 Q$ `* \
  remote_user: root
$ x5 G8 O, a+ I: x6 C4 u( Y8 S4 p  roles:
- p0 K' E+ M7 L2 T  - Rolename5 I; f( ?8 d" A" C8 R, u" @
如果存在不同版本的操作系统是,roles调度文件可以根据不同的操作系统类型执行不同的roles。- L1 E; Q. a( T+ P* E: W: u# |
2 q* u* I: z$ Q1 }& d7 [' s( E, i, O
---
  b' s+ C+ U- R9 k/ Q# t/ V1 @- hosts: all
, w; c2 [6 k. y' l6 d$ h  remote_user: root( X: j$ e) k% p+ p
  roles:
3 n; `6 B5 j+ k! Y' B: _  - { role: rolename1, when: when: ansible_distribution_major_version == "6" }
( `5 C9 r1 ]& B/ G  - { role: rolename1, when: when: ansible_distribution_major_version == "7" }! l% z1 M; m# O$ {$ K5 W
roles执行方式如下:4 }: B) [- v$ M6 u

0 Q9 }" x( K% F8 Eansible-playbook rolesname.yml
; ^# r' w% G$ y7 B- X' @3、创建roles初始化系统  u( j9 t& x) E7 J+ Z
(1)系统出书化的roles目录结构:1 w& c$ |# T0 f8 F5 N2 Y
0 D9 Z) J0 y% `/ L
[root@ansible-server ansible]# tree roles/
  `' }2 D' V5 h2 T* i9 y& yroles/" q6 h3 j- r+ ]2 `/ P
├── init_system61 S7 w3 v+ O5 q5 h8 R) p! S
│   ├── files
% N/ I4 c3 y* N3 B│   │   └── zabbix-agent-3.0.9-1.el6.x86_64.rpm
# ~4 G& }6 s( T% P0 \9 g│   ├── tasks5 R& G' ~8 X1 b+ O
│   │   ├── init_system.yml
3 \, s1 w, z7 l3 L│   │   ├── installpack.yaml5 }0 y! V+ R4 I4 ?- n9 t: Q* N
│   │   ├── install_zabbixagent.yml; n) [: Q5 }& T0 G" D/ u0 I: _
│   │   └── main.yml
1 J, G4 ^5 Z+ W6 r│   ├── templates7 x( [9 L4 o( ]2 j
│   │   └── zabbix_agent.conf.j2
3 E' @$ Q. r4 ~│   └── vars1 e# E( |$ @. Q
│       └── main.yml
- E- o8 S6 W' g% @1 z( G( d0 k└── initsystem.yml
+ D+ \* P1 _) Z% Y(2)各配置文件内容5 }' S2 f( Y9 F  u4 q
0 R8 ]8 @) V) M) }! N- u
roles/initsystem.yml 中的内容:& L3 M' H+ a* q. ?  w5 r/ R

. x! S( S, L6 s% g6 \7 e$ R* _---* z# ?1 f$ U  u6 r* |
- hosts: 10.0.0.135 H  w/ }9 J+ _* N
  remote_user: root
6 D, B# P3 }3 v; r) s$ j- o  roles:
; e) K1 E  H) r% s# o  j0 ?& o' R    - init_system8 C7 Z, F, S1 c' M
roles/init_system/tasks/main.yml 中的内容:, @! Z% V& C6 _4 z9 B

) U* a6 _+ e: s    ---/ c& U& n% u1 G6 @0 |
     - include: init_system.yml
) d& e0 e$ Y( b4 g8 u     - include: installpack.yaml4 y. A; m$ c0 x% I! ]5 d
     - include: install_zabbixagent.yml
- A! h5 w* K: ^8 K roles/init_system/tasks/init_system.yml 中的内容(变量”servername”是配置在/etc/ansible/hosts中):
" G4 ]$ @. H2 q, q6 ~& W8 Z  H. N( t- e1 X8 Y. t
---
/ L" @0 A& ^) F, h2 k6 {; I - name: hostname
' d9 C7 r: y# i   hostname: name={{ servername }}
1 b3 |# B( B: w" N8 v; H
9 J1 A! I" N4 L! g) l7 `' X - name: disabled iptables
2 K8 W- F7 K: B* N/ g   service: name=iptables state=started enabled=no" R+ x6 S: ~* `2 Y8 k- k

4 W! K1 X) A4 {$ c2 U - name: shutdown selinux2 _# @. u7 o7 {
   replace: dest=/etc/selinux/config regexp=^SELINUX=enforcing replace=SELINUX=disabled- `) z- Q6 O5 z/ X+ b
   tags: selinux( |6 W' V0 W3 l; c# O

5 f& i6 {0 Q, v; |3 C - name: install ntpdate% ~- j9 G5 ^2 s; F' b
   yum: name=ntpdate state=present
+ [' q4 T7 y" ?# X' Z/ Z - name: lock-in time1 d7 R9 f7 o2 Y/ r' X0 u
   shell: ntpdate {{ timeserver }} && hwclock -w+ |1 P  t9 P: n( L6 a% y9 m$ T
- name: crontab ntpdate  o( E1 }( i+ v/ Q. F% e
   cron: minute=1 hour=*/2 job='/usr/bin/ntpdate {{ timeserver }}' name=ntpdate
7 M/ O) d6 y6 S$ R+ u+ K( H
6 k3 f' V9 M* o - name: Change nofile limits.5 N; E8 q5 b  j  X; f& p
   lineinfile: dest=/etc/security/limits.conf line={{ item }}4 m1 L; \2 F1 z* V. `
   with_items:! H- q$ s$ G2 ?# E$ y5 |% R8 b
     - '* - nofile 65535'5 A: B/ A+ \0 X% e1 g* _$ B! L
     - '* soft nofile 65535'
! ]& ~$ t+ o" d     - '* hard nofile 65535'3 {0 }5 e/ Q9 m7 Y) m$ [
roles/init_system/tasks/installpack.yaml 中的内容:
7 j8 H' A& g5 z4 t: K7 p; n: }' f3 c6 b+ s; t
- name: Install RPM package! O, T: v9 h) m( B6 L6 D# D) m* o, y+ ?
   yum: name={{ item }} state=present/ H/ O  ?, w* ]  m; _/ i0 x$ \
   with_items:
$ f! U" }% X5 U0 P% b9 g    - gcc" t& C8 B) @" |
    - gcc-c++3 d; d" c9 S/ K1 Y6 r1 R
    - make3 o) I! o, q! z9 n& ^3 R& Z" Z6 M
    - lrzsz6 k6 ~  [  q: g& n5 X, z5 R$ P2 p
    - vim) ~9 D: Z" l, ~7 @0 \7 _% M4 }# C( b
roles/init_system/tasks/install_zabbixagent.yml 中配置:
# G! A% i: v6 ^1 H1 A# r( @3 z3 G5 a
6 M$ U9 Q* _+ M0 U; U( n; R---
( \4 a% P- t! O( F; i. P) \ - name: mkdir /tmp/tools
4 u3 E4 W# F; l   shell: mkdir /tmp/tools -p: t/ S# P/ O% i
- name: copy zabbix-agent- z+ m3 l5 c; O3 W( m. ^! a
   copy: src=zabbix-agent-3.0.9-1.el6.x86_64.rpm dest=/tmp/tools/
9 ~" R1 x. u6 p - name: install zabbix_agent
4 _# L2 |: p/ Z1 n   yum: name=/tmp/tools/zabbix-agent-3.0.9-1.el6.x86_64.rpm state=present. ^" t; T0 [" O' c; T
- name: configure zabbix_agent
4 |5 V$ ]: B  b3 K5 a2 N   template: src=zabbix_agent.conf.j2 dest=/etc/zabbix/zabbix_agent.conf: ~9 {& W  e& Z6 p, w
- name: start zabbix_agent7 {) l1 k; R+ g( X
   service: name="zabbix-agent" state=started
8 P( B  |+ F* d* Droles/init_system/vars/main.yml 中的内容:
9 @( I4 d( X2 w3 A' p
) A* r8 D$ ?" A! R! [---
( P: r* f" T1 Jtimeserver: time.windows.com
9 A2 g/ {2 A% P" O  _; Troles/init_system/templates/zabbix_agent.conf.j2为zabbix的模板文件,其中部分配置了使用了模板:3 q' e3 `* s4 {' @. l
, E/ o* Y. y4 _) P1 h
[root@ansible-server ansible]# egrep ^Hostname roles/init_system/templates/zabbix_agent.conf.j29 r# \" I7 I4 w
Hostname={{ servername }}$ d! I. @. @4 A9 W4 p. g& P: |
4、ansible galaxy2 v; u5 S5 m- u* A4 J, Y7 `
      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:34 , Processed in 0.022165 second(s), 21 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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