[转]自动化运维工具Ansible


简介:

ansible是新出现的运维工具是基于Python研发的糅合了众多老牌运维工具的优点实现了批量操作系统配置、批量程序的部署、批量运行命令等功能。ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。




自动化运维工具Ansible详细部署


==========================================================================================

一、基础介绍

==========================================================================================

1、简介

ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppetcfenginecheffuncfabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:

(1)、连接插件connection plugins:负责和被监控端实现通信;

(2)host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;

(3)、各种模块核心模块、command模块、自定义模块;

(4)、借助于插件完成记录日志邮件等功能;

(5)playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。


2、总体架构

wKiom1Rsxz3ToUCAAAGROYAM3EI989.jpg


3、特性

(1)no agents:不需要在被管控主机上安装任何客户端;

(2)no server:无服务器端,使用时直接运行命令即可;

(3)modules in any languages:基于模块工作,可使用任意语言开发模块;

(4)yamlnot code:使用yaml语言定制剧本playbook

(5)ssh by default:基于SSH工作;

(6)strong multi-tier solution:可实现多级指挥。


4、优点
(1)
、轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;
(2)
、批量任务执行可以写成脚本,而且不用分发到远程就可以执行;
(3)
、使用python编写,维护更简单,ruby语法过于复杂;
(4)
、支持sudo


5、任务执行流程

wKiom1Rsx2uQYJZ5AAJplY08vOQ976.jpg


说明:

(1)、以上内容大多是基于他人分享的基础上总结而来,学习借鉴之用;

(2)、本次安装基于 CentOS 6.4 系统环境。


==========================================================================================

二、Ansible基础安装与配置

==========================================================================================

1Ansible基础安装

(1)python2.7安装

https://www.python.org/ftp/python/2.7.8/Python-2.7.8.tgz

# tar xvzf Python-2.7.8.tgz

# cd Python-2.7.8

# ./configure --prefix=/usr/local

# make --jobs=`grep processor/proc/cpuinfo | wc -l`

# make install


## python头文件拷贝到标准目录,以避免编译ansible时,找不到所需的头文件

# cd /usr/local/include/python2.7

# cp -a ./* /usr/local/include/


## 备份旧版本的python,并符号链接新版本的python

# cd /usr/bin

# mv python python2.6

# ln -s /usr/local/bin/python


## 修改yum脚本,使其指向旧版本的python,已避免其无法运行

# vim /usr/bin/yum

#!/usr/bin/python  -->  #!/usr/bin/python2.6


(2)setuptools模块安装

https://pypi.python.org/packages/source/s/setuptools/setuptools-7.0.tar.gz

# tar xvzf setuptools-7.0.tar.gz

# cd setuptools-7.0

# python setup.py install


(3)pycrypto模块安装

https://pypi.python.org/packages/source/p/pycrypto/pycrypto-2.6.1.tar.gz

# tar xvzf pycrypto-2.6.1.tar.gz

# cd pycrypto-2.6.1

# python setup.py install


(4)PyYAML模块安装

http://pyyaml.org/download/libyaml/yaml-0.1.5.tar.gz

# tar xvzf yaml-0.1.5.tar.gz

# cd yaml-0.1.5

# ./configure --prefix=/usr/local

# make --jobs=`grep processor/proc/cpuinfo | wc -l`

# make install


https://pypi.python.org/packages/source/P/PyYAML/PyYAML-3.11.tar.gz

# tar xvzf PyYAML-3.11.tar.gz

# cd PyYAML-3.11

# python setup.py install


(5)Jinja2模块安装

https://pypi.python.org/packages/source/M/MarkupSafe/MarkupSafe-0.9.3.tar.gz

# tar xvzf MarkupSafe-0.9.3.tar.gz

# cd MarkupSafe-0.9.3

# python setup.py install


https://pypi.python.org/packages/source/J/Jinja2/Jinja2-2.7.3.tar.gz

