1,ansible简介
ansible是一种基于python开发的自动化运维工具,它只需要在服务端安装ansible,无需在每个客户端安装客户端程序,通过ssh的方式来进行客户端服务器的管理,基于模块来实现批量数据管理,批量设备部署及批量命令执行。
ansible大致模块工作原理见下图
大致工作原理就是ansible程序调用抽取/etc/ansible/ansible.cfg配置文件获取主机了列表清单/etc/ansible/hosts文件,获取所要处理的主机列表,然后查看剧本任务,在根据剧本中一系列任务生成一个临时脚本文件,然后将该脚本文件发送给所有管理的主机,脚本文件在远程主机执行完成后返回结果,然后删除本地临时文件。
2,ansible的安装部署及免密设置
1,使用yum方式安装,需要先安装epel源后方可找到ansible
[root@ansible ~]# rpm -ivh http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
或者阿里的epel源
[root@ansible ~]# wget -O /etc/yum.repos.d/epel-7.repo http://mirrors.aliyun.com/repo/epel-7.repo
#安装ansible
[root@ansible ~]# yum -y install ansible
ansible工具默认主目录为/etc/ansible,其中hosts文件为被管理ip或主机名列表,ansible.cfg为ansible著配置文件,roles为角色或者插件路径,默认该目录为空,如下图所示
ansible远程批量管理,其中执行命令是通过ad-hoc来完成,也就是点对点的执行命令,能够快速执行,而去不需要保存执行的命令,默认host文件配置主机列表,可以配置分组,也可以定义各种ip及规则,hosts列表默认配置如下图所示
Ansible基于多模块管理,常用的Ansible工具管理模块包括:command、shell、script、yum、copy、file、async、docker、cron、mysql_user、ping、sysctl、user、acl、add_host、easy_install、haproxy等。可以使用ansible-doc-l|more查看Ansible支持的模块,也可以查看每个模块的帮助文档,用法为ansible-doc module_name,如下图所示。
3,ansible工具参数详解
基于Ansible批量管理,需将被管理的服务器IP列表添加至/etc/ansible/hosts文件中,如下图添加4台被管理端IP地址,分成Web和DB两组,本机也可以是被管理机。
Ansible自动运维工具管理客户端案例操作,由于Ansible管理远程服务器基于SSH,在登录远程服务器执行命令时需要远程服务器的用户名和密码,也可以加入-k参数手动输入密码或者基于ssh-keygen生成免秘钥。
Ansible自动化批量管理工具主要参数详解如下:
·-v,-verbose:打印详细模式
·-i PATH,-inventory=PATH:指定host文件路径
·-f NUM,-forks=NUM:指定fork开启同步进程的个数,默认为5。
·-m NAME,-module-name=NAME:指定module名称,默认模块为command。
·-a MODULE_ARGS:module模块的参数或者命令。
·-k, -ask-pass:输入远程被管理端密码。
·-sudo:基于sudo用户执行。
·-K,-ask-sudo-pass:提示输入sudo密码与sudo一起使用。
·-u USERNAME,-user=USERNAME:指定执行用户。
·-C,--check:测试执行过程,不改变真实内容,相当于预演。
·-T TIMEOUT:执行命令超时时间,默认为10s。
·--version:查看Ansible软件版本信息。
###先生成密钥对,然后发送给被管理主机
[root@ansible ~]# ssh-keygen #一值回车
[root@ansible ~]# ssh-copy-id root@192.168.81.155 #输入被管理主机密码,以下一样
[root@ansible ~]# ssh-copy-id root@192.168.81.160
[root@ansible ~]# ssh-copy-id root@192.168.81.161
[root@ansible ~]# ssh-copy-id root@192.168.81.163
3.1 ansible ping模块实战
ansibel最基础的模块为ping模块,主要用于判断远程客户端是否在线,返回值为changed,ping。
使用ansible ping服务器状态,代码如下:
3.2 ansiable command模块实战
ansible command模块为ansible默认模块,主要执行linux基础命令,可以执行远程服务器命令执行,任务执行等操作,command模块使用详解如下:
·Chdir:执行命令前,切换到目录。
·Creates:当该文件存在时,则不执行该步骤。
·Executable:换用shell环境执行命令。
·Free_form:需要执行的脚本。
·Removes:当该文件不存在时,则不执行该步骤。
·Warn:若在ansible.cfg中存在告警,如果设定了false,不会警告此行。
Ansible command模块企业常用案例如下。
1,ansible command 模块远程执行date命令,代码如下:
2,ansible command模块远程执行ping命令,代码如下:
3.3 ansible copy模块实战
Ansible copy模块主要用于文件或者目录复制,支持文件、目录、权限、用户组功能,copy模块使用详解如下:
·src:Ansible端源文件或者目录,空文件夹不复制。
·content:用来替代src,用于将指定文件的内容复制到远程文件内。
·dest:客户端目标目录或者文件,需要绝对路径。
·backup:复制之前,先备份远程节点上的原始文件。
·directory_mode:用于复制文件夹,新建的文件会被复制,而老旧的不会被复制。
·follow:支持link文件复制。
·force:覆盖远程主机不一致的内容。
·group:设定远程主机文件夹的组名。
·mode:指定远程主机文件及文件夹的权限。
·owner:设定远程主机文件夹的用户名。
Ansible copy模块企业常用案例如下。
(1)Ansible copy模块操作,src表示源文件,dest表示目标目录或者文件,owner指定拥有者,代码如下
[root@ansible ~]# ansible webserver -m copy -a "src=/etc/passwd dest=/opt mode=755 owner=root"
2,ansible copy模块操作,content表示文件内容,dest表示目标目录,owner指定拥有者,代码如下:
[root@ansible ~]# ansible webserver -m copy -a "cnotallow='hello ansible' dest=/opt/a.txt mode=755 "
(3)Ansible copy模块操作,content表示文件内容,dest表示目标文件,owner指定拥有者,backup=yes开启备份,代码如下:查看web服务器可以发现就文件被备份了,新文件为新内容。
[root@ansible ~]# ansible webserver -m copy -a 'cnotallow=12345 dest=/opt/a.txt backup=yes'
3.4 ansible yum模块实战
Ansible YUM模块主要用于软件的安装、升级、卸载,支持红帽rpm软件包的管理,YUM模块使用详解如下:
·conf_file:设定远程YUM执行时所依赖的YUM配置文件。
·disable_gpg_check:安装软件包之前是否检查gpg key。
·name:需要安装的软件名称,支持软件组安装。
·update_cache:安装软件前更新缓存。
·enablerepo:指定repo源名称。
·skip_broken:跳过异常软件节点。
·state:软件包状态,包括installed、present、latest、absent、removed。
Ansible YUM模块企业常用案例如下。
(1)Ansible YUM模块操作,name表示需安装的软件名称,state表示状态,常见state=installed(present)表示安装软件,代码如下
[root@ansible ~]# ansible webserver -m yum -a "name=httpd state=installed"
(2)Ansible YUM模块操作,name表示需安装的软件名称,state表示状态,常见state=absent表示卸载软件,代码如下
[root@ansible ~]# ansible webserver -m yum -a "name=httpd state=absent"
(3)Ansible YUM模块操作,name表示需安装的软件名称,state表示状态,常见state=installed表示安装软件,disable_gpg_check=no表示不检查key,代码如下
[root@ansible ~]# ansible webserver -m yum -a "name=httpd state=present disable_gpg_check=no"
3.5 Ansible file模块实战
Ansible file模块主要用于对文件的创建、删除、修改、权限、属性的维护和管理,file模块使用详解如下:
·src:Ansible端源文件或者目录。
·follow:支持link文件复制。
·force:覆盖远程主机不一致的内容。
·group:设定远程主机文件夹的组名。
·mode:指定远程主机文件及文件夹的权限。
·owner:设定远程主机文件夹的用户名。
·path:目标路径,也可以用dest,name代替。
·state:状态包括file、link、directory、hard、touch、absent。
·attributes:文件或者目录特殊属性。
Ansible file模块企业常用案例如下。
(1)Ansible file模块操作,path表示目录的名称和路径,state=directory表示创建目录,代码如下.
[root@ansible ~]# ansible webserver -m file -a "path=/opt/abc state=directory"
(2)Ansible file模块操作,path表示目录的名称和路径,state=touch表示创建文件,代码如下
[root@ansible ~]# ansible webserver -m file -a "path=/opt/a.txt state=touch"
(2)Ansible file模块操作,path表示目录的名称和路径,state=absent表示删除文件,代码如下
[root@ansible ~]# ansible webserver -m file -a "path=/opt/a.txt state=absent"
3.6 Ansible user模块实战
Ansible user模块主要用于操作系统用户、组、权限、密码等操作,user模块使用详解如下:
·system:默认创建为普通用户,为yes则创建系统用户。
·append:添加一个新的组。
·comment:新增描述信息。
·createhome:给用户创建家目录。
·force:强制删除用户。
·group:创建用户主组。
·groups:将用户加入组或者附属组添加。
·home:指定用户的家目录。
·name:表示状态,是否create、remove、modify。
·password:指定用户的密码,此处为加密密码。
·remove:删除用户。
·shell:设置用户的shell登录环境。
·uid:设置用户ID。
·update_password:修改用户密码。
state:用户状态,默认为present,表示新建用户。
Ansible user模块企业常用案例如下。
(1)Ansible user模块操作,name表示用户名称,home表示其家目录,代码如下
[root@ansible ~]# ansible webserver -m user -a "name=abc home=/home/abc"
[root@ansible ~]# ansible webserver -m user -a "name=abc home=/home/abc password=111"
(2)Ansible user模块操作,name表示用户名称,home表示其家目录,state=absent删除用户remove=yes删除家目录,代码如下
[root@ansible ~]# ansible webserver -m user -a "name=abc state=absent remove=yes"
3.7 Ansible cron模块实战
Ansible cron模块主要用于添加、删除、更新操作系统crontab任务计划,cron模块使用详解如下:
·name:任务计划名称。
·cron_file:替换客户端该用户的任务计划的文件。
·minute:分(0-59,∗,∗/2)。
·hour:时(0-23,∗,∗/2)。
·day:日(1-31,∗,∗/2)。
·month:月(1-12,∗,∗/2)。
·weekday:周(0-6或1-7,∗)。
·job:任何计划执行的命令,state要等于present。
·backup:是否备份之前的任务计划。
·user:新建任务计划的用户。
·state:指定任务计划present、absent。
Ansible cron模块企业常用案例如下。
(1)Ansible cron模块操作,基于cron模块,创建crontab任务计划,制定重启httpd服务,代码如下
[root@ansible ~]# ansible webserver -m cron -a "minute=0 hour=0 day=* mnotallow=* weekday=* name='restart httpd' job='systemctl restart httpd'"
(2)Ansible cron模块操作,基于cron模块,删除crontab任务计划,代码如下
[root@ansible ~]# ansible webserver -m cron -a "name='restart httpd' state=absent"
3.8 Ansible synchronize模块实战
Ansible synchronize模块主要用于目录、文件同步,主要基于rsync命令工具同步目录和文件,synchronize模块使用详解如下:
·compress:开启压缩,默认为开启。
·archive:是否采用归档模式同步,保证源和目标文件属性一致。
·checksum:是否效验。
·dirs:以非递归的方式传输目录。
·links:同步链接文件。
·recursive:是否递归yes/no。
·rsync_opts:使用rsync的参数。
·copy_links:同步的时候是否复制链接。
·delete:删除源中没有而目标存在的文件。
·src:源目录及文件。
·dest:目标目录及文件。
·dest_port:目标接受的端口。
·rsync_path:服务的路径,指定rsync命令来在远程服务器上运行。
·rsync_timeout:指定rsync操作的IP超时时间。
·set_remote_user:设置远程用户名。
·--exclude=.log:忽略同步.log结尾的文件。
·mode:同步的模式,rsync同步的方式push、pull,默认都是推送push。
Ansible synchronize模块企业常用案例如下。
(1)Ansible synchronize模块操作,src为源目录,dest为目标目录,代码如下
[root@ansible ~]# ansible webserver -m synchronize -a "src=/opt/ dest=/opt"
3.9 Ansible shell模块实战
Ansible shell模块主要用于远程客户端上执行各种shell命令或者运行脚本,远程执行命令通过/bin/sh环境来执行,支持比command更多的指令,shell模块使用详解如下:
·Chdir:执行命令前,切换到目录。
·Creates:当该文件存在时,则不执行该步骤。
·Executable:换用shell环境执行命令。
·Free_form:需要执行的脚本。
·Removes:当该文件不存在时,则不执行该步骤。
·Warn:如果在ansible.cfg中存在告警,如果设定了False,不会警告此行。
Ansible shell模块企业常用案例如下。
(1)Ansible shell模块操作,-m shell指定模块为shell,远程执行命令,代码如下
[root@ansible ~]# ansible webserver -m shell -a "head -2 /etc/passwd"
(2),Ansible shell模块操作,远程执行创建目录命令,执行之前切换在/tmp目录,屏蔽警告信息,代码如下
[root@ansible ~]# ansible webserver -m shell -a "mkdir abc chdir=/tmp state=directory warn=no"
(3)Ansible shell模块操作,-m shell指定模块为shell,远程执行shell脚本。并把执行结果追加至客户端服务器/tmp/var.log文件,代码如下
编写一个脚本
[root@ansible ~]# ansible webserver -m copy -a "src=a.sh dest=/tmp/"
[root@ansible ~]# ansible webserver -m shell -a "/bin/sh /tmp/a.sh >>/tmp/var.log"
4.0 Ansible service模块实战
Ansible service模块主要用于远程客户端各种服务管理,包括启动、停止、重启、重新加载等,service模块使用详解如下:
·enabled:是否开机启动服务。
·name:服务名称。
·runlevel:服务启动级别。
·arguments:服务命令行参数传递。
·state:服务操作状态,状态包括started、stopped、restarted、reloaded。
Ansible service模块企业常用案例如下。
(1)Ansible service模块操作,远程重启httpd服务,代码如下
[root@ansible ~]# ansible webserver -m service -a "name=httpd state=restarted"
4,Ansible PlayBook应用
如上使用Ad-hoc方式点对点命令执行,可以管理远程主机,如果服务器数量很多,配置信息比较多,还可以利用Ansible PlayBook编写剧本,从而以更加简便的方式实现任务处理的自动化与流程化。
PlayBook是由一个或多个“play”组成的列表,play的主要功能是为Ansible中的task定义好的角色,指定剧本对应的服务器组。
从根本上说,task是一个任务,task调用Ansible各种模块module,将多个paly组织在一个PlayBook剧本中,然后组成一个非常完整的流程控制集合。
基于Ansible PlayBook还可以收集命令、创建任务集,这样能够大大降低管理工作的复杂程度,PlayBook采用YAML语法结构,易于阅读,方便配置。
YAML(yet another markup language)是一种直观的能够被电脑识别的数据序列化格式,是一个容易阅读,容易和脚本语言交互,用来表达资料序列的编程语言。它参考了其他多种语言,包括XML、C语言、Python、Perl以及电子邮件格式RFC2822,是类似于标准通用标记语言的子集XML的数据描述语言,但语法比XML简单很多。
YAML使用空白字符和分行来分隔资料,适合用grep、Python、Perl、Ruby操作。
(1)YAML语言特性如下:
·可读性强;
·和脚本语言的交互性好;
·使用实现语言的数据类型;
·一致的信息模型;
·易于实现;
·可以基于流来处理;
可扩展性强。
(2)PlayBooks组件包括内容如下:
·target:定义PlayBook的远程主机组。
·variable:定义PlayBook使用的变量。
·task:定义远程主机上执行的任务列表。
·handler:定义task执行完成以后需要调用的任务,例如配置文件被改动,则启动handler任务重启相关联的服务。
(3)target常用参数详解如下:
·hosts:定义远程主机组。
·user:执行该任务的用户。
remote_user: 执行该任务的用户。
·sudo:设置为yes的时候,执行任务的时候使用root权限。
·sudo_user:指定sudo普通用户。
·connection:默认基于SSH连接客户端。
·gather_facks:获取远程主机facts基础信息。
(4)variable常用参数详解如下:
·vars:定义格式,变量名:变量值。
·vars_files:指定变量文件。
·vars_prompt:用户交互模式自定义变量。
·setup:模块获取远程主机的值。
(5)task常用参数详解如下:
·name:任务显示名称也即屏幕显示信息。
·action:定义执行的动作。
·copy:复制本地文件到远程主机。
·template:复制本地文件到远程主机,可以引用本地变量。
·service:定义服务的状态。
ansible会监控changed的状态,如果changed=1,则表示关注的状态发生了改变,如果changed=0,则表示本次任务没有执行,要么执行了没有影响。
ansible提供了notify指令和handlers功能。如果某个task中定义了notify指令,当ansible在监控到该任务changed=1时,会触发该notify指定所定义的handler,然后去执行handler。所谓handler,其实就是task,无论在写法上还是作用上它和task没有区别,唯一区别在于handler时被触发而被动执行的,不向task一样会按照流程正常执行。
4.1 playbook基本语法
执行playbook语法
anible-playbook deploy.yml
查看输出细节
ansible-playbook playbook.yml --verbose
查看该脚本影响那些hosts
ansible-playbook playbook.yml --list-hosts
4.2 完整的playbook脚本示例:
最基本的playbook脚本分为三个部分
1,在什么机器以什么身份执行: host users 。。。
2,执行的任务都是什么: tasks
3,善后的任务有那些: handlers
Ansible PlayBook案例演示如下
4.3 远程主机安装apache服务,PlayBook代码如下
a.创建 apacheinstall.yaml文件
b.编写内容
[root@ansible ~]# mkdir yml #创建一个目录单独存放yml文件
[root@ansible ~]# cd yml/
[root@ansible yml]# vim apacheinstall.yml
c,执行查看结果
4.4 远程主机卸载apache服务,代码如下:
4.5 远程安装apche服务,配置网页文件内容为hello ansible,并启动服务,代码如下:
首先准备首页文件index.html
[root@ansible yml]# echo "hello ansible" > index.html
编写palybook文件,并执行,去webserver端查看,可以发现服务被启动,网页内容为hello ansible
4.6 主机与用户
hosts为主机的ip,或者主机组名,或者关键词all
user 在远程以哪个用户身份执行
4.7 执行的任务(task)
task是从上到下顺序执行,如果中间发生错误,那么整个playbook会终止,可以修改文件后,在从新执行。
每一个task的module的一次调用,使用不同的参数和变量而已。
每一个task最好有name属性,这个是供人读的,没有实际的操作,然后在命令行里面输出,提示用户执行情况。
语法:
参数的不同写法
task的执行状态
更多ansible详细介绍:http://getansible.com/mulu