设为首页 收藏本站
查看: 2994|回复: 0

[经验分享] ansible playbook

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-6-30 08:21:01 | 显示全部楼层 |阅读模式
Yml介绍Playbook是使用yaml语言定制的,YAML是一个可读性高的用来表达资料序列的格式。YAML参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822等。Clark Evans在2001年在首次发表了这种语言,另外Ingy dt Net与Oren Ben-Kiki也是这语言的共同设计者。
Yml语法:
1
2
3
4
5
6
- host: websrvs                #定义执行的主机
  remote_user: root            #定义执行的用户
  tasks:                       #定义任务
    - task1                    #定义第一个任务名称
    module_name: module_args   #定义使用的模块,和模块参数
   -  task 2                   #定义第二个任务名称



简单示例1:定义一个yml:对webserver组中的主机,调用group和user模块创建组和用户;对dbserver组中的主机调用copy模块复制文件。
wKioL1WRXgfDfo0oAAF787AQ2Wk406.jpg
执行yml
wKioL1WRXgjAhb5SAAOS8Gy7Hf8369.jpg
执行第二遍,返回的所有结果为ok不是表示执行ok而是所有条件都满足
wKiom1WRXEfxB6NHAAM3q1qNDQY516.jpg
简单示例2:搭建一个apache环境
wKiom1WRXEeyi5FAAAEmjg09I48312.jpg
准备需要复制到被管理主机的httpd.conf配置文件,修改监听端口为8080

1
2
3
4
[iyunv@node1 ~]# mkdir conf
[iyunv@node1 ~]# cp /etc/httpd/conf /httpd.conf conf/
[iyunv@node1 ~]# vim conf/httpd.conf
Listen 8080



应用之前先停止webserver组中的httpd服务,并卸载
1
2
[iyunv@node1 ~]# ansible webserver -a 'service httpd stop'
[iyunv@node1 ~]# ansible websrvs -m yum -a 'name=httpd state=absent'



执行:
wKioL1WRXgmy1G5xAALpdQphST4654.jpg
验证:httpd软件包已经安装,服务开机自动启动,而且也监听8080端口
1
2
3
4
5
6
[iyunv@node2 ~]# rpm -qa httpd
httpd-2.2.15-39.el6.centos.x86_64
[iyunv@node2 ~]# chkconfig --list httpd
httpd          0:off1:off2:on3:on4:on5:on6:off
[iyunv@node2 ~]# netstat -lntp | grep 8080
tcp        0      0 :::8080                     :::*                        LISTEN      40826/httpd



YAML中的变量1、自定义变量 wKiom1WRXEiiLDQsAAHI3ANDjuI560.jpg
2、facts收集被管理主机的信息时,会返回很多变量,这里就是调用了返回的ipv4地址变量
示例:将客户端返回的ip地址,创建webserver组中主机的/tmp/test.ans文件。
wKioL1WRXgqSb2vOAABxvNPNapw486.jpg
执行结果如下:
wKioL1WRXgqia9NoAAIltxFq0aI911.jpg
验证:使用的变量名一样,但是生成的内容却是被管理主机的ip地址
1
2
3
4
[iyunv@node2 ~]# cat /tmp/test.ans
[u'172.16.4.101']
[iyunv@node3 ~]# cat /tmp/test.ans
[u'172.16.4.102']



3、主机变量示例:对webserver组中的主机,定义testvar变量,值为ip地址后两位
1
2
3
4
5
6
[iyunv@node1 ~]# vim /etc/ansible/hosts
[webserver]
172.16.4.101 testvar="4.101"
172.16.4.102 testvar="4.102"
[dbserver]
172.16.4.103



设置yml文件,和使用其他变量一样的方法调用变量:
wKiom1WRXEmThYrGAACCrUBcPXM619.jpg
执行yml
wKioL1WRXgvTJyqgAAIIsl9jA1w183.jpg
验证:相同变量,不同主机得到了不同的值
1
2
3
4
[iyunv@node2 ~]# cat /tmp/test.ans
[u'172.16.4.101'],4.101
[iyunv@node3 ~]# cat /tmp/test.ans
[u'172.16.4.102'],4.102



4、配置文件中引用变量(模版)示例:使用变量指定httpd.conf配置文件中一些参数的值
定义配置文件中使用的变量
1
2
3
4
5
6
7
8
9
10
11
[iyunv@node1 ~]# vim temolastes/httpd.conf.j2
<IfModule prefork.c>
StartServers       8
MinSpareServers    5
MaxSpareServers   20
ServerLimit      256
MaxClients       {{ maxClients }}
MaxRequestsPerChild  4000
</IfModule>
Listen {{ http_port }}
ServerName {{ ansible_fqdn }}



修改Ansible的hosts文件定义主机变量
1
2
3
4
5
6
[iyunv@node1 ~]# vim /etc/ansible/hosts
[webserver]
172.16.4.101 http_port=80 maxClients=100
172.16.4.102 http_port=8080 maxClients=200
[dbserver]
172.16.4.103



