ansible探针分发操作具体流程

 

1. 准备好连接linux的工具类,与本地linux服务器建立连接,配置好host,port,user,password

 import com.jcraft.jsch.ChannelExec;
 import com.jcraft.jsch.JSch;
 import com.jcraft.jsch.JSchException;
 import com.jcraft.jsch.Session;
 import org.apache.commons.io.IOUtils;
 import java.io.IOException;
 import java.io.InputStream;
 
 public class SSHLinux {
     public String exeCommand(String host, int port, String user, String password, String command) throws JSchException, IOException {
         JSch jsch = new JSch();
         Session session = jsch.getSession(user, host, port);
         session.setConfig("StrictHostKeyChecking", "no");
         session.setPassword(password);
         session.connect();
         ChannelExec channelExec = (ChannelExec) session.openChannel("exec");
         InputStream in = channelExec.getInputStream();
         channelExec.setCommand(command);
         channelExec.setErrStream(System.err);
         channelExec.connect();
         String out = IOUtils.toString(in, "UTF-8");
         channelExec.disconnect();
         session.disconnect();
         return out;
    }
 }
 public class HostConfig {
     private HostConfig(){}
     public static final String HOST="192.168.72.131";
     public static final Integer PORT=22;
     public static final String USER="root";
     public static final String PASSWORD="root

2. ansible实现类

2.1 查看本地是否安装ansible

 String cmd1 = "rpm -qa | grep ansible";
 ans = sshLinux.exeCommand(host, port, user, password, cmd1);

2.2 如果没有安装则按流程安装,整个流程持续时间较长,大约需要5-8分钟

 if (ans =="" || ans ==null){
     try {
         // 安装 epel-release yum源、安装ansible、// 在hosts文件中写入ip组名
         String cmd2 = "yum -y install epel-release && yum -y install ansible";
         // && echo -e '[webgroup]'> /etc/ansible/hosts
         sshLinux.exeCommand(host, port, user, password, cmd2);
         map.put("安装 epel-release yum源","成功");
         map.put("安装 ansible","成功");
         map.put("ip组名为","webgroup");
         log.info("=========== 安 ------------ 1 ==========:" +  JSONUtils.toJSONString(map));
    } catch (Exception e) {
         e.printStackTrace();
    }

2.3 判断本地是否有 /usr/local/playbooks 目录,没有则创建

 String cmd3 = "[ ! -d /usr/local/playbooks ] && mkdir -p /usr/local/playbooks";
 sshLinux.exeCommand(host, port, user, password, cmd3);

2.4 判断本地 /usr/local/playbooks目录下有没有 main.yml 文件

 String cmd4 ="if [  -f \"/usr/local/playbooks/main.yml\" ];then\n" +
         " echo \"true\"\n" +
         " else\n" +
         " echo \"false\"\n" +
         "fi";
 String s = sshLinux.exeCommand(host, port, user, password, cmd4);

2.5 如果本地没有main.yml,则将准备好的文件复制到 /usr/local/playbooks目录下

 // jar_package: 是此java文件的jar包全称
 if(s.contains("false")){
     // 将读取的main.txt文件内容写入 main.yml
     String cmd5 ="unzip -j $(find / -name "+jar_package+") BOOT-INF/classes/ansible/main.yml -d /usr/local/playbooks/";
     String execRet = sshLinux.exeCommand(host, port, user, password, cmd5);
 }else {
     map.put("main.yml文件","已存在");
 }
 ---
 - hosts: [webgroup]
  gather_facts: yes
  remote_user: root
  vars_files:
    - /usr/local/playbooks/properties.yml
 
  tasks:
     # 在远程主机上创建目录/etc/ansible/facts.d/,以备后续存放ansible本地变量使用
    - name: create /etc/ansible/facts.d
      file: path=/etc/ansible/facts.d/ state=directory
       # 获取此远程主机$JAVA_HOME的值,并将结果值赋值给本地变量java_home,方便后续判断远程主机是否已经安装JDK
    - name: get the value of java_home and save it to /etc/ansible/facts.d/javainfo.fact
      shell: echo -e "[java_home]\njava_home=`cat /etc/profile|grep JAVA_HOME|head -1|awk -F= '{print $2}'` " > /etc/ansible/facts.d/javainfo.fact
    - block:
        - debug:
            msg: "目标服务器没有配置java环境,正在配置..."
         # 将控制端下载好的jdk-8u291-linux-x64.tar.gz解压安装到远程主机的/usr/local/project下面
        - unarchive: src={{jdk_src}}/jdk-8u291-linux-x64.tar.gz dest={{jdk_dest}}
         # 默认在/etc/profile文件中设置JAVA环境变量
        - lineinfile:
            path=/etc/profile
            insertafter="{{item.position}}"
            line="{{item.value}}"
            state=present
          with_items:
            - {position: EOF, value: "export JAVA_HOME=/usr/local/jdk1.8.0_291"}
            - {position: EOF, value: "export JRE_HOME=${JAVA_HOME}/jre"}
            - {position: EOF, value: "export CLASS_PATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib"}
            - {position: EOF, value: "export PATH=${JAVA_HOME}/bin:$PATH"}
         #使环境变量生效
        - shell: source /etc/profile
          register: javahome
        - debug:
            msg: "java环境配置成功"
          when: javahome.rc==0
 
       # 判断条件:当JAVA_HOME为空时,表示还没有安装JDK,所以执行block里面安装JDK的任务
      when: ansible_local.javainfo.java_home.java_home == ""
 
     # 再次获取此远程主机$JAVA_HOME的值,并将结果值赋值给本地变量java_home,方便以后判断远程主机是否已经安装JDK?
    - name: get the value of java_home and save it to /etc/ansible/facts.d/javainfo.fact again
      shell: echo -e "[java_home]\njava_home=`cat /etc/profile|grep JAVA_HOME|head -1|awk -F= '{print $2}'` " > /etc/ansible/facts.d/javainfo.fact
      register: javahome1
    - debug:
        msg: "服务器已有java环境"
      when: javahome1.rc==0
 
    - name: mkdir  # 在远程服务器创建目录
      file: path={{ jar_dir }} state=directory
      register: mkdir
    - debug:
        msg: "存放jar包的目录已存在"
      when: mkdir.changed==false and mkdir.failed==false
    - debug:
        msg: "存放jar包的目录创建成功"
      when: mkdir.changed==true
 
    - name: move jar # 移动指定jar包到指定目录
      copy: src=/{{ jar_package }} dest={{ jar_dir }}
      register: mvdir
    - debug:
        msg: "jar包已存在"
      when: mvdir.changed==false and mvdir.failed==false
    - debug:
        msg: "jar包移动成功"
      when: mvdir.changed==true
 
    - name: start project # 启动指定jar包
      shell: "source /etc/profile; nohup java -jar {{jar_dir}}/{{ jar_package }} >> ./nohup.out 2>&1 &"
      register: res
 
    - name: debug result
      debug:
        msg: "jar包启动成功"
      when: res.rc == 0
    - debug:
        msg: "jar包启动失败"
      when: res.rc !=0

2.6 判断本地 /usr/local/playbooks目录下有没有 properties.yml 文件

 String cmd6 ="if [  -f \"/usr/local/playbooks/properties.yml\" ];then\n" +
         " echo \"true\"\n" +
         " else\n" +
         " echo \"false\"\n" +
         "fi";
 String s = sshLinux.exeCommand(host, port, user, password, cmd6);

2.7 如果本地没有properties.yml,则将准备好的文件复制到 /usr/local/playbooks目录下

 // jar_package: 是此java文件的jar包全称
 if(s.contains("false")){
     // 将读取的main.txt文件内容写入 main.yml
     String cmd7 ="unzip -j $(find / -name "+jar_package+") BOOT-INF/classes/ansible/properties.yml -d /usr/local/playbooks/";
     String execRet = sshLinux.exeCommand(host, port, user, password, cmd7);
 }else {
     map.put("properties.yml文件","已存在");
 }
 # playbook配置文件
 jar_dir: /usr/local/project  # jar包存放的目录
 jdk_src: /usr/local/project  # jdk存放的目录
 jdk_dest: /usr/local/project # jdk移动的目标目录
 jar_package: demo01crud-0.0.1-SNAPSHOT.jar (测试用的jar包)

2.8 判断本地 /usr/local/playbooks目录下有没有 jdk包 文件

 String cmd8 ="if [  -f \"/usr/local/playbooks/jdk-8u291-linux-x64.tar.gz\" ];then\n" +
         " echo \"true\"\n" +
         " else\n" +
         " echo \"false\"\n" +
         "fi";
 String s = sshLinux.exeCommand(host, port, user, password, cmd8);

2.9 如果本地没有jdk-8u291-linux-x64.tar.gz,则将准备好的文件复制到 /usr/local/playbooks目录下

 // jar_package: 是此java文件的jar包全称
 if(s.contains("false")){
     // 将读取的main.txt文件内容写入 main.yml
     String cmd9 ="unzip -j $(find / -name "+jar_package+") BOOT-INF/classes/ansible/jdk-8u291-linux-x64.tar.gz -d /usr/local/playbooks/";
     String execRet = sshLinux.exeCommand(host, port, user, password, cmd9);
 }else {
     map.put("jdk包","已存在");
 }

2.10 判断本地 /usr/local/playbooks目录下有没有 发分发的jar包

 // demo01crud-0.0.1-SNAPSHOT.jar 是测试用的
 String cmd10 ="if [ -f \"/usr/local/playbooks/demo01crud-0.0.1-SNAPSHOT.jar\" ];then\n" +
         " echo \"true\"\n" +
         " else\n" +
         " echo \"false\"\n" +
         "fi";
 String s = sshLinux.exeCommand(host, port, user, password, cmd10);

2.11 如果本地没有 要分发的jar包,则将准备好的文件复制到 /usr/local/playbooks目录下

 // jar_package: 是此java文件的jar包全称
 // demo01crud-0.0.1-SNAPSHOT.jar 是测试用的
 if(s.contains("false")){
     // 将读取的main.txt文件内容写入 main.yml
     String cmd11 ="unzip -j $(find / -name "+jar_package+") BOOT-INF/classes/ansible/demo01crud-0.0.1-SNAPSHOT.jar -d /usr/local/playbooks/";
     String execRet = sshLinux.exeCommand(host, port, user, password, cmd11);
 }else {
     map.put("jdk包","已存在");
 }

2.12 前端页面传过来ip ,写入到本地 /etc/ansible/hosts 文件中 ,并把秘钥(提前已经生成好的,这里没有做非空判断,如果本地没有生成需要执行指令 ssh-keygen -t rsa -f /root/.ssh/id_rsa -N '',查询指令是 ls /root/.ssh)同步到这个ip所对应的远程服务器

 String cmd12 ="echo [webgroup] '\n'"+ip+"  > /etc/ansible/hosts  && ssh-copy-id "+ip;
 String addIp = sshLinux.exeCommand(host, port, user, password, cmd12);

2.13 执行playbook

 String cmd13 ="ansible-playbook /usr/local/playbooks/main.yml";
 res = sshLinux.exeCommand(host, port, user, password, cmd13);

 

posted @ 2021-06-25 17:15  河马小海豚  阅读(573)  评论(0)    收藏  举报