# tar xvzf Jinja2-2.7.3.tar.gz

# cd Jinja2-2.7.3

# python setup.py install


(6)paramiko模块安装

https://pypi.python.org/packages/source/e/ecdsa/ecdsa-0.11.tar.gz

# tar xvzf ecdsa-0.11.tar.gz

# cd ecdsa-0.11

# python setup.py install


https://pypi.python.org/packages/source/p/paramiko/paramiko-1.15.1.tar.gz

# tar xvzf paramiko-1.15.1.tar.gz

# cd paramiko-1.15.1

# python setup.py install


(7)simplejson模块安装

https://pypi.python.org/packages/source/s/simplejson/simplejson-3.6.5.tar.gz

# tar xvzf simplejson-3.6.5.tar.gz

# cd simplejson-3.6.5

# python setup.py install


(8)ansible安装

https://github.com/ansible/ansible/archive/v1.7.2.tar.gz

# tar xvzf ansible-1.7.2.tar.gz

# cd ansible-1.7.2

# python setup.py install


2Ansible配置

(1)SSH免密钥登录设置

## 生成公钥/私钥

# ssh-keygen -t rsa -P ''

wKioL1RsyCTC94M0AACbRu5nOSQ166.jpg


## 写入信任文件(将/root/.ssh/id_rsa_storm1.pub分发到其他服务器,并在所有服务器上执行如下指令):

# cat /root/.ssh/id_rsa_storm1.pub >> /root/.ssh/authorized_keys

# chmod 600 /root/.ssh/authorized_keys


(2)ansible配置

# mkdir -p /etc/ansible

# vim /etc/ansible/ansible.cfg

……

remote_port = 36000

private_key_file = /root/.ssh/id_rsa_storm1

……


## 主机组定义

# vim /etc/ansible/hosts

[storm_cluster]

10.223.55.100

10.223.55.101

10.223.38.226

10.223.38.227

10.223.39.216

10.223.25.123


(3)、简单测试

# ansible storm_cluster -m command -a 'uptime'

wKiom1Rsx-bQ_7jKAADLJtl0-4A979.jpg

说明:第一次运行时,需要输入一下“yes”【进行公钥验证】,后续无需再次输入。


## 再次运行

# ansible storm_cluster -m command -a 'uptime'

wKioL1RsyHrwytdgAAHAHOcTZR8008.jpg


3、常用模块使用

(1)setup

## 用来查看远程主机的一些基本信息

# ansible storm_cluster -m setup

wKioL1RsyJyAptQMAAFxh3ywaEs209.jpg


(2)ping

## 用来测试远程主机的运行状态

# ansible storm_cluster -m ping

wKiom1RsyEPSQolOAAGGdiXrB3c688.jpg


(3)file

## 设置文件的属性

相关选项如下:

force:需要在两种情况下强制创建软链接,一种是源文件不存在,但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no

group:定义文件/目录的属组

mode:定义文件/目录的权限

owner:定义文件/目录的属主

path:必选项,定义文件/目录的路径

recurse:递归设置文件的属性,只对目录有效

src:被链接的源文件路径,只应用于state=link的情况

dest:被链接到的路径,只应用于state=link的情况

state

       directory:如果目录不存在,就创建目录

       file:即使文件不存在,也不会被创建

       link:创建软链接

       hard:创建硬链接

       touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间

       absent:删除目录、文件或者取消链接文件


示例:

## 远程文件符号链接创建

# ansible storm_cluster -m file -a "src=/etc/resolv.conf dest=/tmp/resolv.conf state=link"

wKioL1RsyNyyhjnQAAC-cHXrNCg654.jpg


## 远程文件信息查看

# ansible storm_cluster -m command -a "ls –al /tmp/resolv.conf"

wKiom1RsyH6j2C39AAFtr8zKvT4777.jpg


## 远程文件符号链接删除