定义yml:定义的过程中使用变量,根据不同主机定义的值不同,生成的配置文件参数也不同

wKiom1WRXEmzfui1AAFxuiKFbsA119.jpg
执行过程
wKiom1WRXEqDFcTxAALzDKcJIvg486.jpg
验证:相同的playbook由于对hosts指定的变量不同,所以生成不同的配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
node2:
<IfModule prefork.c>
StartServers       8
MinSpareServers    5
MaxSpareServers   20
ServerLimit      256
MaxClients       100
MaxRequestsPerChild  4000
</IfModule>
Listen 80
ServerName node2
node3:
<IfModule prefork.c>
StartServers       8
MinSpareServers    5
MaxSpareServers   20
ServerLimit      256
MaxClients       200
MaxRequestsPerChild  4000
</IfModule>
Listen 8080
ServerName node3



条件测试When语句示例:添加用户,但是只对主机名为node2的主机添加。
wKioL1WRXgyRrjz2AAC2B6CV_MQ373.jpg
执行结果如下:
wKioL1WRXgzgbjDdAAKRzHAmWOo907.jpg
迭代当有需要重复性执行的任务时,可以使用迭代机制。其使用格式为将需要迭代的内容定义为item变量引用,并通过with_items语句来指明迭代的元素列表即可。例如:
wKiom1WRXEuiMCBqAAB4Z9Qj1Zs041.jpg
上面语句的功能等同于下面的语句:
1
2
3
4
- name: create user
user: name=testuser1
- name: create user
user: name=testuser2




