日常博客编辑工~
gihub开源地址
https://github.com/search?q=ansible
ansible部署实践
准备好虚拟机:
实验环境:我这里准备四台虚拟机,centos6、7、8各一台作为被管理机器,还有一台centos7作为管理机器,配置在同一个局域网内,设置好静态ip,关闭防火墙跟selinux~
远程软件用的MobaXterm(汉化版),感觉一般般,Xshell用的比较顺手~
ansible安装:(centos系统)
先准备ansible管理机器(老板)
1、这里选择用yumm自动化安装,请自行提前准备好阿里云yum,epel源
yum install epel-release -y && yum install ansible libselinux-python -y
2、检查ansible安装情况,查询配置文件和可执行命令
rpm -ql ansible | grep -E '^/etc|^/usr/bin'
3、检查ansible版本
[root@absible ~]# ansible --version
ansible 2.9.27
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Oct 14 2020, 14:45:30) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]
再准备ansible被管理机器(员工)
yum install epel-release libselinux-python -y #每台被管理机器都装
vim /etc/ansible/hosts
[root@absible ~]# ansible xuyuhan -m command -a "cat /etc/redhat-release" -k -u root
SSH password:
192.168.230.101 | CHANGED | rc=0 >>
CentOS release 6.10 (Final)
192.168.230.108 | CHANGED | rc=0 >>
CentOS Linux release 7.9.2009 (Core)
192.168.230.110 | CHANGED | rc=0 >>
CentOS Linux release 8.5.2111
未设置免密连接出现报错解决:
vi /etc/ansible/ansible.cfg
[defaults]
forks = 8 #执行时并发数
host_key_checking = False #不检测host key
1、在控制机器上创建ssh密钥对
ssh-keygen -f ~/.ssh/id_rsa -P "" > /dev/null 2>&1
2、检查生成的公私钥文件
ls ~/.ssh/
id_rsa id_rsa.pub known_hosts sshpass.sh
3、编写公钥分发脚本
#!/bin/bash
rm -rf ~/.ssh/id_rsa*
ssh-keygen -f ~/.ssh/id_rsa -P "" > /dev/null 2>&1
SSH_Pass=xuyuhan #ssh密码根据实际情况更改
Key_Path=~/.ssh/id_rsa.pub
for ip in 101 108 110 #ip根据实际情况更改
do
sshpass -p$SSH_Pass ssh-copy-id -i $Key_Path "-o StrictHostKeyChecking=no" 192.168.230.$ip # #ip根据实际情况更改
done
#非交互式分发公钥命令需要用sshpass指定密码,通过-o StrictHostKeyChecking=no #跳过ssh连接确认信息
4、执行过脚本后再连接被控制机器就无须输入账密进行远程管理了
[root@absible ~]# ansible xuyuhan -m command -a "uname -a"
192.168.230.101 | CHANGED | rc=0 >>
Linux controled 2.6.32-754.35.1.el6.x86_64 #1 SMP Sat Nov 7 12:42:14 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
192.168.230.108 | CHANGED | rc=0 >>
Linux controled 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
192.168.230.110 | CHANGED | rc=0 >>
Linux controled 4.18.0-348.el8.x86_64 #1 SMP Tue Oct 19 15:14:17 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
[root@absible ~]#
ansible-doc命令
常用模块应用
ping模块
用以测试服务器是否连通~
command模块
1、chdir参数
先客户端机器先切换到 /root 目录下,再打印pwd当前目录
2、creates参数
该参数用于判断文件夹是否存在,存在则跳过,不存在则执行
3、removes参数
该参数用于判断文件夹是否存在,与creates效果相反,存在则执行,不存在跳过
4、warn参数
是否提供告警信息
shell模块
作用:在远程机器上执行复杂的命令(功能与command相似,但可使用正则表达式*、$等特殊符号)
使用案例:
1、 批量查询进程信息
先在被控机器打开vim进程
2、批量创建写入文件信息
3、批量执行脚本(脚本文件需存在于本地)
ansible xuyuhan -m shell -a "mkdir -p /server/myscripts/;echo 'hostname' > /server/myscripts/hostname.sh;chmod +x /server/myscripts/hostname.sh;bash /server/myscripts/hostname.sh warn=False"
script模块
功能:可将管理机器本地脚本远程传输到被管理机器上执行,既只需要在管理机器本地创建脚本即可~
应用案例:
1、远程执行脚本
[root@absible ~]# echo -e "pwd\nhostname" > /root/local_hostname.sh #在管理节点上创建脚本
[root@absible ~]# cat local_hostname.sh #查看脚本内容
pwd
hostname
[root@absible ~]# chmod +x local_hostname.sh #执行授权
[root@absible ~]# ls
anaconda-ks.cfg danwangka-ens33.sh local_hostname.sh
[root@absible ~]# ansible xuyuhan -m script -a "local_hostname.sh" #远程批量执行脚本,且在客户端上不需要存在该脚本
copy模块
应用案例:
1、复制管理机器文件数据到被管理主机
先创建远程copy需要的用户、用户组~
[root@absible ~]# ansible xuyuhan -m shell -a "useradd learn_ansible2"
192.168.230.101 | CHANGED | rc=0 >>
192.168.230.108 | CHANGED | rc=0 >>
192.168.230.110 | CHANGED | rc=0 >>
[root@absible ~]# ansible xuyuhan -m shell -a "id learn_ansible2"
192.168.230.101 | CHANGED | rc=0 >>
uid=500(learn_ansible2) gid=500(learn_ansible2) 组=500(learn_ansible2)
192.168.230.108 | CHANGED | rc=0 >>
uid=1000(learn_ansible2) gid=1000(learn_ansible2) 组=1000(learn_ansible2)
192.168.230.110 | CHANGED | rc=0 >>
uid=1000(learn_ansible2) gid=1000(learn_ansible2) 组=1000(learn_ansible2)
[root@absible ~]#
批量拷贝文件分发到被控主机上
[root@absible ~]# ansible xuyuhan -m copy -a "src=/etc/hosts dest=/root/copy_hosts owner=learn_ansible2 group=learn_ansible2 mode=0666"
2、远程批量复制文件,备份,追加内容
先准备好文件
[root@absible ~]# ansible xuyuhan -m shell -a "echo 今天天气真不错 > /root/day.txt"
192.168.230.101 | CHANGED | rc=0 >>
192.168.230.108 | CHANGED | rc=0 >>
192.168.230.110 | CHANGED | rc=0 >>
[root@absible ~]# ansible xuyuhan -m shell -a "cat /root/day.txt"
192.168.230.101 | CHANGED | rc=0 >>
今天天气真不错
192.168.230.108 | CHANGED | rc=0 >>
今天天气真不错
192.168.230.110 | CHANGED | rc=0 >>
今天天气真不错
[root@absible ~]#
再覆盖原有内容,并且对目标机器的源数据做一个备份~
[root@absible ~]# ansible xuyuhan -m copy -a "content='但是明天可能要下雨了' dest=/root/day.txt backup=yes"
file模块
应用案例:
1、远程批量创建文件夹,并设置权限为666
[root@absible ~]# ansible xuyuhan -m file -a "dest=/root/file_test mode=666 state=directory"
[root@absible ~]# ansible xuyuhan -a "ls -l /root/file_test" #查看刚才创建的文件夹
192.168.230.101 | CHANGED | rc=0 >>
总用量 0
192.168.230.108 | CHANGED | rc=0 >>
总用量 0
192.168.230.110 | CHANGED | rc=0 >>
总用量 0
2、远程批量生成文件
3、远程创建软连接
[root@absible ~]# ansible xuyuhan -m file -a "src=/etc/hosts dest=/root/file_hosts_link state=link" #src=源文件绝对路径 dest=软连接绝对路径
[root@absible ~]# ansible xuyuhan -a "ls -l /root/file_hosts_link"
yum模块
我这里已经提前安装了nginx,所以先来卸载
[root@absible ~]# ansible xuyuhan -m shell -a "rpm -qa nginx warn=false" #批量检查nginx是否安装了
1、批量卸载软件 nginx
[root@absible ~]# ansible xuyuhan -m yum -a "name=nginx state=absent"
2、批量安装软件nignx
[root@absible ~]# ansible xuyuhan -m yum -a "name=nginx state=installed"
3、批量打开软件服务(nginx):
[root@absible ~]# ansible xuyuhan -m shell -a "systemctl start nginx"
Centos7、8需要安装下net-tools软件~
[root@absible ~]# ansible xuyuhan -m yum -a "name=net-tools state=installed"
[root@absible ~]# ansible xuyuhan -m shell -a "netstat -tunlp | grep nginx" #
[root@absible ~]# ansible xuyuhan -m shell -a "netstat -tunlp | grep 80"
4、批量升级软件包
playbook应用(剧本)
1、playbook命令规范
2.playbook与shell脚本实现对比
3、playbook剧本组成规范
4、playbook之hosts部分
5、playbook之tasks部分
yaml语法规范
1、playbook编写规范
左边不对齐检查时报错!
这是对齐以后的校对
# install nginx yaml
- hosts: xuyuhan
- remote_user: root
tasks:
- name: Install nginx service
yum: name=nginx state=installed
- name: Copy Nignx.conf to every_server
copy: src=/root/nginx.conf
dest=/etc/nginx/ mode=0644
- name: 启动nginx服务
shell: systemctl start nginx
2、playbook执行
2.1基本执行语法
ansible-playbook nginx.yaml #可使用绝对相对路径
2.2查看剧本命令的帮助信息
ansible-playbook -h
1、编写一个nginx安装playbook