Ansible的使用

声明:
如果您有更好的技术与作者分享,或者商业合作;
请访问作者个人网站 http://www.esqabc.com/view/message.html 留言给作者。
如果该案例触犯您的专利,请在这里:http://www.esqabc.com/view/message.html 留言给作者说明原由
作者一经查实,马上删除。

1,准备工具:

服务器三台或者以上
a,主服务器:docker_t (安装Ansible)
b,被控制的服务器A:esqabc_a
c,被控制的服务器B:esqabc_b
注意,由于我的三台服务器都是国外服务器,显示与提示,相比国内会有所不同

2,安装Ansible,

请访问:https://blog.csdn.net/esqabc/article/details/90257590

3,服务器配置 SSH

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

在这里插入图片描述

4,添加要 Ansible 要管理的主机

[root@docker_t ~]# vim /etc/ansible/hosts
[rj-bai]
192.168.0.111
192.168.0.222
注意:rj-bai 为模块名,下面是要管理的主机 ip 地址,模块名随便写

5,Ansible 命令模块 - command (默认模块)

安装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”

6,Ansible 复制模块 - copy

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"

在这里插入图片描述

7,脚本模块,远程执行脚本

模块分为两个:shell与script
a,shell模块,这个模块需要将要运行的脚本传到受控端才可以执行,就用上面所提到的 copy 模块完成传送
如果不会shell脚本写,请看这个地址:https://blog.csdn.net/esqabc/article/details/91045089
注意:传送的时候脚本要加上 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”
在这里插入图片描述

8,yum 安装模块 - yum

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”
在这里插入图片描述

9,批量服务管理模块 - service

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”

10,剧本功能模块-playbook

这个所谓的剧本其实就是类似 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值