ansible是一个综合的强大的管理工具,他可以对多台主机安装操作系统,并为这些主机安装不同的应用程序,也可以通知指挥这些主机完成不同的任务.查看多台主机的各种信息的状态等,ansible都可以通过模块的方式来完成.

ansible组件包含以下所有组件的功能

configuretion(cfengine,chef,puppte)

deployment(capistrano,fabric)

ad-hoc tasks(func)

multi-tier orchestration(juju,sort of)

ansible特性:

No agents:不需要再被管理节点上安装任何程序,除了sshd

No server :在服务器端不需要启动任何服务,只需要执行命令就行

No additional PKI : 由于不基于ssl,所以也不基于PKI工作

MOdules in any language:基于模块工作,ansible拥有众多的模块

YAML:支持YMAL语言,另一种语言

SSH by default:默认使用ssh控制各节点

ansible的基本架构

核心:ansible

核心模块:Core Modules,这些都是ansible自带的模块

扩展模块:Custom Modules,如果核心模块不足以完成某种功能,可以添加扩展模块

插件:Plugins:完成模块功能的补充

剧本:Playbooks,把需要完成的多个任务定义在剧本中

连接插件:Connectior Plugins;ansible基于连接插件连接到各个主机上,虽然ansible是使用ssh链接到个主机的,但是他还支持其他的连接方法,所以需要有连接插件

主机群:Host Inventory;ansible在管理多台主机时,只想对其中的一部分执行某些操作

如下图所示:

ansible及ansible-palybook使用详解_第1张图片


编译安装ansible

解决依赖关系

# 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/ansible

查看rpm包的详细信息

rpm -pqi ansible-1.5.4-1.el6.noarch.rpm
安装rpm包
yum install ansible-1.5.4-1.el6.noarch.rpm –y
查看安装后生成的文件
rpm -ql ansible
配置主机列表
vim /etc/ansible/hosts
.,$s@^\([^#]\)@#\1@g              #注释所有行,在命令行模式下
[webserver] #添加webserve,下面的IP地址也可以使用主机名
172.16.21.2
172.16.21.3
 
[dbserver]  #添加dbserver
172.16.21.4
生成密钥并让主机列表中的主机信任
ssh-keygen -t rsa -P ''  #生成密钥
ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected] #复制公钥到其他主机
ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]
ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]
ansible的基本用法
ansible all -m ping                                   #查看是否所有的节点都在线
ansible all [ -m command ] -a 'date'                  #查看所有主机当前时间
ansible all -a 'ntpdate 172.16.0.1'                   #同步所有主机的时间
ansible <host-pattern> [-f forks] [-m module_name] [-a args] #命令格式
ansible all -a 'service httpd status'                 #查看三台主机的httpd服务状态
ansible webserver -a 'service httpd status'           #可对组进行操作
ansible 172.16.21.4 -a 'service httpd status'         #可对单台主机进行操作
查看ansible所支持的模块
 ansible-doc -l   #列出所有ansible支持的模块,重要,请自行记住
acl                  Sets and retrieves file ACL information.
...
at                   Schedule the execution of a command or scripts via the at co
cron                 Manage cron.d and crontab entries.
command              Executes a command on a remote node                         
copy                 Copies files to remote locations. 
... 

查看指定模块的参数

ansible-doc -s copy 重要,请自行记住
      src=          #源文件                   
      force=        #是否覆盖         
      dest=         #目标文件 
ansible all -m copy -a "src=/etc/fstab dest=/tmp"                   
  1: ansible-doc -s cron
  2: - name: Manage cron.d and crontab entries.
  3:   action: cron
  4:       name= 
  5:       hour=
  6:       job=          
  7:       cron_file=           
  8:       reboot=               
  9:       month=             
 10:       state=               
 11:       special_time=        
 12:       user=               
 13:       backup=            
 14:       day=                
 15:       minute=             
 16:       weekday=        
 17: ansible all -m cron -a 'name="custom job" minute=15 hour=* day=* month=* weekday=* job="/usr/sbin/ntpdate 172.16.0.1"'
 18: ansible all -a 'crontab -l'

