标签归档:Ansible

自动化运维工具Ansible使用(三)

ad-hoc模式基本使用

ansible在使用ad-hoc模式执行命令时,相当于使用SSH连接各个服务器并在服务器上执行命令。格式为:

ansible <host-pattern> [options]

一个典型的ansible ad-hoc命令格式为:

ansible <host> -m module -a 'command' -f forks
# eg
ansible group-a -a 'date'
ansible all -m service -a 'name=mysql state=restarted'

上面给出了两个例子,第一个例子为在group-a组中所有服务器上执行date命令;第二个例子为在所有服务器上执行service mysql restart命令。

第一个例子只是简单的执行命令,这里不多介绍。而在第二个例子中,我们使用了ansible自带的service模式,这个模式中提供了restart选项,这样我们就可以直接使用这个命令来重启服务。

ansible自带的模式有很多,可以通过以下命令查看当前ansible支持的模块:

ansible-doc -l

逻辑运算

ansible对host的控制支持逻辑运算,举例如下:

目的:在group-a和group-b上执行date命令

ansible group-a:group-b -a 'date'

目的:在group-a和group-b上排除site-1执行date命令

ansible 'group-a:group-b:!site-1' -a 'date'

常用模块

下面用一些实例介绍比较常用的几个模块:

copy模块:

目的:把主控端/root目录下的a.sh文件拷贝到到指定节点上

ansible 111.111.111.111 -m copy -a 'src=/root/a.sh dest=/tmp/'

file模块:

目的:更改指定节点上/tmp/t.sh的权限为755,属主和属组为root

ansible all -m file -a "dest=/tmp/t.sh mode=755 owner=root group=root"

cron模块:

目的:在指定节点上定义一个计划任务,每隔3分钟到主控端更新一次时间

ansible all -m cron -a 'name="custom job" minute=*/3 hour=* day=* month=* weekday=* job="/usr/sbin/ntpdate 122.122.122.122"'

service模块:

目的:重启指定节点上的 mysql 服务

ansible all -m service -a 'name=mysql state=restarted'

script模块:

目的:在指定节点上执行/root/a.sh脚本(请注意,这个脚本存放在Server端而不是Client端)

ansible site-1 -m script -a '/root/a.sh'

ping模块:

目的:检查指定组机器是否还能连通

ansible group-a -m ping

command模块:

目的:在指定组服务器上运行git pull命令

ansible group-all -m command -a 'git pull origin master chdir=/srv/www/{{ domain }}'

get_url模块:

目的:在制定服务器上执行wget操作

ansible site-3 -m get_url -a 'url=http://www.google.com/favicon.ico dest=/tmp'

synchronize模块:

目的:同步Server和Client内容。将Server的/root/a目录推送到指定节点的/tmp目录下

ansible site-5 -m synchronize -a 'src=/root/a dest=/tmp/ compress=yes'

这里有几个参数可以使用:

mode=pull 更改推送模式为拉取模式
delete=yes 使两边的内容一样(即以推送方为主)
compress=yes 开启压缩,默认为开启
--exclude=.git 忽略同步.git结尾的文件

拉取

 目的:将site-3节点的/tmp/a目录拉取到主控节点的/root目录下
 命令:ansible site-3 -m synchronize -a 'mode=pull src=/tmp/a dest=/root/'

 查看进程:

目的:查看远程主机的httpd进程

ansible storm_cluster -m shell -a "ps -ef | grep httpd"
ansible storm_cluster -m raw -a "pa -ef | grep httpd"

以上就是一些常用的模式的使用,其他的模块和具体的说明信息见这里:Ansible Documentation – All Modules

参考:Ansible – exclude host from playbook execution

自动化运维工具Ansible使用(二)

Inventory配置

Inventory指的是Client服务器的信息。默认放在/etc/ansible/hosts文件中(如果不存在就创建一个)。这个文件存储了服务器的相关信息,使用类ini格式进行排版。可以进行分组,变量赋予等操作。下面给出典型的hosts文件进行说明:

# /etc/ansible/hosts

