一、基础介绍

1、简介

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

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

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

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

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

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

2.工作机制

3.特性

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

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

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

(4)、yaml,not code:使用yaml语言定制剧本playbook;

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

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

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

二、Ansible基础安装与配置

本次安装使用的centos6.4系统环境

针对RedHat系列安装EPEL源

rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
yum install ansible

查看ansible版本:ansible --version
查看ansible安装文件:rpm -ql ansible |head

使用无ssh登录:
#-i用来指定hosts文件位置,webservers定义的主机组名. -u指定用户名,-m 执行命令,-k来提示输入密码

ansible -i /etc/ansible/hosts webservers -u saneri -m command -a 'df -Th' -k 

# vim /etc/ansible/hosts

主机组之间的嵌套写法:

[host:children]
host_1
host_2 [host_1]
10.10.100.14 [host_2]
10.10.100.17 [wservices]
10.20..[:] ansible_ssh_user=root ansible_ssh_pass=''

ansible -i hosts all -m ping -u www
 该命令选项的作用分别为:

  -i:指定 inventory 文件,使用当前目录下的 hosts
  all:针对 hosts 定义的所有主机执行,这里也可以指定组名或模式
  -m:指定所用的模块,我们使用 Ansible 内置的 ping 模块来检查能否正常管理远端机器
  -u:指定远端机器的用户

[options]

-m:指定模块(默认是command模块)
-a:指定模块的参数
-u:指定执行远程主机的用户(默认是root)ansible.cfg中可配置
-k:指定远程主机的密码
-s:以sudo方式运行
-U:sudo到那个用户(默认是root)
-f:指定多少个进程并发处理(默认是5)
--private-key=/path:指定私钥路径
-T:ssh连接超时时间(默认(10s)
-t:日志输出到该目录
-v:显示详细信息

配置linux主机SSH无密码访问

为了避免Ansible下发指令时输入目标主机密码,通过证书签名达到SSH无密码是一个好的方案,推荐使用ssh-keygen与ssh-copy-id来实现快速证书的生成及公钥下发,其中ssh-keygen生成一对密钥,使用ssh-copy-id来下发生成的公钥.

在主控端主机创建密钥,执行:ssh-keygen -t rsa,有询问直接按回车键即可,将在/root/.ssh/下生成一对密钥,其中id_rsa为私钥,id_rsa.pub为公钥(需要下发到被控主机用户.ssh目录,同时要求重命名成authorized_keys文件.)

接下来同步公钥文件id_rsa.pub到目标主机,推荐使用ssh-copy-id公钥拷贝工具。

命令格式:/usr/bin/ssh-copy-id[-i[identity_file]][user@machine]

#ssh-copy-id -i /root/.ssh/id_rsa.pub root@ip

效验SSH无密码配置是否成功,运行ssh root@ip,如直接进入目标root账号提示符,则说明配置成功.

三、常用模块使用

查看ansible模块的帮助信息(如yum模块):

[root@localhost ~]# ansible-doc -s yum

(1)、setup

## 用来收集远程主机的一些基本信息

ansible host -m setup

(2)、ping

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

# ansible storm_cluster -m ping

(3)、file

## 设置文件的属性

相关选项如下:

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

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

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

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

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

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

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

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

state:

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

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

  link:创建软链接

  hard:创建硬链接

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

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

示例:

## 远程文件符号链接创建
# ansible host_1 -m file -a "src=/etc/resolv.conf dest=/tmp/resolv.conf state=link"
##查看远程文件是否创建完成
ansible host_1 -m command -a "ls -lh /tmp/" ##远程删除创建的链接文件
ansible host_1 -m file -a 'path=/tmp/resolv.conf state=absent' ##在远程主机上面创建一个文件
ansible host_1 -m file -a 'path=/tmp/saneri.txt state=touch' ##远程创建目录dd1,指定属主、属组和权限.
ansible host_1 -m file -a 'path=/tmp/dd1 state=directory owner=yanglei group=root mode=777'

(4)、copy

## 复制文件到远程主机

相关选项如下:

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

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

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

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

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

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

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

##复制当前目录下文件test.txt,到host_1列表主机中的/tmp目录.
ansible host_1 -m copy -a 'src=test.txt dest=/tmp/xxoo.sh mode=700' ##复制文件之前先备份源文件.
ansible host_1 -m copy -a 'src=test.txt dest=/tmp/xxoo.sh mode=700 backup=yes' -rwx------ 1 root root 23 Jan 29 16:37 xxoo.sh
-rwx------ 1 root root 12 Jan 29 16:29 xxoo.sh.2016-01-29@16:37:21~

(5)、command

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

相关选项如下:

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

free_form:要执行的linux指令

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

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

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

示例:

# ansible host_1 -m command -a "uptime"

##当/tmp/xxoo.sh文件存在时,则不执行后面的ls -lh /home命令,反之则执行!

ansible host_1 -a 'creates=/tmp/xxoo.sh ls -lh /home'

##执行tar名字之前,先用chdir切换到指定文件目录.

ansible host_1 -a 'chdir=/usr/local/src tar -zcvf nginx_tar.gz  nginx-1.8.0'

#可以使用command模块创建用户

ansible host_1 -m command -a 'useradd -s /sbin/nologin -M user1'

6)、shell

