目录
第一章 前提条件
1.1创建ssh密钥对
1.2分发公钥文件
1.3编写脚本
1.4端口被更改
第二章 安装测试
2.1 安装配置
2.2 常用模块说明
2.3 command模块
2.4 shell模块
2.5 script模块
2.6 file模块
2.7 yum模块
2.8 crond模块
第三章 编写ansible剧本

 
 

简介:

ansible是一个基于Python开发的自动化运维工具,并行安装执行脚本程序
服务端:不需要启动任何服务,默认不需要任何配置
客户端:不需要安装任何服务,因为通过服务端的ssh管理,需要修改成被管理
authorized_keys: 这个文件时秘钥文件

 

第一章、前提条件

基于ssh秘钥方式建立远程连接,直接从第三步操作即可
1、ssh密钥对创建(管理主机),需要两步免交互,
[root@Centos-7 ~]# >/root/.ssh/known_hosts #清空连接的文件
Ansible自动化_第1张图片

如上图,需要免交互两步操作
1、-f /root/.ssh/id_rsa 解决:不要问我,直接放这里即可
2、-N “” 或者-P”” 解决:密码为空

[root@ansible ~]# ssh-keygen -f /root/.ssh/id_rsa -N ""     #免密创建密钥对

2、分发公钥文件(管理主机),需要免交互式分发
1、sshpass解决免密码登录
2、-o StrictHostKeyChecking=no #不要问我了,都可以,解决yes/no问题

[root@ansible ~]# yum -y install sshpass    #安装sshpass,实现免密码登录
[root@ansible ~]# sshpass -p123123 ssh-copy-id  -o StrictHostKeyChecking=no [email protected]        #不要加双引号

3、编写脚本

[root@ansible ~]# mkdir /script
[root@ansible ~]# vim /script/keygen-sshpass.sh   #编写自动创建秘钥和分发脚本
#!/bin/bash
#Author:quss
#Time:2020-6
rm -f /root/.ssh/id_dsa*
ssh-keygen -f /root/.ssh/id_rsa -N "" 