# ansible storm_cluster -m file -a "path=/tmp/resolv.conf state=absent"

wKioL1RsyRLAj0RMAADL23Ztiio670.jpg


## 远程文件信息查看

# ansible storm_cluster -m command -a "ls -al /tmp/resolv.conf"

wKiom1RsyLXR7deZAAEhGk-nuao742.jpg

说明:如上显示,代表文件或链接已经删除。


(4)copy

## 复制文件到远程主机

相关选项如下:

backup:在覆盖之前,将源文件备份,备份文件包含时间信息。有两个选项:yes|no

content:用于替代“src”,可以直接设定指定文件的值

dest:必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录

directory_mode:递归设定目录的权限,默认为系统默认权限

force:如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,如果为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes

others:所有的file模块里的选项都可以在这里使用

src:被复制到远程主机的本地文件,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用“/”来结尾,则只复制目录里的内容,如果没有使用“/”来结尾,则包含目录在内的整个内容全部复制,类似于rsync


示例:

## 将本地文件“/etc/ansible/ansible.cfg”复制到远程服务器

# ansible storm_cluster -m copy -a "src=/etc/ansible/ansible.cfg dest=/tmp/ansible.cfg owner=root group=root mode=0644"

wKiom1RsyNaiKBOrAADvYmNkJhY434.jpg


## 远程文件信息查看

# ansible storm_cluster -m command -a "ls -al /tmp/ansible.cfg"

wKiom1RsyO_SkZtSAAE1LmxVNxk291.jpg


(5)command

## 在远程主机上执行命令

相关选项如下:

creates:一个文件名,当该文件存在,则该命令不执行

free_form:要执行的linux指令

chdir:在执行指令之前,先切换到该目录

removes:一个文件名,当该文件不存在,则该选项不执行

executable:切换shell来执行指令,该执行路径必须是一个绝对路径


示例:

# ansible storm_cluster -m command -a "uptime"

wKioL1RsyYOjbttbAAG9mMpCf1s600.jpg


(6)shell

## 切换到某个shell执行指定的指令,参数与command相同。

command不同的是,此模块可以支持命令管道,同时还有另一个模块也具备此功能:raw


示例:

## 先在本地创建一个SHELL脚本

# vim /tmp/rocketzhang_test.sh

#!/bin/sh

date +%F_%H:%M:%S


#chmod +x /tmp/rocketzhang_test.sh


## 将创建的脚本文件分发到远程

# ansible storm_cluster -m copy -a "src=/tmp/rocketzhang_test.sh dest=/tmp/rocketzhang_test.sh owner=root group=root mode=0755"


## 远程执行

# ansible storm_cluster -m shell -a "/tmp/rocketzhang_test.sh"

wKioL1RsyaPQliwdAAD4ONP1kro483.jpg


(7)、更多模块

其他常用模块,比如:servicecronyumsynchronize就不一一例举,可以结合自身的系统环境进行测试。

service:系统服务管理

cron:计划任务管理

yumyum软件包安装管理

synchronize:使用rsync同步文件

user:系统用户管理

group:系统用户组管理


更多模块可以参考:

#ansible-doc –l

wKiom1RsyU6z1a-EAAK0vQQ--mg925.jpg


http://docs.ansible.com/modules_by_category.html

http://www.ansible.cn/docs/

(国内的一个镜像站点,避免被墙 ^_^ )


(8)、一些概念补充

playbook的组成:playbook是由一个或多个“play”组成的列表,可以让它们联同起来按事先编排的机制执行;所谓task无非是调用ansible的一个module,而在模块参数中可以使用变量;模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致;


执行模型task list中的各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后再开始第二个。在顺序运行某playbook时,如果中途发生错误,所有已执行任务都将回滚,因此,在修改playbook后重新执行一次即可;


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


notify指定handler的执行机制:“notify”这个action可用于在每个play的最后被触发,在notify中列出的操作称为handler,仅在所有的变化发生完成后一次性地执行指定操作。