ansible-doc -s shell

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

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

示例:

##过滤出sshd服务
ansible host_1 -m shell -a 'ps -ef |grep sshd'

三个远程命令模块的区别:

(1)功能
模块包括command、script、shell,都可以实现远程shell命令运行。
command作为Aasible的默认模块,可以运行远程权限范围所有的shell命令;
script功能是在远程主机执行主控端存储的shell脚本文件,相当于scp+shell组合;
shell功能是执行远程主机的shell脚本文件
(2)示例:
ansible 192.168.21.128 -u ansible --sudo -m command -a 'df -Th'
ansible 192.168.21.128 -u ansible --sudo -m script -a '/root/test.sh'
ansible 192.168.21.128 -u ansible --sudo -m shell -a '/root/test_clinet.sh'

7.service

用于管理服务

该模块包含如下选项:

arguments:给命令行提供一些选项

enabled:是否开机启动 yes|no

name:必选项,服务名称

pattern:定义一个模式,如果通过status指令来查看服务的状态时,没有响应,就会通过ps指令在进程中根据该模式进行查找,如果匹配到,则认为该服务依然在运行

runlevel:运行级别

sleep:如果执行了restarted,在则stop和start之间沉睡几秒钟

state:对当前服务执行启动,停止、重启、重新加载等操作(started,stopped,restarted,reloaded)

示例:

ansible host_1 -m service -a 'name=nginx state=restarted sleep=3'

ansible host_1 -m service -a "name=network state=restarted args=eth0"

8.cron

用于管理计划任务

包含如下选项:

backup:对远程主机上的原任务计划内容修改之前做备份

cron_file:如果指定该选项,则用该文件替换远程主机上的cron.d目录下的用户的任务计划

day:日(1-31,*,*/2,……)

hour:小时(0-23,*,*/2,……)

minute:分钟(0-59,*,*/2,……)

month:月(1-12,*,*/2,……)

weekday:周(0-7,*,……)

job:要执行的任务,依赖于state=present

name:该任务的描述

special_time:指定什么时候执行,参数:reboot,yearly,annually,monthly,weekly,daily,hourly

state:确认该任务计划是创建还是删除

user:以哪个用户的身份执行
示例:

