centos安装ansible、jenkins+ansible自动发布

一、ansible简介

ansible基于python开发,集合了众多优秀运维工具的优点,实现了批量运行命令、部署程序、配置系统等功能。

默认通过SSH协议进行远程命令执行或下发配置,无需部署任何客户端代理软件,从而使得自动化环境部署变得更加简单。

可同时支持多台主机并进行管理,使得管理主机更加便捷。

核心组件:

Host Lnventory:记录了每一个由Ansible管理的主机信息,信息包括ssh端口,root帐号密码,ip地址等等。可以通过file来加载,可以通过CMDB加载

Playbooks:YAML格式文件,多个任务定义在一个文件中,使用时可以统一调用,“剧本”用来定义那些主机需要调用那些模块来完成的功能.

Core Modules:Ansible执行任何管理任务都不是由Ansible自己完成,而是由核心模块完成;Ansible管理主机之前,先调用core Modules中的模块,然后指明管理Host Lnventory中的主机,就可以完成管理主机。

Custom Modules:自定义模块,完成Ansible核心模块无法完成的功能,此模块支持任何语言编写。

Connection Plugins:连接插件,Ansible和Host通信使用

ansibleå¨centos7ä¸çå®è£åéç½®

二、安装ansible

安装环境软件包

yum install -y epel-release 

安装ansible

yum install -y ansible 

配置主机清单,添加被管理的主机IP

vi /etc/ansible/hosts

## 添加
[service1]
172.20.10.8
[service2]
172.20.10.9
[service3]
172.20.10.10

这个配置的目的是:

ansible安装在10.8这台机器,有service1 service 2 service3 三个应用要分别发布在10.8 10.9 10.10三台机器上

生成RSA密钥对

ssh-keygen -t rsa

将公钥推送给被管理端 
cd ~
cd .ssh

ssh-copy-id root@172.20.10.8   //这一句我没执行,我本来就把本机的公钥加入到了本机的authorized_keys中
ssh-copy-id root@172.20.10.9
ssh-copy-id root@172.20.10.10 

免交互
ssh-agent bash 
ssh-add

检查被管理主机是否能成功连接

ansible all -a 'date'

三、 jenkins+ansible发布service1 service 2 service3 三个应用要分别在10.8 10.9 10.10三台机器上

至于jenkins怎么安装,怎么配置gitlab、maven、jdk请看之前这篇:docker安装Jenkins、jenkins插件、映射JDK和maven和RSA、publish over ssh发布

区别在于之前那篇使用的Jenkins的publish over ssh插件来发布service1 service 2 service3 三个应用要分别在10.8 10.9 10.10三台机器上

而这篇不用publish over ssh了,而是使用ansible来发布service1 service 2 service3 三个应用要分别在10.8 10.9 10.10三台机器上

区别在于:

如果使用publish over ssh,jenkins需要远程SSH到node1 node2 node3三台机器上去拷贝jar包去启动。

如果使用ansible的话,Jenkins只需要ssh到ansible控制所在的机器上执行一句ansible的命令即可,ansible会根据我们写的playbook自动去操作node1 node2 node3拷贝jar启动。

我们把ansible的yml脚本都写在项目中,这样可以跟随版本管理

deploy_components.yml内容

