自动化运维-ansible------playbook及实战案例
Posted wft9
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自动化运维-ansible------playbook及实战案例相关的知识,希望对你有一定的参考价值。
四、playbook
1.简介
l playbook 是 ansible 用于配置,部署,和管理被控节点的剧本。
l 通过 playbook 的详细描述,执行其中的一系列 tasks ,可以让远端主机达到预期的状态。playbook 就像 Ansible 控制器给被控节点列出的的一系列 to-do-list ,而被控节点必须要完成。
l 也可以这么理解,playbook 字面意思,即剧本,现实中由演员按照剧本表演,在Ansible中,这次由计算机进行表演,由计算机安装,部署应用,提供对外服务,以及组织计算机处理各种各样的事情。
l playbook由YMAL语言编写
2.格式
l 文件的第一行应该以 "---" (三个连字符)开始,表明YMAL文件的开始
l 在同一行中,#之后的内容表示注释,类似于shell,python和ruby
l YMAL中的列表元素以"---"开头然后紧跟着一个空格,后面为元素内容
l 同一个列表中的元素应该保持相同的缩进。否则会被当做错误处理
l play中hosts,variables,roles,tasks等对象的表示方法都是键值中间以":"分隔表示,":"后面还要增加一个空格
l 文件名称以yml结尾
l 一般输出信息:
绿色代表执行成功,系统保持原样
黄色代表系统代表系统状态发生改变
红色代表执行失败,显示错误输出
l 格式:tasks:
- name: TASK_NAME
module: arguments
notify: HANDLER_NAME
handlers:
- name: HANDLER_NAME
module: arguments
3.核心元素
l hosts:主机组
l users:远程主机上,运行此任务的身份,不指名默认为root
l tasks:任务列表
l Variables:变量,设置方式有4种
l Templates:模板,包含了模块语法的文本文件
l Handlers:处理器,有特定条件触发的任务
4.基本组件
l Hosts:运行指定任务的目标主机,多个主机用:冒号分隔
l remoute_user:在远程主机上执行任务的用户;可以全局指定,也可以单个任务指定
l sudo_user:表示以sudo方式运行任务时,切换为哪个用户身份运行
l tasks:任务列表
5.变量
通过vars关键字自定义变量,使用时用{{}}引用。当变量比较多时或者要在多个playbook中重用的时候,可以把变量放在一个单独的文件中,通过关键字vars-files把文件中定义的变量引用playbook中,如果以{开头必须加上引号
l facts变量:
ansible会通过module setup来收集主机的系统信息,这些收集到的系统信息叫做facts,这些facts信息可以直接以变量的形式使用。
复杂facts变量的使用包括中括号和点号两种:
中括号:{{ ansible_eno16777736["ipv4"]["address"] }
点号:{{ ansible_eno16777736.ipv4.address }}
关闭facrs:
- hosts: whatever
gather_facts: no
l template变量:
在playbook中定义的变量和facts变量可以直接在template中使用,inventory里面定义的host和group变量也可以直接使用,只要在playbook中可以访问的变量,都可以在template文件中使用
6.逻辑语句
1.when语句:
相当于if判断语句,只有满足when后面的判断才能执行某个特定的步骤
2.loop循环语句:
类似于while循环语句,如果同时使用 when 和 with_items (或其它循环声明),when声明会为每个条目单独执行
例:
- name: add several users
user: name={{ item }} state=present groups=wheel
with_items:
- testuser1
- testuser2
3.block块语句:
把几个tasks组成一块代码,便于针对一组操作的异常处理等操作
五、playbook实战-安装nginx
1.环境准备
先在ansible主机上编译安装nginx并打包为nginx.tar.gz:
进入ansible配置文件目录,创建nginx_install目录:
将打包的nginx.tar.gz移动到files目录下。将启动脚本、配置文件放在templates目录下:
安装nginx的一些依赖包,定义common的tasks:
2.配置文件
定义变量:
将用到的文件拷贝到目标主机:
建立用户,启动nginx服务,删除压缩包:
创建调用文件,使其能够调用copy.yml和install.yml:
定义总入口配置文件:
3.测试
执行总入口文件:
[root@ansible1 nginx_install]# ansible-playbook /etc/ansible/nginx_install/install.yml
六、管理nginx配置文件
1.创建管理目录
new为更新时用到的目录,old为回滚时的目录,files目录下为更新文件存放目录,handlers为重启nginx服务命令
[root@ansible1 ansible]# mkdir -p nginx_config/roles/{new,old}/{files,handlers,vars,tasks}
2.拷贝配置文件
[root@ansible1 ansible]# cd /usr/local/nginx/conf/
[root@ansible1 conf]# cp -r nginx.conf vhost /etc/ansible/nginx_config/roles/new/files/
可能不存在vhost,我现在创建一个目录,并创建一个文件
[root@ansible1 conf]# mkdir vhost
[root@ansible1 conf]# vi deault.conf
Fjaoeiwgfmoa
3.定义变量
[root@ansible1 ~]# cd /etc/ansible/nginx_config/
[root@ansible1 nginx_config]# vi roles/new/vars/main.yml
nginx_basedir: /usr/local/nginx
4.定义重新加载nginx服务
[root@ansible1 nginx_config]# vi roles/new/handlers/main.yml
- name: restart nginx
shell: /etc/init.d/nginx reload //重新加载服务
5.创建更新配置文件
[root@ansible1 nginx_config]# vi roles/new/tasks/main.yml
- name: copy conf file
copy: src={{ item.src }} dest={{ nginx_basedir }}/{{ item.dest }} backup=yes owner=root group=root mode=0644
with_items:
- { src: nginx.conf,dest: conf/nginx.conf }
- { src: vhost, dest: conf/ }
notify: restart nginx
6.定义入口配置文件
[root@ansible1 nginx_config]# vi update.yml
---
- hosts: testhost
user: root
roles:
- new
7.同步文件
把new复制到old中,以保证回滚操作正常执行
[root@ansible1 nginx_config]# rsync -av /etc/ansible/nginx_config/roles/new/ /etc/ansible/nginx_config/roles/old/
当rsync不存在时安装该命令
-bash: rsync: 未找到命令
[root@ansible1 nginx_config]# yum install -y rsync
8.执行与回滚
执行playbook:
[root@ansible1 nginx_config]# ansible-playbook update.yml
PLAY [testhost] ****************************************************************
TASK [Gathering Facts] *********************************************************
ok: [172.16.51.51]
ok: [172.16.51.52]
TASK [new : copy conf file] ****************************************************
ok: [172.16.51.52] => (item={u‘dest‘: u‘conf/nginx.conf‘, u‘src‘: u‘nginx.conf‘})
ok: [172.16.51.51] => (item={u‘dest‘: u‘conf/nginx.conf‘, u‘src‘: u‘nginx.conf‘})
ok: [172.16.51.51] => (item={u‘dest‘: u‘conf/‘, u‘src‘: u‘vhost‘})
ok: [172.16.51.52] => (item={u‘dest‘: u‘conf/‘, u‘src‘: u‘vhost‘})
PLAY RECAP *********************************************************************
172.16.51.51 : ok=2 changed=0 unreachable=0 failed=0
172.16.51.52 : ok=2 changed=0 unreachable=0 failed=0
创建回滚配置文件,回滚操作就是把旧的配置覆盖,然后重新加载nginx服务:
[root@ansible1 nginx_config]# vi rollback.yml
---
- hosts: testhost
user: root
roles:
- old
当更新的配置文件有问题时,执行回滚操作:
[root@ansible1 nginx_config]# ansible-playbook rollback.yml
PLAY [testhost] ****************************************************************
TASK [Gathering Facts] *********************************************************
ok: [172.16.51.51]
ok: [172.16.51.52]
TASK [old : copy conf file] ****************************************************
ok: [172.16.51.52] => (item={u‘dest‘: u‘conf/nginx.conf‘, u‘src‘: u‘nginx.conf‘})
ok: [172.16.51.51] => (item={u‘dest‘: u‘conf/nginx.conf‘, u‘src‘: u‘nginx.conf‘})
ok: [172.16.51.52] => (item={u‘dest‘: u‘conf/‘, u‘src‘: u‘vhost‘})
ok: [172.16.51.51] => (item={u‘dest‘: u‘conf/‘, u‘src‘: u‘vhost‘})
PLAY RECAP *********************************************************************
172.16.51.51 : ok=2 changed=0 unreachable=0 failed=0
172.16.51.52 : ok=2 changed=0 unreachable=0 failed=0
以上是关于自动化运维-ansible------playbook及实战案例的主要内容,如果未能解决你的问题,请参考以下文章