事实上,with_items中可以使用元素还可为hashes,例如:
wKioL1WRXg3wHpyHAACto2lJGlo886.jpg
ansible的循环机制还有更多的高级功能,具体请参见官方文档(http://docs.ansible.com/playbooks_loops.html)。
Playbookplaybook是由一个或多个“play”组成的列表。play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上来讲,所谓task无非是调用ansible的一个module。将多个play组织在一个playbook中,即可以让它们联同起来按事先编排的机制同唱一台大戏。
playbook基础组件
Hosts和Users
playbook中的每一个play的目的都是为了让某个或某些主机以某个指定的用户身份执行任务。hosts用于指定要执行指定任务的主机,其可以是一个或多个由冒号分隔主机组;remote_user则用于指定远程主机上的执行任务的用户。如上面示例中的
1
2
    -hosts: webnodes
   remote_user:root




不过,remote_user也可用于各task中。也可以通过指定其通过sudo的方式在远程主机上执行任务,其可用于play全局或某任务;此外,甚至可以在sudo时使用sudo_user指定sudo时切换的用户。
1
2
3
4
5
6
7
- hosts: webnodes
    remote_user: mageedu
    tasks:
    - name: test connection
      ping:
      remote_user: mageedu
      sudo: yes



任务列表和action
play的主体部分是task list。task list中的各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后再开始第二个。在运行自下而下某playbook时,如果中途发生错误,所有已执行任务都将回滚,因此,在更正playbook后重新执行一次即可。

task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致。

每个task都应该有其name,用于playbook的执行结果输出,建议其内容尽可能清晰地描述任务执行步骤。如果未提供name,则action的结果将用于输出。

定义task的可以使用“action:module options”或“module: options”的格式,推荐使用后者以实现向后兼容。如果action一行的内容过多,也中使用在行首使用几个空白字符进行换行。
tasks:
1
2
    - name: make sure apache is running
     service:name=httpd state=running



在众多模块中,只有command和shell模块仅需要给定一个列表而无需使用“key=value”格式,例如:
1
2
3
    tasks:
     -name: disable selinux
    command: /sbin/setenforce 0



如果命令或脚本的退出码不为零,可以使用如下方式替代:
1
2
3
  tasks:
   - name: run this command and ignore the result
     shell: /usr/bin/somecommand || /bin/true



或者使用ignore_errors来忽略错误信息:
1
2
3
4
tasks:
  - name: run this command and ignore the result
    shell: /usr/bin/somecommand
    ignore_errors: True



Inventoryansible的主要功用在于批量主机操作,为了便捷地使用其中的部分主机,可以在inventory file中将其分组命名。默认的inventory file为/etc/ansible/hosts。
inventory文件格式:inventory文件遵循INI文件风格,中括号中的字符为组名。可以将同一个主机同时归并到多个不同的组中;此外,当如若目标主机使用了非默认的SSH端口,还可以在主机名称之后使用冒号加端口号来标明。
1
2
3
4
5
6
7
8
9
10
    ntp.xmfb.com

    [webservers]
    www1.xmfb.com:2222
    www2.xmfb.com

    [dbservers]
    db1.xmfb.com
    db2.xmfb.com
    db3.xmfb.com



如果主机名称遵循相似的命名模式,还可以使用列表的方式标识各主机,例如:
1
2
3
4
5
[webservers]
www[01:50].example.com

[databases]
db-[a:f].example.com



组嵌套inventory中,组还可以包含其它的组,并且也可以向组中的主机指定变量。不过,这些变量只能在ansible-playbook中使用,而ansible不支持。例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[apache]
httpd1.xmfb.com
httpd2.xmfb.com

[nginx]
ngx1.xmfb.com
ngx2.xmfb.com

[webservers:children]
apache
nginx

[webservers:vars]
ntp_server=ntp.xmfb.com



Handlers示例:定义配置文件发生修改之后,在执行yml文件,会重启httpd服务。
定义的内容:
wKiom1WRX_GhJD5-AAGpBnWpKqY328.jpg
修改配置文件的监听端口为80
1
2
[iyunv@node1 ~]# vim conf/httpd.conf
Listen 80



执行结果

wKioL1WRYbPSqPgDAANa0KsyG3g315.jpg
验证:webserver组中的主机httpd端口更改与否
1
2
[iyunv@node2 ~]# netstat -lntp | grep httpd
tcp       0      0 :::80                       :::*                        LISTEN      41848/httpd



tagstags用于让用户选择运行或路过playbook中的部分代码。ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可以通过tags跳过此些代码片断。

示例:将修改配置文件部分定义为tags,一旦配置文件发生改变,可以跳过安装和启动服务,只执行复制配置文件和handlers
wKiom1WRYGOwAeqIAAGoLjcmjMo505.jpg
验证:使用tags执行conf,只是出现了conf这个任务的执行

wKioL1WRYiyheAaNAAIEKYg-Zzo664.jpg
Rolesansilbe自1.2版本引入的新特性,用于层次性、结构化地组织playbook。roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。简单来讲,roles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中,并可以便捷地include它们的一种机制。角色一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中。
创建role的步骤
(1)创建以roles命名的目录;
(2)在roles目录中分别创建以各角色名称命名的目录,如webservers等;
(3)在每个角色命名的目录中分别创建files、handlers、meta、tasks、templates和vars目录;用不到的目录可以创建为空目录,也可以不创建;
(4)在playbook文件中,调用各角色;
role内各目录中可用的文件
tasks目录:至少应该包含一个名为main.yml的文件,其定义了此角色的任务列表;此文件可以使用include包含其它的位于此目录中的task文件;
files目录:存放由copy或script等模块调用的文件;
templates目录:template模块会自动在此目录中寻找Jinja2模板文件;
handlers目录:此目录中应当包含一个main.yml文件,用于定义此角色用到的各handler;在handler中使用include包含的其它的handler文件也应该位于此目录中;
vars目录:应当包含一个main.yml文件,用于定义此角色用到的变量;
meta目录:应当包含一个main.yml文件,用于定义此角色的特殊设定及其依赖关系;ansible 1.3及其以后的版本才支持;
default目录:为当前角色设定默认变量时使用此目录;应当包含一个main.yml文件;
示例:定义一个简单的roles创建相关目录
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[iyunv@node1 ~]# mkdir -pvansible_playbooks/roles/{webserver,dbserver}/{tasks,files,templates,meta,handlers,vars}
[iyunv@node1 ~]# tree ansible_playbooks/
ansible_playbooks/
└── roles
    ├── dbserver
    │  ├── files
    │  ├── handlers
    │  ├── meta
    │  ├── tasks
    │  ├── templates
    │  └── vars
    └── webserver
        ├── files
        ├── handlers
        ├── meta
        ├── tasks
        ├── templates
        └── vars

15 directories, 0 files



Webserver创建配置文件
1
[iyunv@node1 ~]# cp /etc/httpd/conf/httpd.confansible_playbooks/roles/webserver/files/



在tasks目录下,定义yml,此处只需要定义执行的任务
wKiom1WRYRGRFP_dAAECRk_VgHA670.jpg
在handlers目录下,定义handlers

wKioL1WRYtPxvAkRAACCShULbqE755.jpg
在目录名同级目录,定义roles,只需要指明运行的主机和用户身份已经调用的角色即可
wKiom1WRYRKwaKTDAAByfKKkK8M729.jpg
执行结果
wKioL1WRYtSjXPzfAAM9cGD7c0U046.jpg
定义多个roles,实现重用效果示例:在4.101配置web服务,在4.102配置数据库,在4.103及配置web又配置数据库;

复制mysql配置文件
1
[iyunv@node1 ~]# cp /etc/my.cnfansible_playbooks/roles/dbserver/files/



定义tasks
wKiom1WRYZjTXcMuAAEqaW3dDLw195.jpg
定义handlers

wKioL1WRY1rwmnqtAACDd0J81Fw508.jpg
定义site.yml,在4.101配置web服务,在4.102配置数据库,在4.103及配置web又配置数据库。

wKiom1WRYZmTAUZuAADd4OeykHs993.jpg
执行结果:

wKiom1WRYZqixTkfAAalfEvqM-c355.jpg



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-81771-1-1.html 上篇帖子: ansible及ansible-palybook使用(持续更新) 下篇帖子: ansible及其常见模块
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

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