网络知识 娱乐 Ansible的使用

Ansible的使用

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