批量操作服务器(几十台、几百台、甚至上千台),ansible就是批量操作服务器的工具
批量部署服务:比如说几十台服务器都需要安装nginx服务,不可能手工一台台安装,这时候就可以使用ansible进行批量的分发文件,批量的部署这个服务。
配置文件更新:比如多台服务器的配置文件都需要更新的时候,也可以使用ansible
代码上线:比如多台服务器需要发版代码上线,也可以使用ansible
批量创建用户、批量创建目录:比如多台服务器进行用户的创建,目录的创建等等
[root@localhost ~]# rpm -qc ansible
/etc/ansible/ansible.cfg #主配置文件
/etc/ansible/hosts #主机清单文件
#ansile的安装
#.rpm安装(一般使用yum安装)(推荐使用)
wget -O /etc/yum.repos.d/epel.repo http:mirrors.aliyun.com/repo/epel-7.repo
yum -y install ansible
#或者
yum install epel-release #依赖工具epel源
yum -y install ansible
#确认ansible的版本号
ansible --version
#模块调用测试
ansible localhost -m ping
#ansible的基本配置
vim /etc/ansible/hosts #主机清单文件
#主机清单文件解析
## blue.example.com## 192.168.100.1## 192.168.100.10
# Ex 2: A collection of hosts belonging to the 'webservers' group
## [webservers] #Webserver模块组名字[xxx]
## alpha.example.org
## beta.example.org
## 192.168.1.100 #批量的服务器IP,代表IP100和110两台服务器
## 192.168.1.110
# If you have multiple hosts following a pattern you can specify# them like this:
## www[001:006].example.com
# Ex 3: A collection of database servers in the 'dbservers' group
##[dbservers] #数据库模块组名字
##
## db01.intranet.mydomain.net
## db02.intranet.mydomain.net## 10.25.1.56 #批量的数据库,代表56和57两台服务器
## 10.25.1.57
# Here's another example of host ranges, this time there are noleading os:
## db-[99:101]-node.example.com#修改ansible的配置文件
vim /etc/ansible/ansible.cfg
host_key_checking=False #禁用每次执行ansible命令检查ssh key host,默认是注释,开启即可
log_path = /var/log/ansible.log #开启日志记录,默认注释,开启即可
[accelerate]
accelerate_port= 5099 #加速连接端口,默认注释,开启即可,也可以改变端口号,此处没改
#accelerate timeout = 30
#accelerate connect timeout = 5.0
# The daemon timeout is measured in minutes. This time is measured# from the last activity to the accelerate daemon.
#accelerate daemon timeout = 30
# If set to yes, accelerate multi key will allow multiple
# private keys to be uploaded to it, though each user must
# have access to the system via SSH to add a new key. The default
# is "no".
accelerate multi key = yes #释放,默认注释
cat /etc/ansible/ansiblecfg grep "/etc/ansible/hosts" #查看Inventory定义的被管理主机清单文件
inventory= /etc/ansible/hosts #Inventory文件主要用来填写被管理主机列表信息,默认Inventory 文件为/etc/ansible/hosts 当然也可以自定义一个文件,当执行ansible 命令时使用-i选项指定Inventory文件位置也可
#配置管理端到被管理端的免密登录,以方便ansible进行管理
#管理端机器上生成ssh密钥对,实现能无密码链接登录到被管理机器
ssh-keygen -t rsa #下面一路回车,不用输密码
ls /root/.ssh/ #查看私钥和公钥
yum -y install openssh openssh-cients openssh-server #若没有ssh命令和ssh-copy-id等时候的安装
ssh-copy-id -i /root/.ssh/id rsa.pub [email protected] #或仅IP也可(ssh [email protected] ifconfig head -3),第一次需要输入对方用户密码:123456
配置管理端到被管理端的登录另一种方式(无需免密,将密码直接写入ansible配置文件方式),以方便ansible进行管理
#被管理机器的密码也可 (不过第一次连接时需要输入yes确认,后面就不需要了)
cat /etc/ansible/hosts ssh #默认22端口时候[maya]
keeper-01 ansible_ssh_host="192.168.14.128" ansible_ssh_user="root" ansible_ssh_pass="123456"maya-001-129 ansible_ssh_host="192.168.14.129" ansible_ssh_user="root" ansible_ssh_pass="123456"
[mem]
mem1 ansible_ssh_host="192.168.14.130" ansible_ssh_user="root" ansible_ssh_pass="123456"mem2 ansible_ssh_host="192.168.14.131" ansible_ssh_user="root" ansible_ssh_pass="123456"
#如: ansible批量发送文件时,远端机器ssh的端口号不是22,而是已经改变了的22115时候的配置cat /etc/ansible/hosts #ssh端口发生改变的时候
[app-girl]
app-girl1 ansible_ssh_host="172.17.133.212" ansible_ssh_user="root" ansible_ssh_pass="b6eMWV2V00" ansible_ssh_port=21115app-girl2 ansible_ssh_host="172.17.133.213" ansible_ssh_user="root" ansible_ssh_pass="C4NMcSyBro" ansible_ssh_port=22115
ad-hoc模式或命令模式简介
ansible在命令行中执行的命令,也称为ad-hoc模式,ad-hoc模式其实就是"临时命令",执行完即结束,不会保存。
用ansible命令模式批量管理主机,对复杂的操作非常不方便,需要使用playbook剧本模式。
ansible常用ad-hoc模块命令行使用
command或shell模块,执行远程命今,管理被管理端(ad-hoc模式,其实就是临时命令,执行完即结束,不会保存)
都是批量执行命令,she更强大,什么都能于,如果需要一些管道等复杂命令的操作,则使用shell,command完成不了,shell还能执行脚本。
#执行远程命令: 以下的command也可以用shell代替
#格式:ansible 列表组名 -m command/shell -a"执行的远程命令"tansible all -m command -a "执行的远程命令" #管理所有模块下机器,执行远程机器命令
ansible test -m command -a "执行的远程命令" #管理单独某个模块组名下机器,执行远程机器命令
ansible test -m command -a "ifconfig | grep ens33" -f 50 #command执行不了,-f 50一次显示50个主机
ansible test -m shell -a "ifconfig | grep ens33" -f 50 #shell可以执行,-f 50一次显示50个主机#执行远程shell脚本
格式:ansible 列表组名 -m shell -a "执行的远程脚本"
ansible test -m shell -a "sh /root/1.sh"
copy模块,批量发送文件到被管理端或向被管理端文件写内容
例如:将管理端 (ansible机器) 上本地文件(/tmp/a.txt)批量发送给被管理端(tmp/目录)
copy模块注意: 所有被管理端需要安装: libselinux-pythor ,此处为192.168.171.129和192.168.171.130上
#批量安装
例如:ansible 列表组名 -m shell -a "yum install -y 软件名称"
ansible test -m shell -a "yum install libselinux-python -y" #默认cent7.x已经安装,若没有安装,需要先安装该包
#使用copy模块
格式:ansible 列表组名 -m copy -a "src=/tmp/a.txt dest=/tmp/"
ansible test -m copy -a "src=/tmp/a.txt dest=/tmp/" #src代表原文件路径,dest代表目的路径
service模块,启动,停止,重启,重载服务等
格式: # ansible test -m service -a "name=服务名 state=stopped enabled=yes
例子:ansible test -m service -a "name=httpd state=stopped enabled=yes"
使用详解:
name: 定义要启动服务的名称,参数即为各服务名state: 指定服务状态是停止或运行,或重载等,
参数如下:
started:启动
stopped:停止
restarted:重启reloaded:重载
enabled: 开机自启动script模块,编写脚本和执行脚本(本地编写脚本,本地运行,即可等同于在远程执行)
在本地运行模块,等同于在远程执行,不需要将脚本文件进行推送目标主机执行。
格式: ansible test -m script -a ".../本地编写的脚本.sh"
例子:
管理端:
cat /root/yum wget.shyum -y install wget
chmod +x /root/yum wget.shansible test -m script -a "/root/yum wget.sh"
所有被管理端:
wget -V #查看版本 V是version简写file模块,配置模块,远程创建目录,远程创建文件,远程做软硬链接文件
#远程创建目录:
ansible test -m file -a "path=/tmp/shi state=directory"
#远程创建文件:
ansible test -m file -a "path=/tmp/shi.txt state=touch mode=555 owner=root group=root"
#远程做软连接:
ansible test -m file -a "src=/tmp/shi.txt path=/tmp/shi.txt_link state=link"
#递归创建或更改目录权限:
ansible test -m file -a "path=/tmp/shi state=directory owner=root group=root mode=600 recurse=yes"使用详解:
path: 指定远程主机目录或文件目录
recurse: 递归授权
state: 表示对"列表组"的操作状态
参数如下:
directory: 在远端创建mull
touch: 在远端创建文件
link: link或hard表示创建链接文件
absent: 表示删除文件或目录
mode: 设置文件或目录权限
owner: 设置文件或目录属主信息group: 设置文件或目录属组信息
group模块,远程创建组
格式: ansible test -m group -a "name=要创建的组名 gid=888 state=present”
#列子:如:ansible test -m group -a "name=shi_group gid=888 state=present" #创建组shi_group,指定gid为888
使用详解:
name: 指定创建的组名
gid: 指定组的gid
state: 表示对组的操作状态,参数如下:
absent: 删除远端的组
present: 创建远端的组(默认)
#查看倒数两个用户组tail -2 /etc/group
user模块,远程创建用户
创建用户:不加密码:
ansible test -m user -a "name=shi uid=88 group=shi_group shell=/sbin/nologin create_home=no state=present"删除用户:
ansible test -m user -a "name=shi uid=88 group=shi_group shell=/sbin/nologin create_home=no state=absent"创建普通用户并设置登录密码:
echo 'mima' openssl passwd -1 -stdin #给指定的密码内容加密,注意需要加密,用户才能登录
$1$PxrOduFH$OsqImb.R6gy80gm8qlUvc0
ansible test -m user -a 'name=shi3 password="$1$PxrOduFH$OsaImb.R6ay80am8alUvc0"'
使用详解:name: 指定创建的用户名
uid: 指定用户的
gruop: 指定用户组名称
gruops: 指定附加组名称
password: 给用户添加密码
shell: 指定用户登录shell
create home: 是否创建家目录
state: 表示对用户的操作状态,参数如下:
absent: 删除远端的组present: 创建远端的组(默认)
#查看创建的用户id shi3
cron模块,远程添加定时任务 (下面:a.sh是远程机器上本地有的脚本)远程添加定时任务,未设置注释信息:
ansible test -m cron -a "minute=00 hour=01 day=* month=* weekday=* job='bin/sh /root/a.sh' state=present"
远程添加定时任务,并设置注释信息,防止定时任务重复:
ansible test -m cron -a "minute=00 hour=01 day=* month=* weekday=* name='注释信息' job='bin/sh /root/a.sh' state=present"
远程注释定时任务:
ansible test -m cron -a "minute=00 hour=01 day=* month=* weekday=* name='cron1' job='bin/sh /root/a.sh' state=present disabled=yes"
远程删除定时任务:
# ansible test -m cron -a "minute=00 hour=01 day=* month=* weekday=* name='cron1' job='bin/sh /root/a.sh' state=absent"#查看远程定时任务
crontab -l
mount模块,远程添加挂载
立刻挂载并写入/etc/fstab中:
ansible test -m mount -a "src=192.168.171.128:/data path=/opt fstype=nfs opts=defaults,noatime state=mounted"立刻卸载并清除/etc/fstab中信息:
ansible test -m mount -a "src=192.168.171.128:/data path=/opt fstype=nfs opts=defaults,noatime state=absent"
使用详情:
src: 要被挂载的原目录
path: 要挂载到的本地目录
fstype: 要挂载的文件类型
state: 挂载或卸载的状态参数如下:
present: 开机挂载,不会直接挂载设备,仅将配置写入/etc/fstab,不会马上挂载
mounted: 马上直接挂载设备,并将配置写入/etc/fstab
unmounted: 马上直接卸载设备,不会清除/etc/fstab写入的配置absent: 马上直接卸载设备,会清理/etc/fstab写入的配置
例子:管理端: 192.168.171.128
yum -y install nfs-utils #被管理的挂载端也要安装,才能挂载vim /etc/exports #配置一个共享目录允许任何人可以挂载输入:/data *(rw,no_root squash)
systemctl start nfs
ansible test -m mount -a "src=192.168.171128:/data path=/opt fstype=nfs opts=defaults,noatime state=mounted"
#查看被管理端挂载的服务
mount | grep optget_url模块,下载模块
下载模块: get_url
get_url:
url: 下载地址
dest: 下载到本地的路径;
mode: 权限;
checksum: 对资源做校验;
sha256:
md5:
例子:
管理端: 192.168.171.128ansible test -m get_url -a 'url=http://rpms.famillecollet.com/enterprise/remi-release-6.rpm dest=/tmp mode=0666'
#被管理端查看下载的文件
ls /tmp/
systemd模块,通过systemd来管理服务启停,类似systemctl start httpd
解释:
name 服务名称
state 服务状态
started 启动
stopped 停止
restarted 重启
reloaded 重载
enabled 开启自启动 | yes 启 no 不
daemon reload: yes 重载systemd整个的配置文件例子:用systemd模块启动服务并加入开机自启
管理端:192.168.171.128
ansible test -m systemd -a 'name=nginx state=started enabled=yes'
#查看刚安装的服务状态
ansible test -m command -a 'systemctl status nginx'