服务器三台或者以上
a,主服务器:docker_t (安装Ansible)
b,被控制的服务器A:esqabc_a
c,被控制的服务器B:esqabc_b
注意,由于我的三台服务器都是国外服务器,显示与提示,相比国内会有所不同
请访问:https://blog.csdn.net/esqabc/article/details/90257590
a,创建秘钥对
[root@docker_t key]# ssh-keygen -t dsa -f /root/.ssh/id_dsa -P ""
b,分发公钥给被控制的服务器(esqabc_a和esqabc_b),请输入一下yes和密码授权一下就可以了
[root@docker_t key]# ssh-copy-id -i ~/.ssh/id_dsa.pub root@192.168.0.111
[root@docker_t key]# ssh-copy-id -i ~/.ssh/id_dsa.pub root@192.168.0.222
或者修改端口(24680)的方式分发:
[root@docker_t key]# ssh-copy-id -i ~/.ssh/id_dsa.pub -p 24680 root@192.168.0.111
[root@docker_t key]# ssh-copy-id -i ~/.ssh/id_dsa.pub -p 24680 root@192.168.0.222
c,测试远程执行命令
在主服务器中:
[root@docker_t key]# ssh 192.168.0.111 "hostname"
esqabc_a
[root@docker_t key]# ssh 4192.168.0.222 "hostname"
esqabc_b
在被控制服务器(esqabc_a):
[root@esqabc_a ~]# cat .ssh/authorized_keys
在被控制服务器(esqabc_b):
[root@esqabc_b ~]# cat .ssh/authorized_keys
root@docker_t ~# vim /etc/ansible/hosts rj-bai 192.168.0.111 192.168.0.222 注意:rj-bai 为模块名,下面是要管理的主机 ip 地址,模块名随便写
安装Ansible 控制命令:
root@docker_t ~# ansible rj-bai -m command -a “yum -y install redhat-lsb” 注意(rj-bai)是指上面添加的主机模块名
查看被控制系统版本的信息,
root@docker_t ~# ansible rj-bai -m command -a “lsb_release -a” 注意(rj-bai)是指上面添加的主机模块名
参数
-m MODULE_NAME 相对应的模块被执行,默认 command 模块,-m 后解模块名
-a MODULE_ARFS 模块信息参数,-a 后代表要执行的命令,也可以写一个 IP
只针对某一个主机执行
root@docker_t ~# ansible 192.168.1.111 -m command -a “lsb_release -a”
a,也就是批量传输文件,将控制端的文件批量传给受控端
将主机: /home/tools/jarweb-jen-ans.jar 传到受控服务器的 /home/tools/jar/ 目录下。
注意:受控服务器的目录(/home/tools/jar)必须是存在的,不然会传输不成功
[root@docker_t ~]# ansible rj-bai -m copy -a "src=/home/tools/jarweb-jen-ans.jar dest=/home/tools/jar/jarweb-jen-ans.jar"
都存在目录:/home/tools/jar/
一台存在目录:/home/tools/jar/,一台不存在目录:/home/tools/jar/
b,查看一下文件是否传输成功:
root@docker_t ~# ansible rj-bai -m command -a “ls /home/tools/jar/jarweb-jen-ans.jar”
c,其它参数
backup 在替换之前先备份 owner 指定文件归属 group 指定文件属组 mode 指定文件权限
案例:
先为被控制的服务器,添加用户,并制定 uid 及 gid
root@docker_t ~# ansible rj-bai -m command -a “useradd -u 888 rj-bai”
重新传送文件,并替换之前的(yes),知道文件归属(rj-bai),添加文件分组(rj-bai),指定文件权限(755)
[root@docker_t ~]# ansible rj-bai -m copy -a "src=/home/tools/jarweb-jen-ans.jar dest=/home/tools/jar/jarweb-jen-ans.jar backup=yes owner=rj-bai group=rj-bai mode=755"
模块分为两个:shell与script
a,shell模块,这个模块需要将要运行的脚本传到受控端才可以执行,就用上面所提到的 copy 模块完成传送
如果不会shell脚本写,请看这个地址:https://cloud.tencent.com/developer/article/1521996
注意:传送的时候脚本要加上 x 权限,否则会爆出权限拒绝
root@docker_t tools# touch test-a.sh root@docker_t tools# vi test-a.sh #!/bin/sh echo “Welcome to www.esqabcc.com” … 传输到被控制服务器 root@docker_t tools# ansible rj-bai -m copy -a “src=/home/tools/test-a.sh dest=/home/tools/test-a.sh mode=755” … 编译脚本 root@docker_t tools# ansible rj-bai -m command -a “ls -l /home/tools/test-a.sh”
…
执行脚本
root@docker_t tools# ansible rj-bai -m shell -a " /home/tools/test-a.sh"
b,script 模块
他的用法和 shell 一样,但是不能执行命令,他的优点是执行脚本不需要将脚本文件复制到远程服务器,就可以将脚本的执行过程在远程服务器上进行执行
root@docker_t tools# touch test-a.sh
root@docker_t tools# vi test-b.sh
#!/bin/sh
echo “Welcome to www.esqabcc.com”
…
执行脚本
root@docker_t tools# ansible rj-bai -m script -a “/home/tools/test-b.sh”
a,执行批量安装命令:
root@docker_t ~# ansible rj-bai -m yum -a “name=httpd state=installed”
b,查看状态命令
root@docker_t ~# ansible rj-bai -m shell -a “service httpd status”
c,查看是否安装成功:
root@docker_t ~# ansible rj-bai -m shell -a “chkconfig --list | grep httpd”
a,开启被控制服务器的httpd
root@docker_t ~# ansible rj-bai -m service -a “name=httpd state=started enabled=no”
参数说明:
name 服务名字,必须是能在 chkconfig 里面找到的
state 要执行的状态,包含 running,started,stopped,restarted,reloaded
enabled 是否可以开机启动 no 表示禁止
…
b,其它命令(删除httpd ):
root@docker_t ~# ansible rj-bai -m yum -a “name=httpd state=removed”
这个所谓的剧本其实就是类似 shell 脚本,您需要系统做什么事情,写到一个文件里执行即可,很适合批量安装服务和发布项目。
注意:
剧本的基础语法:空格,不能使用 table 键,编写剧本使用的是 yml 语法。
a,创建文件
(1)进入目录 root@docker_t ansible# cd /etc/ansible/roles/ (2)创建文件夹 root@docker_t roles# mkdir jarweb (3)进入目录 root@docker_t roles# cd jarweb/ (4)创建剧本文件:deploy-jarweb.yml root@docker_t jarweb# touch deploy-jarweb.yml (5)编辑剧本文件:deploy-jarweb.yml,如下图: root@docker_t jarweb# vi deploy-jarweb.yml
#使用主机组模块(rj-bai),
#把主机:/etc/ansible/roles/jarweb/jarweb-jen-ans.jar项目文件复制到被控制服务器:/home/tools/jar/jarweb-jen-ans.jar
#把主机:/etc/ansible/roles/jarweb/jaeweb-script.sh脚本文件复制到被控制服务器:/home/tools/jar/jaeweb-script.sh
#执行被控制服务器的脚本文件:/home/tools/jar/jaeweb-script.sh
- hosts: rj-bai
remote_user: root
tasks:
- name: copy jar
copy : src=/etc/ansible/roles/jarweb/jarweb-jen-ans.jar dest=/home/tools/jar/jarweb-jen-ans.jar
- name: copy sh
copy: src=/etc/ansible/roles/jarweb/jarweb-script.sh dest=/home/tools/jar/jarweb-script.sh
- name: shell sh
shell: sh /home/tools/jar/jarweb-script.sh
文件解释:
注释用#,
hosts:那行为那个组要执行这个剧本
remote_user:使用哪个用户
tasks:代表要做的事情,
-name:为输出提示信息,
copy:代表把主机(src)的文件复制到被控制服务器(dest)中
shell:代表执行被控制服务器的脚本
(6)创建sh脚本文件:jarweb-script.sh root@docker_t jarweb# touch jarweb-script.sh (7)编辑sh脚本文件:jaeweb-script.sh,如下图: root@docker_t jarweb# vi jarweb-script.sh
#!/bin/sh
#设置输出语言
export LANG=en_US.UTF-8
project=jarweb-jen-ans.jar
#输出信息
echo "begin>>>>>>>>>>>>>>>>>>>>"
#获取当前服务器时间,并格式化
dqtime=$(date "+%Y-%m-%d %H:%M:%S")
#输出当前服务器时间
echo "datetime: ${dqtime}"
#获取项目正在运行的进程PID(方法有很多,这是其它一种)
javapid=$(ps -ef|grep $project |grep -v grep|awk '{print $2}')
#输出PID
echo "javapid: $javapid"
#通过项目的PID,判断有没有在运行
process=$(ps -ef |grep $javapid |grep java)
echo "process: $process"
if [ "$process" = "" ]
then
echo "Not found>$project<, running Java program"
else
#如果已经在运行,就直接杀死进程
echo "Start killing the process ID of jarweb-jen-ans.jar"
echo "kill -9 $javapid"
kill -9 $javapid
fi
echo "<<<<<<<<<<<<<<<<<<<end"
#输出友好的倒计时提示,项目在5秒钟后启动
seconds_left=5
echo "Start the project after 5 seconds"
while [ $seconds_left -gt 0 ];
do
echo -n "Please wait for> ${seconds_left} <seconds.."
sleep 1
seconds_left=$(($seconds_left - 1))
#清除上一行内容,即上一个倒计时输出的信息
echo -ne "\r \r"
done
echo "Startup project $project"
#刷新profile
source /etc/profile
#项目启动需要执行的命令
nohup java -jar /home/tools/jar/jarweb-jen-ans.jar > /home/tools/jar/nohup.out 2>&1 &
#显示项目启动的日志输出
#tail -999f /home/tools/jar/nohup.out
可以使用命令来检测语法是否正确,如文件(deploy-jarweb.yml ):
root@docker_t ~# ansible-playbook --syntax-check /etc/ansible/roles/jarweb/deploy-jarweb.yml … 输出:playbook: /etc/ansible/roles/jarweb/deploy-jarweb.yml 就表示正确
b,执行命令:
root@docker_t ~# ansible-playbook /etc/ansible/roles/jarweb/deploy-jarweb.yml
到这里,就说明已经执行成功了,去浏览器输入你的项目地址访问一下,有没有启动吧
如果想更详细了解Ansible的使用,请访问这个地址吧:https://blog.rj-bai.com/post/117.html