易陆发现互联网技术论坛

 找回密码
 开始注册
查看: 4227|回复: 0
收起左侧

ansible使用roles

[复制链接]
发表于 2019-10-17 21:25:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?开始注册

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代码查看一遍,然后再去使用。
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

北京云银创陇科技有限公司以云计算运维,代码开发

QQ|返回首页|Archiver|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )点击这里给我发消息

GMT+8, 2026-4-9 01:11 , Processed in 0.049437 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

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