---   #固定格式
- hosts: service1  #定义需要执行主机
  vars: #设置变量
    pwd: /app/jenkins/workspace/test-docker
  remote_user: root   #远程用户
  gather_facts: no  #不收集facts
  tasks:   #定义一个任务的开始
    # 获取本地打包好的文件名
    - name: get local file name    #定义任务的名称
      local_action: shell ls {{ pwd }}/service1/target/*.jar
      register: file_name
      tags: test

    # 上传jar包到服务器
    - name: upload service1.jar file to server
      tags:
        - upload
        - test
      copy:
        src: "{{ file_name.stdout }}"
        dest: /app/deploy/
      when: file_name.stdout != ""

    # 获取上次jar包运行的pid
    - name: get pid of service1
      tags:
        - test
      shell: "ps -ef | grep -v grep | grep service1 | awk '{print $2}'"
      register: running_processes

    # 发送停止运行信号
    - name: Kill running processes
      shell: "kill {{ item }}"
      tags:
        - test1
      with_items: "{{ running_processes.stdout_lines }}"
      when: running_processes.stdout_lines != ""

    # 等待60s钟,确认获取的到的pid是否都停止运行
    - wait_for:
        path: "/proc/{{ item }}/status"
        state: absent
        timeout: 10
      tags:
        - test
      with_items: "{{ running_processes.stdout_lines }}"
      ignore_errors: yes
      register: killed_processes
      when: running_processes.stdout_lines != ""

    # 强制杀死,未停止运行的进程
    - name: Force kill service1 processes
      shell: "kill -9 {{ item }}"
      with_items: "{{ killed_processes.results | select('failed') | map(attribute='item') | list }}"
      when: running_processes.stdout_lines != ""

    # 赋权
    - name: chmod 755
      shell: "chmod 755 /app/deploy/service1-1.0-SNAPSHOT.jar"
      tags: start
    # 启动新的jar包
    - name: start service1
      shell: "nohup /app/java/jdk1.8.0_221/bin/java -jar /app/deploy/service1-1.0-SNAPSHOT.jar >> service1.log 2>&1 &"
      tags: start

- hosts: service2  #定义需要执行主机
  vars: #设置变量
    pwd: /app/jenkins/workspace/test-docker
  remote_user: root   #远程用户
  gather_facts: no  #不收集facts
  tasks:   #定义一个任务的开始
    # 获取本地打包好的文件名
    - name: get local file name    #定义任务的名称
      local_action: shell ls {{ pwd }}/service2/target/*.jar
      register: file_name
      tags: test

    # 上传jar包到服务器
    - name: upload service2.jar file to server
      tags:
        - upload
        - test
      copy:
        src: "{{ file_name.stdout }}"
        dest: /app/deploy/
      when: file_name.stdout != ""

    # 获取上次jar包运行的pid
    - name: get pid of service2
      tags:
        - test
      shell: "ps -ef | grep -v grep | grep service2 | awk '{print $2}'"
      register: running_processes

    # 发送停止运行信号
    - name: Kill service2 processes
      shell: "kill {{ item }}"
      tags:
        - test1
      with_items: "{{ running_processes.stdout_lines }}"
      when: running_processes.stdout_lines != ""

    # 等待60s钟,确认获取的到的pid是否都停止运行
    - wait_for:
        path: "/proc/{{ item }}/status"
        state: absent
        timeout: 5
      tags:
        - test
      with_items: "{{ running_processes.stdout_lines }}"
      ignore_errors: yes
      register: killed_processes
      when: running_processes.stdout_lines != ""

    # 强制杀死,未停止运行的进程
    - name: Force kill service2 processes
      shell: "kill -9 {{ item }}"
      with_items: "{{ killed_processes.results | select('failed') | map(attribute='item') | list }}"
      when: running_processes.stdout_lines != ""

    # 赋权
    - name: chmod 755
      shell: "chmod 755 /app/deploy/service2-1.0-SNAPSHOT.jar"
      tags: start
    # 启动新的jar包
    - name: start service2
      shell: "nohup /app/java/jdk1.8.0_221/bin/java -jar /app/deploy/service2-1.0-SNAPSHOT.jar >> service2.log 2>&1 &"
      tags: start

- hosts: service3  #定义需要执行主机
  vars: #设置变量
    pwd: /app/jenkins/workspace/test-docker
  remote_user: root   #远程用户
  gather_facts: no  #不收集facts
  tasks:   #定义一个任务的开始
    # 获取本地打包好的文件名
    - name: get local file name    #定义任务的名称
      local_action: shell ls {{ pwd }}/service3/target/*.jar
      register: file_name
      tags: test

    # 上传jar包到服务器
    - name: upload service3.jar file to server
      tags:
        - upload
        - test
      copy:
        src: "{{ file_name.stdout }}"
        dest: /app/deploy/
      when: file_name.stdout != ""

    # 赋权
    - name: chmod 755
      shell: "chmod 755 /app/deploy/service3-1.0-SNAPSHOT.jar"
      tags: start
    # 启动新的jar包
    - name: start service3
      shell: "nohup /app/java/jdk1.8.0_221/bin/java -jar /app/deploy/service3-1.0-SNAPSHOT.jar >> service3.log 2>&1 &"
      tags: start

build_pre.sh的内容

#!/bin/bash
#打印maven版本
mvn -v
#打印java版本
java -version

 jenkins配置

这个脚本仅仅只是在编译前答应出java和maven的版本号而已

这个配置是需要安装插件:SSH plugin

这里就是jenkins使用SSH的方式连到ansible控制机所在的机器上去执行ansible的脚本

注意:由于我的jenkins是在docker里面的,所以要ssh在ansible所在机器上。

如果你们的jenkins和ansible都在同一台机器上且都不是docker版本的,则不需要remote ssh,直接在本机执行shell命令跑ansible的脚本就行了

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值