##每隔两小时执行/sbin/reboot命令.
ansible host_1 -m cron -a 'name="reboot system" hour=2 user=root job="/sbin/reboot"' #查看host_1主机列表的计划任务列表 ansible host_1 -m command -a 'crontab -l' #删除该计划任务
ansible host_1 -m cron -a 'name="reboot system" hour=2 user=root job="/sbin/reboot" state=absent' ansible host_1 -m cron -a 'name="check home directory" minute=*/3 job="ls -lh /home"' #每天的五点和两点执行job的计划任务.
ansible host_1 -m cron -a 'name="check dirs" hour="5,2" job="ls -alh > /dev/null"' #在reboot时执行脚本.
ansible host_1 -m cron -a 'name="a job for reboot" special_time=reboot job="/some/job.sh"' #每周二的12点钟执行更新yum源操作
ansible host_1 -m cron -a 'name="yum autoupdate" weekday="2" minute=0 hour=12 user="root" job="YUMINTERACTIVE=0 /usr/sbin/yum-autoupdate" cron_file=ansible_yum-autoupdate' #删除ansible_yum-autoupdate
ansilbe host_1 -m cron -a 'cron_file=ansible_yum-autoupdate state=absent'

9.yum

使用yum包管理器来管理软件包

选项:

config_file:yum的配置文件

disable_gpg_check:关闭gpg_check

disablerepo:不启用某个源

enablerepo:启用某个源

list

name:要进行操作的软件包的名字,也可以传递一个url或者一个本地的rpm包的路径

state:状态(present,latest,absent) (present,latest为安装,absent为删除)
示例:

##使用yum安装httpd软件
ansible host_1 -m yum -a 'name=httpd state=present' ansible host_1 -m yum -a 'name=httpd state=latest' ##启动httpd服务
ansible host_1 -m service -a 'name=httpd state=started'

10.user模块

用户管理模块

常用参数:

home        #指定用户的家目录,需要与createhome配合使用;
groups #指定用户的属组;
uid #指定用的uid;
password #指定用户的密码;
name #指定用户名;
createhome #是否创建家目录yes|no;
system #是否为系统用户;
remove #当state=absent时,remove=yes则表示连同家目录一起删除,等价于userdel -r;
state #是创建还是删除;
shell #指定用户的shell环境;

说明的是,password后面指定的密码不能是明文,后面这一串密码会被直接传送到被管理主机的/etc/shadow文件中,而登陆的时候输入的密码会被hash加密以后再去与/etc/shadow中存放的密码去做对

比,会出现不一致的现象。所以需要先将密码字符串进行加密处理:openssl passwd -salt -1 "123456",然后将得到的字符串放到password中即可。

示例:

#创建user1用户
ansible host_1 -m user -a 'createhome=yes home=/home/user1 password=123456 name=user1 state=present shell=/bin/bash' #删除user1用户:
ansible host_1 -m user -a 'remove=yes state=absent name=user1'

11.group

组管理模块,使用实例:

ansible all -m group -a 'name=groupname state=present'

常用参数:

gid     #指定gid;
name #指定组名称;
state #操作状态,present,absent;
system #是否为系统组;

12.synchronize

使用rsync同步文件

archive #归档

checksum #检验其校验和

delete #删除源中没有,目标中存在的文件

dest #目标位置

src #源

dest_port

existing_only: skip createing new files on receiver

links

owner

mode:(push, pull) #模式,同步方式分为push(推)和pull(拉取)两种

recursive

rsync_path

示例:

ansible host_1 -m synchronize -a 'src=/tmp/helloworld dest=/var/www/'    

ansible host_1 -m synchronize -a 'src=./ansible.cfg dest=/tmp/ mode=push rsync_path=/usr/bin/rsync rsync_opts="-avz,--exclude=.git"'

13.filesystem

在块设备上创建文件系统

选项:

dev:目标块设备

force:在一个已有文件系统的设备上强制创建

fstype:文件系统的类型

opts:传递给mkfs命令的选项

示例:

#创建数据设备,模拟数据设备
ansible host_1 -m command -a 'dd if=/dev/zero of=/disk.img bs=4k count=1024' #关联loop设备
ansible host_1 -m command -a 'losetup /dev/loop0 /disk.img' ansible host_1 -m filesystem -a 'losetup /dev/loop0 /disk.img' #格式化块设备,-F表示强制创建 ansible host_1 -m filesystem -a 'dev=/disk.img fstype=ext4 opts=-F'