ansible的yum使用

  1: ansible-doc -s yum
  2:       action: yum
  3:       state=               #安装还是卸载,present安装,absent卸载      
  4:       disablerepo=         #禁用某个yum源     
  5:       name=                #要安装的程序包名     
  6:       enablerepo=          #要启用的yum源    
  7:       list=                #列表,主要是playbooks中使用的
  8:       disable_gpg_check=   #
  9:       conf_file=           #执行yum时使用其他服务器的文件
 10: ansible all -m yum -a "state=present name=corosync"

ansible的服务使用

  1: ansible-doc -s service       #设置某一应用程序开启自动启动的
  2: - name: Manage services.
  3:   action: service
  4:       state=                 # 当前的服务是启动的还是关闭的
  5:       sleep=                 #
  6:       name=                  # 服务名称
  7:       runlevel=              #在哪些级别下启动的
  8:       pattern=               #
  9:       enabled=               #开机是否让其启动{0|1}
 10:       arguments=             #
 11: ansible all -m service -a "state=stopped name=httpd enabled=yes"
 12: ansible all -a "chkconfig --list httpd"

ansible的playbooks,可把多个需要执行的命令存在剧本中,一次执行

  1: vim test.yaml
  2: 下面的格式很重要,冒号后面一定要有空格,tasks下面一定要有缩进,并且每行对齐
  3: - hosts: all         #执行的主机,前面有横杠表示可以有多个
  4:  remote_user: root    #使用哪个用户的身份在各远程主机上执行命令,可以定义全局的,也可以定义单个任务要使用的用户
  5:  tasks:              #需要执行的任务,因为有子任务,所以下面的任务需要缩进
  6:    - name: add a group  #第一个执行的任务的名字,类似注释信息
  7:      group: gid=1001 name=testymal system=no  #具体的任务本身
  8:    - name: excute a command

9: command: /bin/date

10: 执行顺序是把一个任务在所有主机上执行一遍,再把第二个任务在所有主机上执行,如果在执行任务的过程中发生错误,将回滚所有可回滚的任务

ansible的handler

  1: 	- hosts: all
  2: 	  remote_user: root
  3: 	  tasks:
  4: 	    - name: ensure apache latest version
  5: 	      yum: name=httpd state=laster
  6: 	    - name: apache configure file
  7: 	      copy: src=/root/httpd.conf dest=/etc/httpd/conf force=yes
  8: 	      notify:                          #调用下面的handlers
  9: 	        - restart httpd
 10: 	  handlers:                            #定义handlers要执行的动作
 11: 	  	- name: restart httpd
 12: 	  	  service: name=httpd state=restarted
ansible的playbooks实现安装heartbeat
  1: heartbeat.yaml
  2: 	- hosts: hbhosts
  3: 	  remote_user: root
  4: 	  tasks:
  5: 	    - name: ensure heartbeat latest version
  6: 	      yum: name=heartbeat state=present      #安装最新版本
  7: 	    - name: authkeys configure file
  8: 	      copy: src=/root/hb_conf/authkeys dest=/etc/ha.d/authkeys  #复制本地文件到远程主机
  9: 	    - name: authkeys mode 600
 10: 	      file: path=/etc/ha.d/authkeys mode=600 #改文件权限,可以使用ansible-doc -s file查看
 11: 	      notify:                                #调用下面的handlers
 12: 	        - restart heartbeat
 13: 	    - name: ha.cf configure file
 14: 	      copy: src=/root/hb_conf/ha.cf dest=/etc/ha.d/ha.cf     #复制本地文件到远程主机
 15: 	      notify:                                #调用下面的handlers
 16: 	       	- restart heartbeat                  #调用下面的handlers
 17: 	  handlers:                                  #定义handlers的动作,这个的缩进与tasks一致
 18: 	  	- name: restart heartbeat
 19: 	  	  service: name=heartbeat state=restarted

扩展:ansible还有两种模式,一种是队列,一种是拉(Pull Mode) ,这里不介绍了 .....