site-1 ansible_ssh_host=111.111.111.111 domain=zivers-1.com db=db-001
site-2 ansible_ssh_host=122.122.122.122 domain=zivers-2.com db=db-002
site-3 ansible_ssh_host=133.133.133.133 domain=zivers-3.com db=db-003
site-4 ansible_ssh_host=144.144.144.144 domain=zivers-4.com db=db-004
site-5 ansible_ssh_host=155.155.155.155 domain=zivers-5.com db=db-005

[group-all:children]
group-c
site-5

[group-a]
site-1
site-2

[group-b]
site-3
site-4

[group-c:children]
group-a
group-b

[group-b:vars]
zivers=false

在这个文件中,我们对Client服务器的信息进行了定义。

首先定义了5台Client服务器,并给予他们一些变量值。这五台服务器名分别为site-1,site-2,site-3,site-4,site-5,在执行ansible命令时就可以使用这个名字来直接执行,例如:

ansible site-1 -a 'date'

site-1后面就是有关这台服务器的一些变量配置,第一个是ansible自带的变量字段ansible_ssh_host,定义了服务器的IP地址。之后的两个变量domain和db是自定义的变量,这些变量可以在ansible执行的过程中很方便的使用。

比如,我的Client的服务器上,网站的文件被放在了网站域名对应的目录下:/var/www/site-1.com/。我现在需要查看这个目录下的内容,这样每个网站的命令并不相同,而我却需要批量执行:

ls /var/www/site-1.com/httpdocs
ls /var/www/site-2.com/httpdocs
ls /var/www/site-3.com/httpdocs
ls /var/www/site-4.com/httpdocs
ls /var/www/site-5.com/httpdocs

这时,我就可以使用刚才定义的变量来解决这个问题:

ansible group-all -a 'ls /var/www/{{ domain }}/httpdocs

这里我就使用了{{ domain }}这个变量来代替这些内容。

注意到,上面我的命令使用了group-all做为hosts。group-all是在hosts文件中定义的一个组。

Inventory中,组的定义和一般的ini文件相同,使用[ ]作为标识。组的内容可以是服务器也可以是其他组(也就是说,组与组之间可以嵌套),如果是嵌套,则需要加上”:children”进行说明。

最后,可以使用”:var”为组成员添加额外的属性。例如最后的:

[group-b:vars]
zivers=false

就为group-b中的所有成员添加了一个属性zivers,在命令中就可以使用这个属性了。调用方法依然是{{ zivers }}。

自动化运维工具Ansible使用(一)

简介

Ansible是一个使用Python语言的自动化运维工具。集合了众多运维工具,例如fabric, saltstack等的优点,实现了批量操作系统配置、批量程序的部署、批量运行命令等功能。

Ansible可以以两种方式运行:ad-hoc,playbooks。

  • ad-hoc(命令)模式和fabric非常类似,批量远程执行SSH命令。一些简单的命令可以用这个方式进行分发。例如:
ansible all -a 'date'

这条命令将在所有配置了的服务器上执行date命令并返回命令的返回值。

ad-hoc命令的典型格式是:

ansible hosts -m module -a 'command'
  • playbooks(剧本)模式则可以执行复杂的工作。将需要的任务用yaml格式写在文件中,然后执行。例如:
# test.yml
---
- hosts: 123.123.123.123
  remote_user: root
  tasks:
    - name: test connection
      ping:
      remote_user: root

然后执行:

ansible-playbook test.yml -f 10

即在所有服务器上执行ping这个操作。(“-f 10”表示并发10)

请注意,Ansible的命令分发基于SSH链接,所以虽然是C/S架构,但并不需要安装客户端。另外Ansible的分发可以并行执行。

安装

在Ubuntu上可以使用两种方式安装:

  • pip(不建议安装在virtualenv虚拟环境中):
sudo pip install ansible
  • apt
sudo apt-get install software-properties-common
sudo apt-add-repository ppa:ansible/ansible
sudo apt-get update
sudo apt-get install ansible

准备工作

为了使Ansible能够更加安全方便的执行,将Server的SSH Public Key添加到Clients的Authorized-Keys文件中。使得从Server端使用SSH登录到Client端时无需使用明文密码。这属于运维的基础知识,这里就不仔细说明了。

参考资料:Ansible Documentation