==========================================================================================

三、后续工作

==========================================================================================

1、深入学习ansibleplaybook以及扩展模块;

2、 结合业务环境,初步实现基础监控,以取代目前调用自动化部署平台API的方式;

3、 尝试自动化运维工具saltstack,并将其与ansible进行对比。


一些学习资料:

http://blog.xiaorui.cc/category/ansible/

http://lixcto.blog.51cto.com/4834175/d-4

https://github.com/ansible/ansible-examples

http://rfyiamcool.blog.51cto.com/1030776/d-51

http://dl528888.blog.51cto.com/2382721/d-4/p-1

http://edu.51cto.com/course/course_id-2220.html

http://edu.51cto.com/course/course_id-2032.html

http://www.shencan.net/index.php/category/%e8%87%aa%e5%8a%a8%e5%8c%96%e8%bf%90%e7%bb%b4/ansible/



文章来源:http://sofar.blog.51cto.com/353572/1579894






自动化运维工具之ansible


ansible是新出现的运维工具是基于Python研发的糅合了众多老牌运维工具的优点实现了批量操作系统配置、批量程序的部署、批量运行命令等功能。

当维护的机器很多时有时需要批量部署。



一、什么样的情形需要批量部署

1、操作系统的安装

常见的有collber,red hat satelite(redhat)系统专用。

2、操作系统的配置

常见的有cfengine,puppet,chef,func。其中puppet最受欢迎

3、批量程序的部署

4、批量命令的运行查看状态信息



二、ansible介绍

ansible的架构大致如下


1


ansible是新出现的运维工具是基于Python研发的糅合了众多老牌运维工具的优点实现了批量操作系统配置、批量程序的部署、批量运行命令等功能。


1
2
3
运维工具常见的工作模式
1、agent模式: 基于ssl实现。代理工作在被监控端。像puppet。
2、agentless模式: 基于 ssh 服务实现工作在被监控端。监控端是 ssh 的客户端。


ansible是工作在agentless模式下具有幂等性。ansible在控制端只需要告诉监控端的期望状态就可以实现批量部署。

1
2
3
名词解释
幂等性不会重复执行相同的指令。例如不会重复安装软件
期望状态只需要告诉被监控端的期望状态


ansible是基于模块工作的ansible本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块ansible只是提供一种框架。架构包括

  1. 连接插件connection plugins负责和被监控端实现通信。

  2. Host Inventory:指定操作的主机,是一个配置文件里面定义监控的主机

  3. 各种模块核心模块command模块自定义模块

  4. 借助于插件完成记录日志邮件等功能

  5. PlayBooks:剧本执行多个任务时。并非必需可以让节点一次性运行多个任务


三、ansible的基本使用


1
2
安装软件yum  install  ansible -y  # 对应的软件在 epel 仓库中也可自己手动编译
#源码地址 https://pypi.python.org/packages/source/a/ansible/ansible-1.5.tar.gz


2

1
2
3
4
5
6
7
8
9
10
11
12
2、定义Host Inventory
# vim /etc/ansible/hosts
[webhosts]
172.16.10.22 ansible_ssh_user=root ansible_ssh_pass=guoting
172.16.10.33 ansible_ssh_user=root ansible_ssh_pass=guoting
解释
#ansible_ssh_user=root 是ssh登陆用户
#ansible_ssh_pass=guoting 是ssh登陆密码3、测试各个模块
# 注意每个模块的用法可以使用 ansible-doc MOD 来查看例如ansible-doc copy
 
ansible命令最常用的用法
ansible <Host-partten> -m MOE -a  'MOD_ARV' 所支持的模块可以使用ansible-doc -l来查看

ansible示例

1、查看时间信息。command、shell模块

3


2、在控制端添加添加用户。user模块

4

3、实现ssh秘钥认证。shell、copy模块

6