14.mount

配置挂载点

选项:

dump

fstype:必选项,挂载文件的类型,ext3、ext4...

name:必选项,挂载点

opts:传递给mount命令的参数

passno

src:必选项,要挂载的文件

state:必选项

present:只处理fstab中的配置

absent:删除挂载点

mounted:自动创建挂载点并挂载之

umounted:卸载

示例:

#将块设备挂载到/tmp目录下

ansible host_1 -m mount -a 'fstype=ext4 name=/tmp src=/dev/loop0 state=mounted'

#在/aaa目录下创建test文件

ansible host_1 -m file -a 'path=/aaa/test state=touch'

#将块设备挂载到/mnt目录下,并有可读写权限

ansible host_1 -m mount 'name=/mnt src=/dev/loop0 fstype=ext4 state=mounted opts=rw'

15.stat模块

(1)功能
获取远程文件状态信息,包括atime、ctime、mtime、md5、uid、gid等信息。

ansible 192.168.21.128 -u ansible --sudo  -m stat -a "path=/etc/sysctl.conf"

16.get_url模块
(1)功能
实现在远程主机下载指定URL到本地,支持sha256文件校验.

ansible 192.168.21.128 -u ansible --sudo  -m get_url -a "url=http://www.baidu.com dest=/tmp/index.html mode=0440 force=yes"

17.unarchive模块

用于解压文件的模块

$ ansible test -m unarchive -a 'src=foo.tgz dest=/var/lib/foo'
$ ansible test -m unarchive -a 'src=/tmp/foo.zip dest=/usr/local/bin copy=no'
$ ansible test -m unarchive -a 'src=https://example.com/example.zip dest=/usr/local/bin copy=no'

常用参数:

copy        #在解压文件之前,是否先将文件复制到远程主机,默认为yes。若为no,则要求目标主机上压缩包必须存在;
creates #指定一个文件名,当该文件存在时,则解压指令不执行;
dest #远程主机上的一个路径,即文件解压的路径;
group #解压后的目录或文件的属组;
list_files #如果为yes,则会列出压缩包里的文件,默认为no,2.0版本新增的选项;
mode #解决后文件的权限;
src #如果copy为yes,则需要指定压缩文件的源路径;
owner #解压后文件或目录的属主;

18.debug模块

(1.)功能

调试模块,用于在调试中输出信息

常用参数:

msg:调试输出的消息
var:将某个任务执行的输出作为变量传递给debug模块,debug会直接将其打印输出
verbosity:debug的级别(默认是0级,全部显示)

debug模块示例:

---
- hosts: 192.168.21.128
gather_facts: False
tasks:
- name: command run line
shell: date
register: result
- name: show debug info
debug: var=result.stdout verbosity= debug: var=result verbosity=0时可以看到debug不光输出了date命令结果,还返回了很多相关调试信息,只需要date返回值可以使用变量属性过滤 如result.stdout 就是命令的返回值 #获取被控机器的fact数据默认为True,你可以关闭获取fact数据功能。关闭之后,可以加快 ansible-playbook 的执行效率。
gather_facts:False

更多模块查阅ansible中文官方文档:http://www.ansible.com.cn/

                http://www.mamicode.com/info-detail-1428476.html

                http://www.ywnds.com/?p=6051

