自动化运维-ansible------playbook及实战案例

Posted wft9

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自动化运维-ansible------playbook及实战案例相关的知识,希望对你有一定的参考价值。

四、playbook

1.简介

l playbook ansible 用于配置,部署,和管理被控节点的剧本。

通过 playbook 的详细描述,执行其中的一系列 tasks ,可以让远端主机达到预期的状态。playbook 就像 Ansible 控制器给被控节点列出的的一系列 to-do-list ,而被控节点必须要完成。

也可以这么理解,playbook 字面意思,即剧本,现实中由演员按照剧本表演,在Ansible中,这次由计算机进行表演,由计算机安装,部署应用,提供对外服务,以及组织计算机处理各种各样的事情。

l playbookYMAL语言编写

2.格式

文件的第一行应该以 "---" (三个连字符)开始,表明YMAL文件的开始

在同一行中,#之后的内容表示注释,类似于shellpythonruby

l YMAL中的列表元素以"---"开头然后紧跟着一个空格,后面为元素内容

l 同一个列表中的元素应该保持相同的缩进。否则会被当做错误处理

l playhostsvariablesrolestasks等对象的表示方法都是键值中间以":"分隔表示,":"后面还要增加一个空格

文件名称以yml结尾

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里面定义的hostgroup变量也可以直接使用,只要在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的一些依赖包,定义commontasks

 

 

2.配置文件

定义变量:

 

将用到的文件拷贝到目标主机:

 

建立用户,启动nginx服务,删除压缩包:

 

创建调用文件,使其能够调用copy.ymlinstall.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及实战案例的主要内容,如果未能解决你的问题,请参考以下文章

北京联通自动化运维提升私有云运维效率

CMDB和运维自动化

游戏运维的最佳实践:搜狐畅游自动化运维之旅!

自动化运维界的苹果之ITGo自动化运维管理平台

1.1-自动化运维介绍

运维自动化发展的4个阶段