ansible使用playbook自动化运维

上一期我们说到基本使用ansible,也讲到了命令的使用方法,但是遗留了一个问题那就是如果需要自动化安装wordpress并且直接使用类似脚本一样的方法点击执行就能自动安装那该有多好?不过放心这个功能是肯定有的!ansible有一个组件叫做playbook,不过要了解playbook首先得看看YAML!

什么是YAML?

YAML是一个可读性高的用来表达资料序列的格式。YAML参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822等。Clark Evans在2001年在首次发表了这种语言,另外Ingy döt Net与Oren Ben-Kiki也是这语言的共同设计者。YAML Ain’t Markup Language,即YAML不是XML。不过,在开发的这种语言时,YAML的意思其实是:”Yet Another Markup Language”(仍是一种标记语言)。

YAML的特性有哪些?
  1. YAML的可读性好
  2. YAML和脚本语言的交互性好
  3. YAML使用实现语言的数据类型
  4. YAML有一个一致的信息模型
  5. YAML易于实现
  6. YAML可以基于流来处理
  7. YAML表达能力强,扩展性好

说完了YAML然后就应该说说ansible的playbook了,由于playbook中使用的格式就是YAML所以上面必须拿出来单独的说说!

什么是playbook?

playbook是由一个或多个“play”组成的列表。play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上来讲,所谓task无非是调用ansible的一个module。将多个play组织在一个playbook中,即可以让它们联同起来按事先编排的机制将所有定义的内容全部执行而不用麻烦的手动执行命令。

playbook的核心组成部分:
  1. Tasks:任务,完成操作;既调用模块完成的某操作
  2. Variables:变量
  3. Templates:模板;根据系统情况生成某些文件
  4. Handlers::处理器,重载服务;由某事件触发执行的操作
  5. Roles:角色定义
使用playbook自动化安装和卸载nginx:

拓扑还是在上一期的拓扑,只不过首先我们得卸载httpd以及相关的组合,将其全部清空随后安装nginx。不过这次卸载我不再使用麻烦的命令卸载方式,而是使用playbook来进行大清扫。

[root@localhost ~] vim uninstall_LAMP.yml #首先创建一个YAML文件。
- hosts: webserver #指定执行任务的主机
 remote_user: root #指定执行任务使用的用户
 tasks: #这个主机执行的任务列表
 - name: uninstall LAMP #定义任务名称,可以随意
 yum: name={{ item }} state=absent 
#定义任务,就和上一期一样写好模块和模块命令即可
 with_items: #这里定义迭代
 - httpd
 - apr
 - apr-util
 - mysql-server
 - mysql
 - php
 - php-mysql
#迭代:当有需要重复性执行的任务时,可以使用迭代机制。
#其使用格式为将需要迭代的内容定义为item变量引用,
#并通过with_items语句来指明迭代的元素列表即可。

这样就算定义完毕playbook了但是还没有执行任务呢,这里使用一个命令就可以执行playbook的内容了。

[root@localhost ~] ansible-playbook uninstall_LAMP.yml
#其实就这么简单即可完成
PLAY [webserver] ***************************************************************

TASK [setup] *******************************************************************
ok: [172.16.1.11]
ok: [172.16.1.12]

TASK [uninstall LAMP] **********************************************************
changed: [172.16.1.11] => (item=[u'httpd', u'apr', u'apr-util', u'mysql-server', u'mysql', u'php', u'php-mysql'])
changed: [172.16.1.12] => (item=[u'httpd', u'apr', u'apr-util', u'mysql-server', u'mysql', u'php', u'php-mysql'])

PLAY RECAP *********************************************************************
172.16.1.11 : ok=2 changed=1 unreachable=0 failed=0
172.16.1.12 : ok=2 changed=1 unreachable=0 failed=0
#上述则是输出信息!
关于执行playbook使用的命令:

ansible-playbook <filename.yml>… [OPTIONS]

[OPTIONS]

–extra-vars “<变量定义>” #用于定义变量给予playbook来运行

–tags=”TAGS” #指定带tags的来运行,其中all代表全部都进行运行。

其中filename.yml为自己写的playbook文件必须给出!

使用playbook来自动安装wrodpress:

其实使用playbook其实也比较简单,与命令类似但是好处是写好一次可以多次执行对以后生产运维帮助很大。这次博客将上一期的内容使用playbook形式展开给大家看!