此时就可以实现基于ssh秘钥通信了此时/etc/ansible/hosts可以修改如下

1
2
3
4
###### /etc/ansible/hosts
[webhosts]
172.16.10.22
172.16.10.33

7

4、安装软件和启动服务。yum、service模块

8

9

5、支持管道的命令。raw模块,类似于shell模块

wKioL1QaeV6QK9YUAACu77PB1cY454.jpg


四、YAML语言介绍

1、YAML简介

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
YAML是一个可读性高的用来表达资料序列的格式。YAML参考了其他多种语言包括XML、C语言、Python、Perl以及电子邮件格式RFC2822等。Clark Evans在2001年在首次发表了这种语言另外Ingy dtNet与Oren Ben-Kiki也是这语言的共同设计者。
YAML Ain't Markup Language即YAML不是XML。不过在开发的这种语言时YAML的意思其实是 "Yet Another Markup Language" 仍是一种标记语言。其特性
     YAML的可读性好
     YAML和脚本语言的交互性好
     YAML使用实现语言的数据类型
     YAML有一个一致的信息模型
     YAML易于实现
     YAML可以基于流来处理
     YAML表达能力强扩展性好
 
更多的内容及规范参见http: //www .yaml.org。
 
##########################YAML语法
 
YAML的语法和其他高阶语言类似并且可以简单表达清单、散列表、标量等数据结构。其结构Structure通过空格来展示序列Sequence里的项用 "-" 来代表
Map里的键值对用 ":" 分隔。YAML文件扩展名通常为.yaml或者.yml。下面是一个示例。
 
name: John Smith
age: 41gender: Male
spouse:
     name: Jane Smith
     age: 37
     gender: Female
children:
     -   name: Jimmy Smith
         age: 17
         gender: Male
     -   name: Jenny Smith
         age 13
         gender: Female
 
YAML 2 个重要的结构组成部分list和directory
################################# list
 
列表的所有元素均使用“-”打头例如
# A list of tasty fruits
- Apple
- Orange
- Strawberry
- Mango
 
##############################dictionary
 
字典通过key与valuef进行标识例如
---
# An employee record
name: Example Developer
job: Developer
skill: Elite
 
也可以将key:value放置于{}中进行表示例如
---
# An employee record
{name: Example Developer, job: Developer, skill: Elite}
 
多个映射关系组成一个字典一个列表可以包含多个字典。



2、ymal中的变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
################################## 变量命名
变量名仅能由字母、数字和下划线组成且只能以字母开头。
 
################################## facts
facts是由正在通信的远程目标主机发回的信息这些信息被保存在ansible变量中。要获取指定的远程主机所支持的所有facts可使用如下命令进行
# ansible hostname -m setup 这个命令可以获得被监控端主机的各种信息将这些信息得到后保存到变量中。
 
################################ 自定义变量
在 yaml 中可以使用vars关键字来定义变量
vars:
   var_name: value
 
############################# 变量的引用
{{ var_name }}
 
 
########################### 特殊的变量迭代
当有需要重复性执行的任务时可以使用迭代机制。其使用格式为将需要迭代的内容定义为item变量引用并通过with_items语句来指明迭代的元素列表即可。
 
#######################################示例
例如在被控端添加 2 个用户
 
方式1一般做法
- name: add user testuser1
   user: name=testuser1 state=present  groups =wheel
- name: add user testuser2
   user: name=testuser2 state=present  groups =wheel
 
方式2使用变量方式
- name: add several  users
   vars:
    user1: testuser1
    user2: testuser2
   user: name={{ user1 }} state=present  groups =wheel
   user: name={{ user2 }} state=present  groups =wheel
  
方式3使用迭代方式
- name: add several  users
   user: name={{ item }} state=present  groups =wheel
   with_items:     
     - testuser1     
     - testuser2
