一、常见的自动化运维工具

1.功能上分类

OS Provisioning:PXE,cobbler:参考链接 http://renjunjie622.blog.51cto.com/2913680/1782190

        物理机:PXE、Cobbler

        虚拟机:Image Templates(镜像模板)

OS Config:程序包管理、用户管理、配置文件、服务管理、cron任务等等;

        puppet (ruby) 

        saltstack (python)

        chef

        cfengine

Task Exec:

        fabric,func,saltstack

Deployment:

        fabric

2.从代理上分类:

        agent: puppet, func

        agentless: ansible, fabric(运行ssh服务)

二、ansible介绍

1.ansible特性:

    1.高度模块化,借助模块完成各种任务

    2.agentless,即无需在被控制端安装agent

    3.默认基于ssh协议向被控制端发送操作指令

       基于密钥认证

       在inventory文件中指定账号和密码       

    4.一系列任务执行可写成剧本(playbook)

    5.具有幂等性:不会重复执行相同操作,比如不会重复安装软件

    6.主从模式:master:ansible,ssh client  slave:ssh server

2.ansible的核心组件:

    ansible core(核心程序)

    host inventory(主机列表)

    core modules(核心模块)

    custom modules(自定义模块)

    playbook(yaml,jinjia2)(剧本)

    connection plugin(连接插件,负责和被控制端通信)

    plugin(其他插件:邮件发送、日志)

3.安装

ansible依赖于Python 2.6或更高的版本、paramiko、PyYAML及Jinja2。

1.编译安装解决依赖关系# yum -y install python-jinja2 PyYAML python-paramiko python-babel python-crypto# tar xf ansible-1.5.4.tar.gz# cd ansible-1.5.4# python setup.py build# python setup.py install# mkdir /etc/ansible# cp -r examples/* /etc/ansible2.rpm包安装(配置epel yum源)   #建议采用# yum install ansible

 3.ansible重要文件               

配置文件:/etc/ansible/ansible.cfg 主机列表文件:/etc/ansible/hosts

4.root基于密钥,免密登入

(1)yum -y install openssh-clients (2)ssh-keygen -t rsa(3)ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.193.129具体解释参见:http://nxyboy.blog.51cto.com/10511646/1944205

三、常用模块与命令

1.命令格式:

ansible命令基础:ansible 
 [-f forks] [-m module_name] [-a args] -f forks: 启动的并发线程数 -m module_name: -a args:    args:   key=value -i 指定hosts文件,不使用默认

2.查看模块帮助:

ansible-doc  -l      #列出ansible所支持的模块ansible-doc  -s  MODULE_NAME  #查看指定模块ansible-doc  -s  yum

3.常用模块module_name介绍

1.command  命令模块,默认模块,用于在远程执行命令		 -a 'COMMAND'	#ansible node2 -m command -a "date"2.user  管理用户   		-a 'name= state={present|absent} system=  uid='                name=:指明用户名  password=加密串#ansible node2 -m user -a 'name=mysql uid=306 system=yes group=mysql'3.group	    		-a 'name= gid= state= system='			 state:present,absent#ansible node2 -m group -a 'name=mysql gid=306 system=yes state=present '4.cron	周期性任务计划模块		-a 'name= minute= hour= day= month= weekday= job= user= state='#ansible node2 -m cron -a 'minute="*/10" job="/bin/echo hahaha" name="test" state="present" '          5.copy(复制文件)	-a 'dest= src= mode= owner= group=   content='                src=:本地源文件路径(可以相对和绝对路径)		dest=:目标文件路径(绝对路径)		content=: 直接生成文件内容,取代src(不能与src同时存在)		force: 当设置为yes时,如果目标主机存在该文件,但内容不同,会强制覆盖。默认为yes                backup: 在覆盖之前备份源文件,yes/no#ansible node2 -m copy -a 'src=/etc/fstab dest=/tmp/fstab.ansible owner=root mode=640 '#ansible node2 -m copy -a 'content="Hello\n  hello\n " dest=/tmp/hello.ansible '6.file(设置文件属性) 	-a 'path= mode= owner= group= state={directory|link|present|absent} src='		path=:指定文件路径,可以使用name或dest来替换		src=:被链接的源文件路径,只应用于 state=link 的情况		    创建文件的链接:			src=:指定源文件   path=:指定链接文件	        state=:后面接文件的各种状态,如directory, link, hard, file及absent(删除)                  directory: 如果目录不存在,则创建目录                  file: 即使文件不存在,也不会被创建                  absent: 删除目录、文件或链接文件                  touch: 如果文件不存在,则会创建一个新文件,如果存在,则更新其时间戳                  link: 创建软链接                  hard:硬链接#ansible node2 -m file -a 'owner=mysql group=mysql mode=644 path="/tmp/fstab.ansible"'#ansible node2 -m file -a ' path="/tmp/fstab.link"  src="/tmp/fstab.ansible" state=link '	       7.ping 测试远程主机能否能连接,没有参数#ansible node2 -m ping8.yum(安装或卸载程序包)	-a 'name= state={present|latest|absent}'		name=指明要安装的软件包,可以带上版本号#ansible node2 -m yum -a 'name=zsh  state=present'                       9.service(指定程序运行状态)	-a 'name= state={started|stopped|restarted} enabled='	    enabled=:是否开机自启,取值为true或false		state=现在状态#ansible node2 -m service -a 'enable=true name=httpd state=started '10.shell (管道,变量 复杂命令) 	-a 'COMMAND'#ansible node2 -m shell -a 'echo 123456 | passwd --stdin user1 '11.script(本地脚本,复制到远程主机上并运行)		-a '/path/to/script' #ansible node2 -m script -a '/tmp/test.sh' 12.setup(收集远程主机的facts)ansible-doc -s setup#ansible node2 -m setupplaybook运行时,会自动调用setup模块收集远程主机的相关信息(称为facts,如操作系统版本、ip地址、cpu数量等),这些信息保存于变量中,可在playbook中引用。我们也可直接使用ansible命令直接获取这些变量信息:ansible all -m setup [-a 'filter=ansible_eth[0-2]']       filter:过滤器,表示只返回与指定shell风格通配符匹配的变量信息ansible all -m setup --tree /tmp/facts       --tree:表示将收集的facs以树状的结构输入到指定文件中       [root@node1 ~]#  ansible node2 -m setup -a 'filter=ansible_fqdn'192.168.193.129 | SUCCESS => {    "ansible_facts": {        "ansible_fqdn": "node2"    },     "changed": false}              13.template template是使用了Jinjia2格式作为文件模版,进行文档内变量的替换的模块。它的每次使用都会被ansible标记为”changed”状态。             举个例子:         vim /root/httpd.conf           ...           ServerName {
{ ansible_fqdn }}#ansible node2 -m template -a 'src=/root/httpd.conf desc=/etc/httpd/conf/httpd.conf当/root/httpd.conf文件被复制到第一个主机时,ServerName的值被替换成第一个主机的ansible_fqdn的值node2,而被复制到第二个主机时,ServerName的值会被替换成node314.synchronize该模块会调用rsync命令,用于将ansible机器的指定目录推送到客户机器 的指定目录下#ansible node2 -m synchronize -a 'src=/usr/local/src/ dest=/usr/local/src/ delete=yes compress=yes'15.get_url常用模块,可以实现在远程主机上下载url到本地#ansible node2 -m get_url -a 'url=http://xxx.com dest=/tmp'更多模块,参考http://www.361way.com/ansible-modules/4415.html