问:试想一下,要在N台主机上做相同的配置,一遍又一遍,是不是特别想让这种重复性工作一下搞定?

   本文介绍的ansible就是能减轻这种压力的自动化工具。

 

一、Ansible简介

 Ansible是自动化运维工具的一种,使用Python编写的,通过远程控制其他主机,来达到修改配置、软件部署、修改用户等工作。

 控制方式:通过ssh协议控制其他主机实现

 特性:

    ①幂等性:不管重复执行多少次,得到的结果都是一样的

    ②期望状态:只要给出想要达到的结果,无需制定具体怎么做

 

二、Ansible组成部分

 ·Host inventory:主机列表,用来定义被控制的远程主机。

 ·Modules:模块,ansible用来向各主机上定义执行操作的。

 ·Ad Hoc Commands:命令,ansible用来配合modules,完成具体指令的,类似于"参数"的概念。

 ·Playbooks:剧本,通过YAML语言进行编写的,可批量完成多次任务的组合。

     tasks:任务,调用 modules 和 commands 来完成指定目的

     handles:触发器,通常在任务最后添加nodify,用来触发该操作的执行,可以理解为需要被触发才能执行的task。

     roles:角色,用来将需要多次调用的执行任务,放在roles下的子目录中,调用时直接添加角色名即可,将各项操作分开,方便管理修改。

     variables:变量,用来保存经常变化的数据参数。

 

三、Ansible的命令行操作

使用方式:我是直接用YUM安装的,方便快捷

  ansible -m -a "Command"

 

用户列表:

  hosts通常是调用/etc/ansbile/hosts这个文件,有指定方式,可单独添加,也可使用组定义,还可使用通配符定义,以下就是通过组定义的示例。当然,你也可以手动直接在写入单个IP也可以。

        ansible_ssh_user=    登录远端主机的用户

        ansible_ssh_pass=    登录远端主机的密码,由于是明文不***全,可以直接和远程主机做ssh密钥认证。

例   # vim/etc/ansilbe/hosts

           [hostdb]         #用来被调用的组名称 

            192.168.214.134  ansible_ssh_user=xxx  ansible_ssh_pass=xxx

            192.168.214.135   #用来指定需要远程的用户

 

Module+ Command:指定整个执行目的。

  查询操作:

       ansible-doc -l     #查看各个module

       ansible-doc 模块名  #查看模块可使用的命令参数。 

 

这里主要介绍常用的模块:

     copy:将本地文件复制到各个主机上,一般用于配置文件的同步修改。

           src=          #指定本地的源文件或目录

           dest=         #指目标存放路径

   例:ansible hostdb -m copy -a"src=/var/a.txt dest=/tmp/"

 

    file:对远程的文件或目录进行修改

           dest=         #指定修改的路径,也可使用name,path

           state={ file | directory | link | absent | hard }  #指定执行操作

           file:创建文件

           directory:创建目录,这里是递归创建

           link:创建软链接

           hard:创建硬链接

           absent:删除文件或目录,递归删除

   例:ansible hostdb -m file -a"dest=/tmp/xxy/ owner=root group=root mode=620 state=directory"

 

    yum:控制远程主机进行yum安装

           name=        #指定yum安装的包名

           state={ present | absent }        #指定执行哪种操作{安装|卸载}

   例:ansible hostdb -m yum -a"name=mysql-server state=present"

 

    service:对服务进行管理操作

          name=        #指定操作的服务名称

          state={ started | stoped | restarted | reloaded} #对服务器的操作,这个不解释

   例:ansible hostdb -m service -a"name=mysql state=restart"

 

    cron:指定任务计划

          name=        #ansible需要添加的一个crontab名称

          minute=       #设置任务计划的时间,还有hour、day、month、weekday。

          job=         #设置任务计划的具体执行命令

         state={ present | absent }   #指定{添加|删除}

    例:ansible hostdb -m cron -a"name=test minute=*/5 job='ntpdate 192.168.214.131 > /dev/null'state=present"

 

    command、shell:这两个命令都是在主机上直接执行命令的。但有些命令通过command执行会出错,通过shell可以执行成功。使用command可以省略"-m"

  例:ansible hostdb -a "ls /etc/passwd"

         ansible hostdb -m shell -a "yum -y install ntp"

  

以上就是ansible的命令行操作的常见模块的示例,其实挺简单的,一台主机控制多台主机,不管是配置还是管理都能减去大部分时间,赶快把这个技能点亮吧。