一、ansible简介
运维工具种类众多,按其有无agent端可分为两类,agent类有puppet,func等,agentless类有ansible,fabric;agentless类无agent端,是基于ssh实现;可以说两类工具各有优缺点。
Ansible是一个强大的自动化运维管理工具,基于Python语言实现,由Jinja、Paramiko和PyYAML三个关键模块构建,可用于自动化部署应用、配置、编排task(持续交付、无宕机更新等),ansible是模块化的,调用特定的模块以完成特定的任务,支持自定义模块;同时部署简单,可主从,支持playbook,具有幂等性。
ansible架构图
ansible各组件说明
- Ansible:核心程序
- Host Inventory:记录了每一个由Ansible管理的主机信息,信息包括ssh端口,root帐号密码,ip地址等等。可以是静态的或者是使用Cobbler和AWS EC2的外部inventory脚本
- Playbooks:Playbooks 是 Ansible的配置,部署,编排语言.他们可以被描述为一个需要希望远程主机执行命令的方案,或者一组IT程序运行的命令集合.如果 Ansible 模块你是工作室中的工具,那么 playbooks 就是你设置的方案计划.
- Custom Modules:自定义模块
- Core Modules:Ansible执行任何管理任务都不是由Ansible自己完成,而是由核心模块完成;Ansible管理主机之前,先调用核心模块,然后指明Host Inventory中的主机,就可以完成管理主机
- Connection Plugins:连接插件,Ansible和Host通信使用
二、ansible部署
1、ansible运行前提-公钥推送
#ssh互免密:将管理端的公钥发送到所有被管理端
ssh-keygen -t rsa
ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
ssh 192.168.92.11 ‘ifconfig’
2、安装ansible
ansible已经被收录进epel源,直接yum安装即可
yum install ansible -y
3、配置文件
ansible的配置文件主要是 /etc/ansible/ansible.cfg和/etc/ansible/hosts,ansible.cfg是ansible的配置文件,hosts是被管理的主机。
在hosts中加入被管理的主机组
[test]
192.168.92.11
三、ansible常用模块
1、ping:测试主机连通性,回复pong表示成功
ansible all -m ping
2、user与group:创建用户与组,创建用户需在设置密码
常用参数:
home:指定用户的家目录,需要与createhome配合使用。
groups:指定用户的属组。
uid:指定uid。
gid:指定gid
password:指定用户的密码。
name:指定用户名。
createhome:是否创建家目录 yes|no。
system:是否为系统用户。
remove:当state=absent时,remove=yes则表示连同家目录一起删除,等价于userdel -r。
state:是创建还是删除。(present,absent)
shell:指定用户的shell环境。
generate_ssh_key:是否为相关用户生成SSH密钥。 这不会覆盖现有的SSH密钥。
ssh_key_bits:可选择指定要创建的SSH密钥中的位数。
ssh_key_passphrase:设置SSH密钥的密码。 如果没有提供密码,SSH密钥将默认没有密码。
ssh_key_file:指定SSH密钥文件名(可选)。 如果这是一个相对的文件名,那么它将是相对于用户的主目录。
ssh_key_type:指定要生成的SSH密钥的类型(可选)。 可用的SSH密钥类型将取决于目标主机上的实现。
例1:创建redhat用户
ansible all -m user -a 'name=redhat state=present'
例2:为创建的用户设置密码
ansible all -m shell -a 'echo redhat|passwd --stdin redhat'
例2:删除用户
ansible all -m user -a 'name=redhat state=absent'
3、cron:创建删除修改计划任务(使用name识别计划任务)
常用参数:
minute:指定计划任务中的分钟
hour:指定计划任务中的小时
day:指定计划任务中的天
month:指定计划任务中的月
weekday:指定计划任务中的周
special_time:计划任务的时间设定格式为 @reboot 或者@hourly。@reboot 表示重启时执行,@hourly 表示每小时执行一次,相当于设置成”0 0 * * *” ,这种@开头的时间设定格式则需要使用 special_time 参数进行设置,special_time 参数的可用值有 reboot(重启后)、yearly(每年)、annually(每年,与yearly相同)、monthly(每月)、weekly(每周)、daily(每天)、hourly(每时),在未设置时间单位时special_time默认每秒执行,所以使用此参数需要设置好时间单位
user:指定当前计划任务属于哪个用户
job:指定计划任务需要执行的命令
name:指定计划任务的名称,名称具有唯一性,创建删除修改操作都依靠名称来唯一标识
state:再根据名称删除计划任务时,将state的值设置为absent
disabled:根据名称关闭计划任务,需要指定任务的名称(name),时间(hour…)以及命令(job)
backup:如果设置此参数为yes时,那么当修改或删除对应计划任务时,会先备份在执行相应操作,cron 模块会在远程主机的 /tmp 目录下创建备份文件,以 crontab 开头并且随机加入一些字符,具体的备份文件名称会在返回信息的 backup_file 字段中看到,推荐将此此参数设置为 yes。
例1:每隔10分钟更新下时间
ansible all -m cron -a 'name="sync time for ntpserver" minute="*/10" job="/sbin/ntpdata 192.168.0.1 &> /dev/null"'
例2:删除任务
ansible all -m cron -a 'name="sync time for ntpserver" state=absent'
4、copy:文件复制或文件推送模块
常用参数:
src:被复制到远程主机的本地对象文件或者文件夹,可以是绝对路径,也可以是相对路径。
dest:被复制到远程主机的本地对象文件或者文件夹
mode:复制对象的设定权限
backup:在文件存在的时候可以选择覆盖之前,将源文件备份.设定值:yes/no 缺省为yes
force:是否强制覆盖.设定值:yes/no 缺省为no
owner:修改被复制到远程主机的本地对象文件或者文件夹的属主
group:修改被复制到远程主机的本地对象文件或者文件夹的属组
例1:复制文件到远程主机
ansible all -m copy -a 'src=/etc/fstab dest=/tmp/fstab.tmp mode=600'
5、file:设置文件属性
常用参数:
path:必须参数,用于指定要操作的文件或目录,在之前版本的ansible中,使用dest参数或者name参数指定要操作的文件或目录,为了兼容之前的版本,使用dest或name也可以
src:当state设置为link或者hard时,表示我们想要创建一个软链或者硬链,所以,我们必须指明软链或硬链链接的哪个文件,通过src参数即可指定链接源。
force:当state设置为link,force设置为yes时,表示强制创建链接文件;有三种情况分别是:
情况一:当要创建的链接文件指向的源文件并不存在时,使用此参数,可以先强制创建出链接文件。情况二:当要创建链接文件的目录中已经存在与链接文件同名的文件时,将force设置为yes,会将同名文件覆盖为链接文件,相当于删除同名文件,创建链接文件。情况三:当要创建链接文件的目录中已经存在与链接文件同名的文件,并且链接文件指向的源文件也不存在,这时会强制替换同名文件为链接文件。
owner:指定被操作文件的属主,属主必须存在,否则报错
group:指定被操作文件的属组,属组必须存在,否则报错
mode:设定被操作文件的权限
recurse:操作目录时,recurse设置为yes,可以递归目录中文件的属性
state:state设置为directory时,与path结合就可以操作目录,state设置为touch时,可以操作文件,state设置为link时,可以创建软连接,将state创建为hard时,可以创建硬链接,将state创建为absent时,删除目标。
例1:创建目录
ansible all -m file -a 'path=/tmp/testdir state=directory'
例2:创建文件
ansible all -m file -a 'path=/tmp/testfile state=touch mode=600'
例3:创建软链
ansible all -m file -a 'path=/tmp/testlink state=link src=/etc/fstab'
6、service:管理远程主机的服务,想要管理远程主机中的某个服务,那么这个服务必须能被 BSD init, OpenRC, SysV, Solaris SMF, systemd, upstart 中的任意一种所管理,否则 service 模块也无法管理远程主机的对应服务。
常用参数:
name:指定需要管理的服务
state:state的值有started、stopped、restarted、reloaded,用于指定服务的状态
enabled:指定是否将服务开机启动
例1:开启httpd服务并开机启动
ansible all -m service -a 'name=httpd state=started enabled=yes'
例2:关闭httpd服务并取消开机启动
ansible all -m service -a 'name=httpd state=stopped enabled=no'
7、yum:管理红帽系列远程主机的程序包,前提是远程主机配置好yum源
常用参数:
conf_file:设定远程yum执行时所依赖的yum配置文件
disable_gpg_check:在安装包前检查包,只会影响state参数为present或者latest的时候
disablerepo:不启用某个源
enablerepo:启用某个源
name:要进行操作的软件包的名字,默认最新的程序包,指明要安装的程序包,可以带上版本号,也可以传递一个url或者一个本地的rpm包的路径
state:state的值有present,installed,removed,absent,latest,默认是present或installed,都表示安装;absent和removed表示卸载,latest表示安装最新版本
例1:安装nginx
ansible all -m yum -a 'name=nginx state=latest'
8、shell:在被管理主机上执行命令,与command不同的是,shell在远程主机执行命令时,会用远程主机的/bin/bash来处理
常用参数:
free_from:指定需要在远程主机上执行的命令
chdir:指定一个目录,在执行命令时,先cd到chdir指定的目录
creates:当指定的文件存在时,不执行命令
removes:指定的文件不存在时,跳过执行命令步骤
warn:如果执行的命令报错,warn值为false时,忽略报错信息
executable:更改用于执行命令的shell,,默认为bash,要修改必须指定绝对路径
例1:为创建的用户设置密码
ansible all -m shell -a 'echo redhat|passwd --stdin redhat'
9、script:将本地脚本传输到远程节点后运行
常用参数:
free_from:指定需要在远程主机上执行的命令
chdir:指定一个目录,在执行命令时,先cd到chdir指定的目录
creates:当指定的文件存在时,不执行命令
removes:指定的文件不存在时,跳过执行命令步骤
executable:更改用于执行命令的shell,,默认为bash,要修改必须指定绝对路径
例1:执行脚本
ansible all -m script -a '/root/test.sh'
10、setup:从远程主机收集facts
每个被管理节点在接收并运行管理命令之前,会将自己主机相关信息,如操作系统版本,IP地址等报告给远程的ansible主机
ansible all -m setup
获取到的常用数据:
ansible_all_ipv4_addresses:仅显示ipv4的信息
ansible_devices:仅显示磁盘设备信息
ansible_distribution:显示是什么系统,例:centos,suse等
ansible_distribution_major_version:显示是系统主版本
ansible_distribution_version:仅显示系统版本
ansible_machine:显示系统类型,例:32位,还是64位
ansible_eth0:仅显示eth0的信息
ansible_hostname:仅显示主机名
ansible_kernel:仅显示内核版本
ansible_lvm:显示lvm相关信息
ansible_memtotal_mb:显示系统总内存
ansible_memfree_mb:显示可用系统内存
ansible_memory_mb:详细显示内存情况
ansible_swaptotal_mb:显示总的swap内存
ansible_swapfree_mb:显示swap内存的可用内存
ansible_mounts:显示系统磁盘挂载情况
ansible_processor:显示cpu个数(具体显示每个cpu的型号)
ansible_processor_vcpus:显示cpu个数(只显示总的个数)
ansible_python_version:显示python版本
11、command:命令模块,默认模块,用于在远程执行命令
例1:取时间
ansible all -a 'data'