事实上with_items中可以使用元素还可为hashes例如
- name: add several  users
   user: name={{ item.name }} state=present  groups ={{ item. groups  }}
   with_items:
     - { name:  'testuser1' groups 'wheel'  }
     - { name:  'testuser2' groups 'root'  }



3、Inentory文件的格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
inventory文件遵循INI文件风格中括号中的字符为组名。可以将同一个主机同时归并到多个不同的组中此外当如若目标主机使用了非默认的SSH端口还可以在主机名称之后使用冒号加端口号来标明。
 
[webservers]
www1.magedu.com:2222
www2.magedu.com
[dbservers]
db1.magedu.com
db2.magedu.com
db3.magedu.com
 
如果主机名称遵循相似的命名模式还可以使用列表的方式标识各主机例如
[webservers]
www[01:50].example.com
[databases]
db-[a:f].example.com
 
#################### 主机变量
可以在inventory中定义主机时为其添加主机变量以便于在playbook中使用。例如
[webservers]
www1.magedu.com http_port=80 maxRequestsPerChild=808
www2.magedu.com http_port=303 maxRequestsPerChild=909
 
################### 组变量
组变量是指赋予给指定组内所有主机上的在playbook中可用的变量。例如
 
[webservers]
www1.magedu.com
www2.magedu.com
 
[webservers:vars]
ntp_server=ntp.magedu.com
nfs_server=nfs.magedu.com
 
################## 组嵌套
inventory中组还可以包含其它的组并且也可以向组中的主机指定变量。不过这些变量只能在ansible-playbook中使用而ansible不支持。例如
 
[apache]
httpd1.magedu.com
httpd2.magedu.com
 
[nginx]
ngx1.magedu.com
ngx2.magedu.com
 
[webservers:children]
apache
nginx
 
[webservers:vars]
ntp_server=ntp.magedu.com
 
######################### inventory参数
 
ansible基于 ssh 连接inventory中指定的远程主机时还可以通过参数指定其交互方式常用的参数如下所示
ansible_ssh_host   # 要连接的主机名
ansible_ssh_port   # 端口号默认是22
ansible_ssh_user   # ssh连接时默认使用的用户名
ansible_ssh_pass   # ssh连接时的密码
ansible_sudo_pass  # 使用sudo连接用户是的密码
ansible_ssh_private_key_file  # 秘钥文件如果不想使用ssh-agent管理时可以使用此选项
ansible_shell_type  # shell的类型默认sh
#########################################################################################
ansible的循环机制还有更多的高级功能具体请参见官方文档http: //docs .ansible.com /playbooks_loops .html。



4、playbooks

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
playbook是由一个或多个“play”组成的列表。play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色。
从根本上来讲所谓task无非是调用ansible的一个module。将多个play组织在一个playbook中即可以让它们联同起来按事先编排的机制同唱一台大戏。
 
###########################playbook基础组件
1、Hosts和Users
 
playbook中的每一个play的目的都是为了让某个或某些主机以某个指定的用户身份执行任务。
hosts用于指定要执行指定任务的主机其可以是一个或多个由冒号分隔主机组。
remote_user则用于指定远程主机上的执行任务的用户。
 
不过remote_user也可用于各task中。也可以通过指定其通过 sudo 的方式在远程主机上执行任务其可用于play全局或某任务。
此外甚至可以在 sudo 时使用sudo_user指定 sudo 时切换的用户。
 
- hosts: webnodes
   remote_user: mageedu
   tasks:
   - name:  test  connection    ping :
     remote_user: mageedu     sudo yes
 
2、任务列表和action
play的主体部分是task list。task list中的各任务按次序逐个在hosts中指定的所有主机上执行即在所有主机上完成第一个任务后再开始第二个。
在运行自下而下某playbook时如果中途发生错误所有已执行任务都将回滚因此在更正playbook后重新执行一次即可。
task的目的是使用指定的参数执行模块而在模块参数中可以使用变量。模块执行是幂等的这意味着多次执行是安全的因为其结果均一致。
每个task都应该有其name用于playbook的执行结果输出建议其内容尽可能清晰地描述任务执行步骤。如果未提供name则action的结果将用于输出。
 