Ansible简介及常用模块的更多相关文章

  1. ANSIBLE安装和常用模块模块使用详细教程

    目录 ANSIBLE安装和各种模块应用功能 安装配置ANSIBLE ANSIBLE使用 ansible-galaxy工具 ansible-pull工具 ansible-playbook ansible ...

  2. Ansible 入门指南 - 常用模块

    介绍 module 文档: 官宣-模块分类的索引 官宣-全部模块的索引 在playbook脚本中,tasks 中的每一个 action都是对 module的一次调用.在每个 action中: 冒号前面 ...

  3. Ansible指令和常用模块使用

    这里文章记录一下ansible的指令选项和常用的模块使用 ansible指令选项 -m:要执行的模块,默认为command -a:模块的参数 -u:ssh连接的用户名,默认用root,ansible. ...

  4. mage Ansible学习1 常用模块

    一.Ansible特点 二.Ansible架构 1.core modules实现常用模块 2.Custom modules实现自定义模块 3.Connection Plugins 连接插件,可通过SS ...

  5. Ansible安装及常用模块

    配置文件:/etc/ansible/ansible.cfg 主机列表:/etc/ansible/hosts  安装anslibe  wget -O /etc/yum.repos.d/epel.repo ...

  6. Ansible Ad-Hoc与常用模块

    ansible 执行结果信息–各颜色说明:ansible Ad-Hoc 说明:ansible 如何查看帮助文档与常用模块详解 主机规划 添加用户账号 说明: 1. 运维人员使用的登录账号: 2. 所有 ...

  7. ansible使用,常用模块

    使用ansible管理其他主机有两种方式: 1.命令行执行ansible ad-hoc命令 2.把要做的动作行为写入一个文件[playbook脚本],ansible读取脚本自动完成相应的任务. Ans ...

  8. Ansible之常用模块(一)

    ansible之所以功能强大,不是ansible本身,是因为它有众多的模块,前文我们介绍了ansible的基础介绍,系列命令的用法以及选项的说明,通过前文的学习我们知道了ansible是基于pytho ...

  9. Ansible安装部署以及常用模块详解

    一.  Ansible 介绍Ansible是一个配置管理系统configuration management system, python 语言是运维人员必须会的语言, ansible 是一个基于py ...

随机推荐

  1. Spring 在web 容器中的启动过程

    1.对于一个web 应用,其部署在web 容器中,web 容器提供其一个全局的上下文环境,这个上下文就是 ServletContext ,其后面的spring IoC 容器提供宿主环境 2.在web. ...

  2. jquery-追加元素

    一.在元素内部/外部追加元素 append,prepend:添加到子元素 before,after:作为兄弟元素添加 html: <div id="content"> ...

  3. asp.net mvc 依赖缓存启动项配置

    msdn 参考地址:https://msdn.microsoft.com/zh-cn/library/ms229862 4.5 第一步:32bit%windir%\Microsoft.NET\Fram ...

  4. iOS蓝牙开发(一)蓝牙相关基础知识(转)

    转载自:http://www.cocoachina.com/ios/20150915/13454.html 原文作者:刘彦玮 蓝牙常见名称和缩写 MFI ======= make for ipad , ...

  5. 二叉查找树 C++实现(含完整代码)

    一般二叉树的查找是通过遍历整棵二叉树实现,效率较低.二叉查找树是一种特殊的二叉树,可以提高查找的效率.二叉查找树又称为二叉排序树或二叉搜索树. 二叉查找树的定义 二叉排序树(Binary Search ...

  6. Scala 递归学习的例子

    为了学习Spark,我开始了学习Scala.加油! 递归的一个题目: 代码: // Why x is Float, but when we use 3.0 for example, it return ...

  7. 【BZOJ-1923】外星千足虫 高斯消元 + xor方程组

    1923: [Sdoi2010]外星千足虫 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 766  Solved: 485[Submit][Status ...

  8. 【BZOJ-1010】玩具装箱toy DP + 斜率优化

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 8432  Solved: 3338[Submit][St ...

  9. VMware“该虚拟机似乎正在使用中”问题

    在用VMware虚拟机的时候,有时会发现打开虚拟机时提示“该虚拟机似乎正在使用中.如果该虚拟机未在使用,请按“获取所有权(T)”按钮获取它的所有权.否则,请按“取消(C)”按钮以防损坏.配置文件: D ...

  10. PHP Lex Engine Sourcecode Analysis(undone)

    catalog . PHP词法解析引擎Lex简介 . PHP标签解析 1. PHP词法解析引擎Lex简介 Relevant Link: 2. PHP标签解析 \php-5.4.41\Zend\zend ...