Ansible概述:
是一个配置管理系统(configuration management system),当下最流行的批量自动化运维工具之一.
常用的运维工具:
ssh/puppet(ruby)/ansible(无客户端,中小规模)(python)/saltstack(master-minion)(python)大规模
Ansible的作用:
批量部署,服务安装,日常备份
Ansible官方文档:
https://docs.ansible.com/ansible/latest/index.html
Ansible的特性:
无客户端软件,通过ssh远程管理
安装后不需要启动服务
依赖大量的Python模块扩展功能
配置文件:/etc/ansible/ansible.cfg
Ansible基础架构:
连接插件(connecter plugins):用来连接主机,连接被管理端
核心模块(core modules):连接主机,实现操作,依赖于具体模块来执行
自定义模块:用户自己开发的功能模块
剧本(playbook):将多个任务组合成一个剧本,由ansible自动批量执行
主机清单(host inventory):定义ansible管理的客户端主机范围
Ansible的命令格式:
ansible 主机清单名 -m 调用的模块 -a 动作命令
######################################################################################
Ansible的配置:
ansible:192.168.8.10
web:192.168.8.20
nfs:192.168.8.30
rsync:192.168.8.40
ifdown ens33;ifup ens33
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
1.安装ansible
(1)先配epel源:
epel源(扩展包):wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
linux镜像源(组包):wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
(2)安装ansible
yum -y install ansible
查看版本
ansible --version
2.配置清单
vim /etc/ansible/hosts
添加:
[web]
192.168.8.20
[nfs]
192.168.8.30
[rsync]
192.168.8.40
[benet:children]
web
nfs
rsync
保存退出
3.在ansible上配置ssh秘钥对访问
ssh-keygen -t rsa
ssh-copy-id root@192.168.8.20
ssh-copy-id root@192.168.8.30
ssh-copy-id root@192.168.8.40
########################################################################
调用常用模块
安装软件
修改配置
创建程序用户和组
创建目录,修改归属和权限
启动服务
挂载
测试
调用模块颜色显示:
翔黄色 更改成功
帽绿色 没有更改
深红色 错误
亮紫色 警告
列出所有模块
ansible-doc --list
查看ansible模块帮助 ***
ansible-doc yum
1.command #仅支持简单语法命令,但语句中不能包含管道符等复杂元素
ansible web -m command -a "hostname"
ansible web -m command -a "useradd zhangsan"
2.shell #command升级版,支持复杂语句,但不支持别名
ansible web -m shell -a "echo 123 |passwd --stdin zhangsan"
3.yum
ansible web -m yum -a "name=httpd state=installed"
注释:name 安装的软件包名,多个软件","分开
state 服务状态
installed,present 安装软件包
removed,absent 卸载软件包
latest 安装最新软件包
4.copy
ansible benet -m copy -a "src=/etc/hosts dest=/etc/hosts backup=yes"
注释:
src 源文件路径
dest 目标文件路径
backup 覆盖到目标文件前,是否提前备份
content 添加文件内容
group 指定属组
owner 指定属主
mode 指定权限
案例:在ansible上远程配置rsync服务
(1)修改rsync配置文件,并传到rsync服务器
mkdir /etc/ansible/conf
cd /etc/ansible/conf
cp /etc/rsyncd.conf ./
vim rsyncd.conf
修改为:
uid = root
gid = root
port 873
address = 192.168.8.40
hosts allow = 192.168.8.0/24
max connections = 4
pid file = /var/run/rsyncd.pid
timeout = 900
dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
[backup]
path = /backup
read only = no
auth users = rsync_backup
secrets file = /etc/rsync.password
保存退出
ansible rsync -m copy -a "src=rsyncd.conf dest=/etc/rsyncd.conf backup=yes"
(2)启动rsync服务
ansible rsync -m systemd -a "name=rsyncd state=restarted"
(3)创建目录,并赋权,更改属主属组
ansible rsync -m file -a "path=/backup owner=root group=root recurse=yes mode=777"
(4)配置rsync服务器的密码文件:
ansible rsync -m copy -a "content='rsync_backup:1' dest=/etc/rsync.password owner=root group=root mode=600"
ansible rsync -m shell -a "ls -l /etc/rsync.password"
ansible rsync -m shell -a "cat /etc/rsync.password"
(5)配置所有服务器的rsync连接密码文件
ansible benet -m copy -a "content='1' dest=/etc/server.pass owner=root group=root mode=600"
(6)测试:备份WEB的httpd.conf配置文件
ansible web -m shell -a "rsync -avz --password-file=/etc/server.pass /etc/httpd/conf/httpd.conf rsync_backup@192.168.8.40::backup"
(7)即时监控web服务器的/var/www/html/,远程同步上传rsync
mkdir /etc/ansilbe/tools
cd /etc/ansible/tools/
上传sersync目录
cd /etc/ansible/tools/sersync/
vim confxml.xml
修改第24行:
<localpath watch="/var/www/html/">
<remote ip="192.168.8.40" name="backup"/>
修改第31行:
<auth start="true" users="rsync_backup" passwordfile="/etc/server.pass"/>
保存退出
cd ..
ansible web -m copy -a "src=./sersync/ dest=/usr/local/sersync mode=755"
ansible web -m shell -a "nohup /usr/local/sersync/sersync2 -dro /usr/local/sersync/confxml.xml &"
cd ..
echo "<h1><marquee>www.httpd.conf</marquee></h1>" > index.html
ansible web -m copy -a "src=./index.html dest=/var/www/html/index.html"
验证是否上传同步成功:
ansible rsync -a "ls /backup"
5.service(或systemd)
ansible web -m service -a "name=httpd state=stopped enabled=yes"
等同于
ansible web -m shell -a "systemctl stop httpd"
注释:
name 指定服务名
state 指定服务运行状态
started 开启服务
stopped 关闭服务
reloaded 重载服务
restarted 重启服务
enalbed 是否开机自启
yes
no
6.group
在所有清单主机上创建组www,gid 666
ansible all -m group -a "name=www gid=666"
在所有清单主机删除组www
ansible all -m group -a "name=www gid=666 state=absent"
7.user
ansible all -m user -a "name=www"
ansible web -m shell -a "echo 123 |passwd --stdin www"
8.file
创建目录,并赋权,更改属主属组(recurse=yes 等同于 state=directory)
ansible rsync -m file -a "path=/cwb owner=root group=root recurse=yes mode=777"
创建文件
ansible rsync -m file -a "path=/cwb/test.txt owner=root group=root state=touch mode=777"
删除文件
ansible rsync -m file -a "path=/cwb/test.txt state=absent"
9.mount
ansible nfs -m file -a "path=/nfs owner=root group=root recurse=yes mode=777"
vim exports
添加:
/nfs 192.168.8.0/24(rw,sync,no_root_squash)
保存退出
ansible nfs -m copy -a "src=exports dest=/etc/exports"
ansible nfs -m systemd -a "name=nfs state=restarted"
ansible nfs -m systemd -a "name=rpcbind state=restarted"
挂载nfs目录到web下的/var/www/html
ansible web -m mount -a "src=192.168.8.30:/nfs path=/var/www/html fstype=nfs state=mounted"
注释:
state 挂载状态
mounted 挂载
unmounted 卸载
复制shopp-master到ansible主机/root下:
ansible nfs -m copy -a "src=/root/shopp-master/ dest=/nfs"
10.script
在ansible上编写任意测试脚本:
cat >> /root/test.sh << EOF
#!/bin/bash
rm -rf /var/run/yum.pid
yum -y install mariadb-server mariadb
systemctl start mariadb
systemctl enable mariadb
mysql -uroot -e "create database hehe;"
mysql -uroot -e "show databases;"
EOF
ansible web -m script -a "/root/test.sh"
11. Fetch:
从远程主机提取文件至主控端,copy相反,目前不支持目录,可以先打包,再提取文件
会生成每个被管理主机不同编号的目录,不会发生文件名冲突
示例:
拉取web主机的httpd.conf:
ansible web -m fetch -a "src=/etc/httpd/conf/httpd.conf dest=./"
拉不了目录,tar压缩后再拉取:
ansible all -m shell -a 'tar zcf /root/etc.tar.gz /etc'
ansible all -m fetch -a 'src=/root/etc.tar.gz dest=/root/'
12.unarchive: 解压缩
示例:
在目标主机解压缩:
ansible nfs -m shell -a "tar zcf /root/etc.tar.gz /etc"
ansible nfs -m unarchive -a "src=/root/etc.tar.gz dest=/tmp copy=no mode=0755"
把本机压缩包解压到目标主机:
tar zcf /root/boot.tar.gz /boot
ansible nfs -m unarchive -a "src=/root/boot.tar.gz dest=/tmp copy=yes mode=0755"
13.Archive:打包压缩
将远程主机目录打包
path: 指定路径
dest: 指定目标文件
format: 指定打包格式
owner: 指定所属者
mode: 设置权限
示例:
ansible all -m archive -a 'path=/etc/sysconfig dest=/root/sysconfig.tar.bz2 format=bz2 mode=0777'
14.Cron:计划任务
支持时间:minute,hour,day,month,weekday
示例:
创建任务
ansible all -m cron -a "minute=*/5 job='/usr/sbin/ntpdate ntp1.aliyun.com &>/dev/null' name=Synctime"
ansible all -m shell -a "cat /var/spool/cron/root"
删除任务
ansible all -m cron -a 'state=absent name=Synctime'
注释任务,不在生效
ansible all -m cron -a "minute=*/10 job='/usr/sbin/ntpdate ntp1.aliyun.com' name=synctime disabled=yes"
web主机定期周一到周五 23:30执行mysql.sh:
ansible web -m cron -a "minute=30 hour=23 weekday=1-5 job='/usr/bin/sh /root/mysql.sh' name=mysqlbackup"
15.setup
统计被管理主机的系统信息
示例:
ansible web -m setup
ansible web -m setup -a "filter=ansible_python_version"