定义task的可以使用“action: module options”或“module: options”的格式推荐使用后者以实现向后兼容。
如果action一行的内容过多也中使用在行首使用几个空白字符进行换行。
         
tasks:
- name:  make  sure apache is running
   service: name=httpd state=running
 
在众多模块中只有 command 和shell模块仅需要给定一个列表而无需使用“key=value”格式例如
tasks:
- name: disable selinux
   command /sbin/setenforce  0如果命令或脚本的退出码不为零可以使用如下方式替代
tasks:
- name: run this  command  and ignore the result
   shell:  /usr/bin/somecommand  ||  /bin/true        
或者使用ignore_errors来忽略错误信息
tasks:
- name: run this  command  and ignore the result
   shell:  /usr/bin/somecommand
   ignore_errors: True    
     
3、handlers
     
用于当关注的资源发生变化时采取一定的操作。
 
“notify”这个action可用于在每个play的最后被触发这样可以避免多次有改变发生时每次都执行指定的操作取而代之仅在所有的变化发生完成后一次性地执行指定操作。在notify中列出的操作称为handler也即notify中调用handler中定义的操作。
 
- name: template configuration  file
   template: src=template.j2 dest= /etc/foo .conf
   notify:
    - restart memcached
    - restart apache    
 
handler是task列表这些task与前述的task并没有本质上的不同。
 
handlers:
  - name: restart memcached
    service:  name=memcached state=restarted
- name: restart apache
    service: name=apache state=restarted



5、tags

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
tags用于让用户选择运行或路过playbook中的部分代码。ansible具有幂等性因此会自动跳过没有变化的部分即便如此有些代码为测试其确实没有发生变化的时间依然会非常地长。此时如果确信其没有变化就可以通过tags跳过此些代码片断。
 
示例基于playbooks实现web服务的部署
1、提供好Inventory文件
# /etc/ansible/hosts基于秘钥认证
[webhosts]
172.16.10.22
172.16.10.33
 
2、编辑 palybooks 剧本
# vim  /root/web.yaml
- name: web service
   remote_user: root
   hosts: webhosts
   vars:
     packages: httpd
   tasks:
     - name:  install  httpd      yum: name={{ packages }} state=present
       tags:  install
     - name: configuration httpd
       copy: src= /root/httpd .conf dest= /etc/httpd/conf/httpd .conf
       tags: conf
       notify:
         - restart httpd
     - name: service httpd start
       service: name=httpd enabled=no state=started
       tags: start
     - name: add centos and hadoop user
       user: name={{ item }} state=absent
       tags: adduser
       with_items:
         - centos
         - hadoop
   handlers:
         - name: restart httpd
           service: name=httpd state=restarted
 
3、准备好配置文件
  将web的配置放到指定目录 src= /root/httpd .conf
 
4、开始部署
ansible-playbooks  /root/web .yml


结果示例

11


查看端口

12


此时如果配置文件发生变化

13 


至此基本使用配置完成。


文章来源:http://guoting.blog.51cto.com/8886857/1553446







基于ansible Role实现批量部署lamp平台



一、ansible Role介绍

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# ansilbe自1.2版本引入的新特性,用于层次性、结构化地组织playbook。
# roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。
# 要使用roles只需要在playbook中使用include指令即可。
#简单来讲,roles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中,
# 并可以便捷地include它们的一种机制。
# 角色一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中。
 
 
############## 创建role的步骤
 
(1) 创建以roles命名的目录;
(2) 在roles目录中分别创建以各角色名称命名的目录,如webservers等。注意:在 roles 
     必须包括 site.yml文件,可以为空;