for ip in 31 41 7
do
sshpass -p123123 ssh-copy-id  -o StrictHostKeyChecking=no [email protected].$ip
Done
[root@ansible ~]# vim /script/check.sh       #编写批量检查脚本
#!/bin/bash
if [ $# -ne 1 ]
then
    echo "请输入一个参数"
    exit 1
fi
for ip in 2
do
    echo ===== info 10.14.21.$ip======
    ssh 10.14.21.$ip  $1
    echo ""
Done
[root@ansible ~]# bash /script/check.sh     #必须输入一个参数
请输入一个参数
[root@ansible ~]# bash /script/check.sh hostname     #检查
===== info 10.14.21.2======
TEST02

4、端口号不是22的情况

[root@ansible ~]# sshpass -pP@ssw0rd12! ssh-copy-id  -o StrictHostKeyChecking=no [email protected] -p1231     #最后增加一个端口号即可

二、安装测试

1、安装配置ansible

[root@ansible ~]# yum -y install ansible         #服务端 需要epel源
[root@ansible ~]# rpm -qa|grep ansible
ansible-2.9.9-1.el7.noarch
#如果客户端开启了selinux,安装这个就行, 服务端不需要安装
[root@ansible ~]#yum -y install  libselinux-python  

[root@ansible ~]# cd /etc/ansible/   
[root@ansible ansible]# vim ansible.cfg    #配置文件一般不做改动
[root@ansible ansible]# vim hosts
[quss]       #分组、销售的、运维的等等
10.14.21.30 ansible_user=root ansible_password=123123
10.14.21.31 ansible_user=root ansible_password=123123
#以上情况是没有分发秘钥时,基于口令进行批量管理
[ops]
10.14.21.2
[root@ansible ansible]# ansible ops -m command -a "hostname"  # 指定组名、模块、命令
#如果hosts文件只写用户名,不写密码,实现交互式输入也行。
[root@ansible ansible]# ansible 10.14.21.21 -m command -a "hostname" -k #交互式输入密码
SSH password: 

2、常用模块说明

-m 指定响应模块
-a 利用模块中某些参数功能
command模块
#https://docs.ansible.com/ansible/latest/modules/modules_by_category.html   #官方文档所有模块
[root@ansible ansible]# ansible-doc -l|wc -l    #ansible所有的模块
3387

chdir:先切换到这个目录,再执行操作。
[root@ansible ansible]# ansible 10.14.21.2 -m command -a "chdir=/tmp/ pwd"
10.14.21.2 | CHANGED | rc=0 >>
/tmp

create:类似判断,当存在时,后面的命令跳过就不运行
[root@ansible ansible]# ansible 10.14.21.2 -m command -a "creates=/etc/hosts hostname"
10.14.21.2 | SUCCESS | rc=0 >>
skipped, since /etc/hosts exists

removes:存在就运行,和create正好相反
free_form:表示必须要有一个linux合法命令,如ls 等
shell模块:比command更全,是个万能模块,command不能写特殊符号< >| ; 等
[root@ansible ansible]# ansible 10.14.21.2 -m shell -a "ls;pwd"   #运行多个命令
chdir
create
removes
free_form
script模块,shell也可以执行script但是不如script好用。执行本地脚本,操作到远程主机
Shell执行脚本时,先把脚本推送到远程主机,再赋予执行权限。
[root@ansible ansible]# ansible 10.14.21.2 -m shell -a "rpm -qa keepalived"
[WARNING]: Consider using the yum,    #粉色,建议用yum模块更好用
[root@ansible ansible]# vim /script/yum.sh   #创建脚本
#!/bin/bash
yum -y install keepalived
[root@ansible ansible]# ansible 10.14.21.2 -m script -a "/scripts/yum.sh"  #用scripts
总结ansible颜色信息:
绿色:查看远程主机信息,不会对远程主机系统做任何修改
红色:执行操作出现异常错误
黄色:对远程主机系统进行修改操作
粉色:警告或者忠告信息

3、file 文件模块
Copy复制模块,

[root@ansible ansible]# touch /tmp/file01.txt
[root@ansible ansible]# ansible 10.14.21.2 -m copy -a "src=/tmp/file01.txt dest=/tmp/"
[root@ansible ansible]# ansible 10.14.21.2 -m shell -a "ls -l /tmp/"      #检查
backup模块
[root@ansible ansible]# echo 123123 >/tmp/file01.txt    # 本地文件增加内容,再次推送
[root@ansible ansible]# ansible 10.14.21.2 -m copy -a "src=/tmp/file01.txt dest=/tmp/"
[root@ansible ansible]# ansible 10.14.21.2 -m shell -a "cat /tmp/file01.txt"  #发现被覆盖掉
10.14.21.2 | CHANGED | rc=0 >>
123123
[root@ansible ansible]# ansible 10.14.21.2 -m copy -a "src=/tmp/file01.txt dest=/tmp/ backup=yes"    # yes为备份
[root@TEST02 ~]# cd /tmp         #查看被管理主机
-rw-r--r--  1 root   root   7 Jun 20 12:45 file01.txt.21511.2020-06-20@12:48:29~
参数:owner---设置复制后的文件属主权限
参数:group---设置复制后的文件属组权限
参数:mode---设置复制后的文件权限(600 755)
参数:state---用于指定创建目录或文件:touch、
[root@ansible ansible]# ansible 10.14.21.2 -m file -a "dest=/tmp/file01.txt owner=elk group=elk mode=600"        #修改属主、属组、权限信息
[root@TEST02 tmp]# ll file01.txt                    #检查权限
-rw------- 1 elk elk 7 Jun 20 12:48 file01.txt
创建文件
[root@ansible ansible]# ansible 10.14.21.2 -m file -a "dest=/tmp/file01.txt state=touch" 
创建目录
[root@ansible ansible]# ansible 10.14.21.2 -m file -a "dest=/tmp/file01 state=directory"

4、yum模块:并行安装
name:执行要安装软件的名称,以及软件的版本,如安装则提示
state:installed安装 absent(卸载)
list:指定软件名称,查看软件是否可以安装,以及是否已经安装过了

[root@ansible ansible]# ansible 10.14.21.2 -m yum -a "name=iftop state=installed"  #安装
[root@ansible ansible]# ansible 10.14.21.2 -m yum -a "list=iftop"     # 查看 = rpm -qa
"yumstate": "available"  #可安装
"yumstate": "installed"  #已安装

5、service---管理服务状态模块
name: 指定要管理的服务名称(管理的服务一定在chkconfig中可以看到)
state:stopped started restarted reloaded
enabled:yes表示服务开机自启动 no表示服务开机不要自动启动

[root@ansible ansible]# ansible 10.14.21.2 -m service -a "name=firewalld state=started enabled=no"       #服务名字、开启/关闭、是否开机自启。
[root@TEST02 tmp]# systemctl status firewalld    #在客户端检查

6、crond定时任务

[root@ansible ~]# ansible 10.14.21.2 -m cron -a "minute=0 hour=0 day=* month=* weekday=* job='/bin/sh/ /scripts/test.sh &>/dev/null'"       #完整的定时任务
[root@ansible ~]# ansible 10.14.21.2 -m cron -a "minute=0 hour=0 job='/bin/sh/ /scripts/test.sh &>/dev/null'"       # 默认带*的可以省略
#以上如果客户端有定时任务,则会重复增加
[root@ansible ~]# ansible 10.14.21.2 -m cron -a "name=quss minute=0 hour=0 day=* month=* weekday=* job='/bin/sh/ /scripts/test.sh &>/dev/null'"   #增加一个name即可避免重复创建
[root@ansible ~]# ansible 10.14.21.2 -m cron -a "name=quss  state=absent"  #删除定时任务 
[root@ansible ~]# ansible 10.14.21.2 -m cron -a "name=quss minute=0 hour=0 day=* month=* weekday=* job='/bin/sh/ /scripts/test.sh &>/dev/null' disabled=yes" #注释定时任务必须有job 

三、编写ansible剧本。

[root@ansible ~]# mkdir -p /etc/ansible/ansible-playbook
[root@ansible ~]# vim /etc/ansible/ansible-playbook/test.yaml   # 编写剧本

Ansible自动化_第2张图片

[root@ansible ~]# ansible-play  -C         #模拟执行执行剧本
[root@ansible ~]# ansible-play /etc/ansible/ansible-playbook/test.yaml  #执行剧本