Ansible自动化
第一章 前提条件
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/.ssh/known_hosts #清空连接的文件
如上图,需要免交互两步操作
1、-f /root/.ssh/id_rsa 解决:不要问我,直接放这里即可
2、-N “” 或者-P”” 解决:密码为空
[ ~]# ssh-keygen -f /root/.ssh/id_rsa -N "" #免密创建密钥对
2、分发公钥文件(管理主机),需要免交互式分发
1、sshpass解决免密码登录
2、-o StrictHostKeyChecking=no #不要问我了,都可以,解决yes/no问题
[ ~]# yum -y install sshpass #安装sshpass,实现免密码登录 [ ~]# sshpass -p123123 ssh-copy-id -o StrictHostKeyChecking=no #不要加双引号
3、编写脚本
[ ~]# mkdir /script [ ~]# 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 $ip Done [ ~]# 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 [ ~]# bash /script/check.sh #必须输入一个参数 请输入一个参数 [ ~]# bash /script/check.sh hostname #检查 ===== info 10.14.21.2====== TEST02
4、端口号不是22的情况
[ ~]# sshpass ! ssh-copy-id -o StrictHostKeyChecking=no -p1231 #最后增加一个端口号即可
二、安装测试
1、安装配置ansible
[ ~]# yum -y install ansible #服务端 需要epel源 [ ~]# rpm -qa|grep ansible ansible-2.9.9-1.el7.noarch #如果客户端开启了selinux,安装这个就行, 服务端不需要安装 [ ~]#yum -y install libselinux-python [ ~]# cd /etc/ansible/ [ ansible]# vim ansible.cfg #配置文件一般不做改动 [ 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 [ ansible]# ansible ops -m command -a "hostname" # 指定组名、模块、命令 #如果hosts文件只写用户名,不写密码,实现交互式输入也行。 [ 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 #官方文档所有模块 [ ansible]# ansible-doc -l|wc -l #ansible所有的模块 3387 chdir:先切换到这个目录,再执行操作。 [ ansible]# ansible 10.14.21.2 -m command -a "chdir=/tmp/ pwd" 10.14.21.2 | CHANGED | rc=0 >> /tmp create:类似判断,当存在时,后面的命令跳过就不运行 [ 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不能写特殊符号< >| ; 等 [ ansible]# ansible 10.14.21.2 -m shell -a "ls;pwd" #运行多个命令 chdir create removes free_form script模块,shell也可以执行script但是不如script好用。执行本地脚本,操作到远程主机 Shell执行脚本时,先把脚本推送到远程主机,再赋予执行权限。 [ ansible]# ansible 10.14.21.2 -m shell -a "rpm -qa keepalived" [WARNING]: Consider using the yum, #粉色,建议用yum模块更好用 [ ansible]# vim /script/yum.sh #创建脚本 #!/bin/bash yum -y install keepalived [ ansible]# ansible 10.14.21.2 -m script -a "/scripts/yum.sh" #用scripts 总结ansible颜色信息: 绿色:查看远程主机信息,不会对远程主机系统做任何修改 红色:执行操作出现异常错误 黄色:对远程主机系统进行修改操作 粉色:警告或者忠告信息
3、file 文件模块
Copy复制模块,
[ ansible]# touch /tmp/file01.txt [ ansible]# ansible 10.14.21.2 -m copy -a "src=/tmp/file01.txt dest=/tmp/" [ ansible]# ansible 10.14.21.2 -m shell -a "ls -l /tmp/" #检查 backup模块 [ ansible]# echo 123123 >/tmp/file01.txt # 本地文件增加内容,再次推送 [ ansible]# ansible 10.14.21.2 -m copy -a "src=/tmp/file01.txt dest=/tmp/" [ ansible]# ansible 10.14.21.2 -m shell -a "cat /tmp/file01.txt" #发现被覆盖掉 10.14.21.2 | CHANGED | rc=0 >> 123123 [ ansible]# ansible 10.14.21.2 -m copy -a "src=/tmp/file01.txt dest=/tmp/ backup=yes" # yes为备份 [ ~]# cd /tmp #查看被管理主机 -rw-r--r-- 1 root root 7 Jun 20 12:45 :48:29~ 参数:owner---设置复制后的文件属主权限 参数:group---设置复制后的文件属组权限 参数:mode---设置复制后的文件权限(600 755) 参数:state---用于指定创建目录或文件:touch、 [ ansible]# ansible 10.14.21.2 -m file -a "dest=/tmp/file01.txt owner=elk group=elk mode=600" #修改属主、属组、权限信息 [ tmp]# ll file01.txt #检查权限 -rw------- 1 elk elk 7 Jun 20 12:48 file01.txt 创建文件 [ ansible]# ansible 10.14.21.2 -m file -a "dest=/tmp/file01.txt state=touch" 创建目录 [ ansible]# ansible 10.14.21.2 -m file -a "dest=/tmp/file01 state=directory"
4、yum模块:并行安装
name:执行要安装软件的名称,以及软件的版本,如安装则提示
state:installed安装 absent(卸载)
list:指定软件名称,查看软件是否可以安装,以及是否已经安装过了
[ ansible]# ansible 10.14.21.2 -m yum -a "name=iftop state=installed" #安装 [ 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表示服务开机不要自动启动
[ ansible]# ansible 10.14.21.2 -m service -a "name=firewalld state=started enabled=no" #服务名字、开启/关闭、是否开机自启。 [ tmp]# systemctl status firewalld #在客户端检查
6、crond定时任务
[ ~]# ansible 10.14.21.2 -m cron -a "minute=0 hour=0 day=* month=* weekday=* job=‘/bin/sh/ /scripts/test.sh &>/dev/null‘" #完整的定时任务 [ ~]# ansible 10.14.21.2 -m cron -a "minute=0 hour=0 job=‘/bin/sh/ /scripts/test.sh &>/dev/null‘" # 默认带*的可以省略 #以上如果客户端有定时任务,则会重复增加 [ ~]# 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即可避免重复创建 [ ~]# ansible 10.14.21.2 -m cron -a "name=quss state=absent" #删除定时任务 [ ~]# 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剧本。
[ ~]# mkdir -p /etc/ansible/ansible-playbook [ ~]# vim /etc/ansible/ansible-playbook/test.yaml # 编写剧本
[ ~]# ansible-play -C #模拟执行执行剧本 [ ~]# ansible-play /etc/ansible/ansible-playbook/test.yaml #执行剧本