(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文件。


二、基于Role实现 lamp 平台的批量部署

实验环境:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
控制端:
172.16.10.9 server.magedu.com
 
被控制端:
172.16.10.22 node2.example.com
172.16.10.33 node3.example.com
172.16.0.50 director1.example.com
172.16.0.51 director2.example.com
 
计划:
172.16.10.22 node2.example.com
172.16.10.33 node3.example.com
# 安装 web php程序,并提供配置文件
172.16.0.50 director1.example.com
172.16.0.51 director2.example.com
# 安装 mysql mysql-server,并提供配置文件
 
要求:基于主机名通信(被控制端都可以解析到其他的主机名)

配置步骤:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
1、配置好 Inventory 文件
# /etc/ansible/hosts
[webhosts]
node2.example.com
node3.example.com
 
[mysql]
director1.example.com
director2.example.com
 
2、创建对应的目录树
# 执行 tree /root/lamp/roles 查看目录树
/root/lamp/roles
|-- common
|   |-- default
|   |-- files
|   |   `-- hosts
|   |-- handlers
|   |-- meta
|   |-- tasks
|   |   `-- main.yml
|   |-- templates
|   `-- vars
|-- db
|   |-- default
|   |-- files
|   |   `-- my.cnf
|   |-- handlers
|   |   `-- main.yml
|   |-- meta
|   |-- tasks
|   |   `-- main.yml
|   |-- templates
|   `-- vars
|-- db.yml
|-- php
|   |-- default
|   |-- files
|   |   `-- php.ini
|   |-- handlers
|   |-- meta
|   |-- tasks
|   |   `-- main.yml
|   |-- templates
|   `-- vars
|-- site.yml
|-- web
|   |-- default
|   |-- files
|   |   `-- httpd.conf
|   |-- handlers
|   |   `-- main.yml
|   |-- meta
|   |-- tasks
|   |   `-- main.yml
|   |-- templates
|   `-- vars
`-- web.yml
 
 
 
3、各个文件的内容
# 当前所在目录 /root/lamp/roles
# cat db.yml
- name: mysqld servise
   remote_user: root
   hosts: mysql
   roles:  
     - common 
     - db
 
# cat web.yml
- name: wed servise
   remote_user: root
   hosts: webhosts
   roles: 
     - common 
     - php  
     - web
     
# cat common/files/hosts 
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.10.22 node2.example.com
172.16.10.33 node3.example.com
172.16.0.50 director1.example.com
172.16.0.51 director2.example.com
 
# cat common/tasks/main.yml
- name: Configure  hostname  resolve
   copy: src=hosts dest= /etc/hosts
 
# cat php/tasks/main.yml
- name:  install  php  
   yum: name=php state=present
- name: configuration php
   copy: src=php.ini dest= /etc/php .ini
 
# cat web/tasks/main.yml
- name:  install  httpd  
   yum: name=httpd state=present
- name: configuration httpd
   copy: src=httpd.conf dest= /etc/httpd/conf/httpd .conf
   notify:
     - restart httpd
- name: service httpd start
   service: name=httpd enabled=no state=started
 
# cat web/handlers/main.yml
- name: restart httpd
   service: name=httpd state=restarted
 
# cat db/tasks/main.yml
- name:  install  mysql
   yum: name=mysql state=present
- name:  install  mysql-server
   yum: name=mysql-server state=present
- name: configuration mysqld
   copy: src=my.cnf dest= /etc/my .cnf
   notify:
     - restart mysqld
- name: service mysqld start
   service: name=mysqld enabled=no state=started
 
# cat db/handlers/main.yml
- name: restart mysqld
   service: name=mysqld state=restarted
   
4、开始批量部署
ansible-playbooks web.yml
ansible-playbooks db.yml


结果示例:

14

15

16

 

至此,批量部署lamp平台就完成了。以上只是一个示例,具体情况,还需具体对待。



文章来源:http://guoting.blog.51cto.com/8886857/1553451



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值