[root@localhost ~] vim install-wordpress.yml #首先创建一个YML的文件
- hosts: webserver
  remote_user: root
  tasks:
 - name: install LAMP#安装LAMP
   yum: name={{ item }} state=present
     with_items:
       - httpd
       - mysql-server
       - php
       - php-mysql
 - name: copy config file for httpd#拷贝配置文件
   copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf
 - name: copy wordpress for webserver#拷贝worodpress压缩包
   copy: src=/root/wordpress-4.5.3-zh_CN.tar.gz dest=/root/wordpress-4.5.3-zh_CN.tar.gz
 - name: tar -xf for wordpress#给wordpress解压缩
   command: tar -xf /root/wordpress-4.5.3-zh_CN.tar.gz -C /var/www/
 - name: cp wp-config#拷贝wordpress的配置文件
   copy: src=/root/wp-config.php dest=/var/www/wordpress/
 - name: start mysqld#启动mysql服务
   service: name=mysqld state=started
 - name: create database for wordpress#创建wordpress数据库
   shell: mysql -e &quot;CREATE DATABASE wordpress;&quot;
 - name: start httpd#启动httpd进程
   service: name=httpd state=started

上面就是整个的playbook指令了,接下来我们就要执行playbook:

[root@localhost ~] ansible-playbook install-wordpress.yml

PLAY [webserver] ***************************************************************

TASK [setup] *******************************************************************
ok: [172.16.1.11]
ok: [172.16.1.12]

TASK [install LAMP] ************************************************************
changed: [172.16.1.11] =&gt; (item=[u'httpd', u'mysql-server', u'php', u'php-mysql'])
changed: [172.16.1.12] =&gt; (item=[u'httpd', u'mysql-server', u'php', u'php-mysql'])

TASK [copy config file for httpd] **********************************************
changed: [172.16.1.11]
changed: [172.16.1.12]

TASK [copy wordpress for webserver] ********************************************
changed: [172.16.1.12]
changed: [172.16.1.11]

TASK [tar -xf for wordpress] ***************************************************
changed: [172.16.1.11]
 [WARNING]: Consider using unarchive module rather than running tar

changed: [172.16.1.12]

TASK [cp wp-config] ************************************************************
changed: [172.16.1.12]
changed: [172.16.1.11]

TASK [start mysqld] ************************************************************
changed: [172.16.1.11]
changed: [172.16.1.12]

TASK [create database for wordpress] *******************************************
fatal: [172.16.1.11]: FAILED! =&gt; {&quot;changed&quot;: true, &quot;cmd&quot;: &quot;mysql -e \&quot;CREATE DATABASE wordpress;\&quot;&quot;, 
&quot;delta&quot;: &quot;0:00:00.009614&quot;, &quot;end&quot;: &quot;2017-01-05 09:30:17.205994&quot;, &quot;failed&quot;: true, &quot;rc&quot;: 1, &quot;start&quot;: &quot;20
17-01-05 09:30:17.196380&quot;, &quot;stderr&quot;: &quot;ERROR 1007 (HY000) at line 1: Can't create database 'wordpress'; 
database exists&quot;, &quot;stdout&quot;: &quot;&quot;, &quot;stdout_lines&quot;: [], &quot;warnings&quot;: []}
fatal: [172.16.1.12]: FAILED! =&gt; {&quot;changed&quot;: true, &quot;cmd&quot;: &quot;mysql -e \&quot;CREATE DATABASE wordpress;\&quot;&quot;, 
&quot;delta&quot;: &quot;0:00:00.008689&quot;, &quot;end&quot;: &quot;2017-01-05 09:30:09.738317&quot;, &quot;failed&quot;: true, &quot;rc&quot;: 1, &quot;start&quot;: &quot;20
17-01-05 09:30:09.729628&quot;, &quot;stderr&quot;: &quot;ERROR 1007 (HY000) at line 1: Can't create database 'wordpress'; 
database exists&quot;, &quot;stdout&quot;: &quot;&quot;, &quot;stdout_lines&quot;: [], &quot;warnings&quot;: []}
 to retry, use: --limit @/root/install-wordpress.retry

PLAY RECAP *********************************************************************
172.16.1.11 : ok=7 changed=6 unreachable=0 failed=1
172.16.1.12 : ok=7 changed=6 unreachable=0 failed=1

上面看来在创建mysql数据库的时候出错了,后来想到是不是卸载mysqld的时候并没有将数据库全部删除,带着疑问我登陆webserver其中一台机器看看mysql情况:

[root@localhost ~] ssh 172.16.1.11
mast login: Thu Jan 5 14:32:02 2017 from 172.16.1.10
[root@localhost ~] mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.1.73 Source distribution

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql&gt; SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| test |
| wordpress |
+--------------------+
4 rows in set (0.01 sec)

看来确实已经有了wordpress这个数据库了,随后我们只需要启动httpd进程就行,所以还是提醒大家在配置好ansible所有ssh密钥之后能有个快照,这样需要重新实验就能使用快照了!不过在启动之前最好使用ss -tnl看看80端口是否监听是不是httpd进程启动了?随后启动httpd之后看看网页是否能够登陆:

看上去全部能够正常登陆了?那么ansible的简单功能就算介绍完毕了,其实ansible在生产环境还是配合脚本使用比较合适,比如编译安装等情况!

Comments

Leave a Reply

Your email address will not be published. Name and email are required