实例


配置如下:

注意:在实际工作中,一般都会搭建nexus私库给开发用的,而像java这样的项目中很多依赖包的用的都是nexus私库的地址,这时在构建项目时就需要给jenkins配置私库的配置文件,即在/var/lib/jenkins/.m2/下添加settings.xml配置文件。

下面附上这个实例中salt的所用到的sls文件,如下:

sls文件所在的位置:

[root@test11 deploy]# ls /srv/salt/state/deploy/
files  java.sls
[root@test11 deploy]# ls /srv/salt/state/deploy/files/java/
service-7.sh  system.sh

发送项目到相应服务器运行的java.sls文件:

[root@test11 deploy]# cat /srv/salt/state/deploy/java.sls 
{% set project_name = pillar['project']['name'] -%}
base_dirs:
  file.directory:
    - names:
      - /ubox/apps/{{ project_name }}
      - /ubox/logs/{{ project_name }}
      - /ubox/share/config/{{ project_name }}
      - /var/run/java
    - user: root
    - group: root
    - dir_mode: 755
    - makedirs: True

release_code:
  cmd.run:
    - name: rsync -rl {%- if salt['pillar.get']('project:clean') %} --delete {%- endif %} test11.uboxol.com::artifacts/{{ project_name }}/ /ubox/apps/{{ project_name }}
    - require:
      - file: base_dirs

service_scripts:
  file.managed:
    - name: /etc/init.d/{{ project_name | replace('/', '_') }}
    - source: salt://deploy/files/java/service-7.sh
    - user: root
    - group: root
    - mode: 755
    - template: jinja
    - require:
      - file: base_dirs

system_scripts:
  file.managed:
    - name: /lib/systemd/system/{{ project_name | replace('/', '_') }}.service
    - source: salt://deploy/files/java/system.sh
    - user: root
    - group: root
    - mode: 755
    - template: jinja
    - require:
      - file: service_scripts
  cmd.run:
    - name: systemctl daemon-reload

project_service:
  service.running:
    - name: {{ project_name | replace('/', '_') }}
    - require:
      - file: system_scripts
    - watch:
      - cmd: release_code

{%- if salt['pillar.get']('project:tmp_dirs') %}

tmp_dirs:
  file.directory:
    - user: root
    - group: root
    - dir_mode: 755
    - makedirs: True
    - names:
    {%- for tmp_dir in salt['pillar.get']('project:tmp_dirs') %}
      - /ubox/apps/{{ project_name }}/{{ tmp_dir }}
    {%- endfor %}
    - require:
      - cmd: release_code
{%- endif %}

java的启动、停止脚本:

[root@test11 deploy]# cat /srv/salt/state/deploy/files/java/service-7.sh 
{% set project_name = pillar['project']['name'] -%}
{% set jar_name = salt['pillar.get']('java:jar_name') -%}
{% set java_opts = salt['pillar.get']('java:java_opts') -%}
#!/bin/sh
#

# Source function library.
. /etc/rc.d/init.d/functions

# limit
ulimit -SH -n 1048576 -u 655350

PID_FILE='/var/run/java/{{ project_name | replace('/', '_') }}.pid'
KILL_SLEEP_INTERVAL=30

start() {
    if status -p $PID_FILE {{ project_name }}; then
        echo "{{ project_name }} is still running !" >&2
        exit 1
    fi

    # Run the program!
    # wait 2 second
    sleep 2
    cd /ubox/apps/{{ project_name }}
{%- if 'ysera' in project_name %}
export LD_PRELOAD=/ubox/apps/glusterfs/glibc/lib/libc.so.6
{% endif %}

    exec java -jar -server -XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35 -XX:+DisableExplicitGC -Xloggc:/ubox/logs/{{ project_name }}/gc.log -XX:+PrintGC -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+HeapDumpOnOutOfMemoryError -Djava.awt.headless=true -DappHome=/ubox/share/config/{{ project_name }} {{ java_opts }} {{ jar_name }} >/dev/null 2>&1 &

    # Generate the pidfile from here. If we instead made the forked process
    # generate it there will be a race condition between the pidfile writing
    # and a process possibly asking for status.
    echo $! > $PID_FILE
    echo "{{ project_name }} started."
}

stop() {
    if [ -z "$PID_FILE" ]; then
        echo "Kill {{ project_name }} failed: \$PID not set"
    else
        if [ -f "$PID_FILE" ]; then
          PID=`cat "$PID_FILE"`
          echo "Killing {{ project_name }} with the PID: $PID"
          kill $PID
          while [ $KILL_SLEEP_INTERVAL -ge 0 ]; do
              if ! kill -0 $PID &> /dev/null;then
                  echo "The {{ project_name }} process has been killed."
                  break
              fi
              if [ $KILL_SLEEP_INTERVAL -gt 0 ]; then
                  sleep 1
              fi
              KILL_SLEEP_INTERVAL=`expr $KILL_SLEEP_INTERVAL - 1 `
          done
          if [ $KILL_SLEEP_INTERVAL -lt 0 ]; then
              echo "{{ project_name }} has not been killed completely yet. Force kill!"
              kill -9 `cat "$PID_FILE"`
          fi
          rm -f $PID_FILE
        fi
    fi
}

rh_status() {
    status -p $PID_FILE {{ project_name }}
}

case "$1" in
    start)
        $1
        ;;
    stop)
        $1
        ;;
    restart)
        stop
        start
        ;;
    status)
        rh_status
        ;;
    *)
        echo $"Usage: $0 {start|stop|status|restart}"
        exit 2
esac

centos7下的自定义脚本服务:

[root@test11 deploy]# cat /srv/salt/state/deploy/files/java/system.sh 
{% set project_name = pillar['project']['name'] -%}
[Unit]  
Description=summer  
After=network.target  

[Service]  
Type=forking  
ExecStart=/etc/init.d/{{ project_name }} start  
ExecReload=/etc/init.d/{{ project_name }} restart  
ExecStop=/etc/init.d/{{ project_name }} stop  
PrivateTmp=true  

[Install]  
WantedBy=multi-user.target
文档更新时间: 2019-06-25 17:24   作者:子木