shell python脚本无法使用ssh正常工作

slmsl1lt  于 2023-08-07  发布在  Shell
关注(0)|答案(1)|浏览(109)

我写了一个脚本来检查kubernetes的pod,如果挂起,它必须写入pod日志并删除它。Kube master在另一台服务器上,我尝试通过ssh连接到它。当我尝试在kube主服务器上本地启动脚本时,它工作得很好,但是当我尝试输入与ssh参数相同的命令时,我得到了pod删除,但是这个pod的日志没有写入并且没有错误,所以我不明白我做错了什么。我使用python 3.6,脚本和它们所在目录的访问权限为777。
我知道使用k8s API可以做到这一点,但我现在不知道如何做到这一点。我还在学习,稍后会尝试实现它,但系统现在应该工作。
PS.我这样做的原因是我想添加'check_radio'到cron,忘记挂pod...我不是python的高手,只是一个想成为devops的普通系统管理员,所以如果你有一些关于如何优化我的工作的想法,欢迎你。
下面是kube master上的脚本(kube_reload.py):

#!/bin/python3

import sys
import os
import re
import subprocess as sp
from contextlib import redirect_stdout as r_stdout

marker = False
pod_nums = ''
pod_nums_int = []
for_reload = []

get_pods = sp.check_output(['kubectl', 'get', 'pods'])
get_pods = str(get_pods)
get_pods = get_pods.split()

pods = []

'''write garbage pod names in array'''

for word in get_pods:
    if 'radio-hls' in word:
        pods.append(word) 

'''make usual pod names from garbage names'''

for num in range(len(pods)):

    while marker == False:
        if pods[num][:5] != 'radio':
            pods[num] = pods[num][1:]
        if pods[num][:5] == 'radio':
            break

'''Function that lists all pods'''

def pod_list():

    sp.run('clear')
    print('PODS LIST:\n')
    for num in range(len(pods)):
        print(num+1, '.\t', pods[num])

    print(len(pods)+1, '.\t Reload all')

'''Function for recursion in try-except statement in 'input_nums()' function'''

def return_for_except():
    pod_list()
    print('Error input. Try again\n\n')
    input_nums()

'''Function that asks which pods you want to reload'''

def input_nums():
    pod_nums = str(input('Select which pods you want to reload (type all numbers with a space):\nExample: 1 2 3 10\n\n'))
    pod_nums = pod_nums.split()

    try:
        global pod_nums_int
        pod_nums_int = [eval(i) for i in pod_nums]
    except:
        return return_for_except()

'''Function to write pod logs to a file'''

def write_logs():

    global for_reload

    if len(pods)+1 in pod_nums_int:

        all_reload = input('You selected "Reload all". To continue, press Enter\n')

        if all_reload == '':
            for i in range(len(pods)):
                with open (f'{pods[i-1][10:-17]}.log', 'w') as pod_log:
                                    sp.run(['kubectl', 'logs', f'{pods[i-1]}'], stdout=pod_log)
                print(f'{pods[i-1]} logged successfully')
                for_reload.append(i)
        else:
            print('Something went wrong')
            quit()
    else:
        for i in pod_nums_int:

            with open (f'{pods[i-1][10:-17]}.log', 'w') as pod_log:
                sp.run(['kubectl', 'logs', f'{pods[i-1]}'], stdout=pod_log)
            print(f'{pods[i-1]} logged successfully')
            for_reload.append(i)

'''Function that reloads streams'''

def reload_pods(for_reload, pods):
    for i in for_reload:
        sp.run(['kubectl', 'delete', 'pod', f'{pods[i-1]}'])
        print(f'{pods[i-1]}', 'deleted')




'''Start'''

'''manual (with no arguments)'''
if len(sys.argv) == 1:
    pod_list()
    input_nums()
    write_logs()
    reload_pods(for_reload, pods)
    sp.run(['kubectl', 'get', 'pods'])
    print()
    sp.run(['ls', '-lah'])

'''auto (from nginx srver)'''

if len(sys.argv) > 1:
    for arg in sys.argv:
        if arg == './kube_reload.py':
            continue
        else:
            for pod in pods:
                if arg in pod:
                    #write logs
                    with open (f'{arg}.log', 'w') as log:
                        sp.run(['kubectl', 'logs', f'{pod}'], stdout=log)
                    #reload pods
                    sp.run(['kubectl', 'delete', 'pod', f'{pod}'])
                else:
                    continue

字符串
下面是来自另一个服务器的脚本(check_radio):

#!/bin/python3

import requests as r
import subprocess as sp
import sys

'''IN CASE OF ADDING ADDITIONAL STREAM ADD IT TO "streams" '''

streams = [
'gold',
'tophits',
'worldchart',
'ukraine',
'rock',
'chill',
'rap',
'retromusic',
'elektro',
'sport',
'radionv',
'edyninov',
'hromadske'
]

'''IF IF THERE IS NO NEED TO CHECK SOME STREAMS YOU CAN ADD IT TO "streams_not_to_check" '''

streams_not_to_check = [
'radionv',
'edyninov',
'hromadske'
]

streams_to_delete = []

#CLUSTER_API = 'https://host_ip:6443'
#auth_header = 'Authorization: '

for stream in streams:
    check_stream = r.get(f'https://host.host/stream/{stream}/status/health').json()

    if check_stream['metadata'] == 'UNHEALTHY':
        streams_to_delete.append(stream)

for stream in streams_not_to_check:
    if stream in streams_to_delete:
        streams_to_delete.remove(stream)

print(streams_to_delete)



if len(streams_to_delete) >= 1:

    for stream in streams_to_delete:

        sp.Popen(f'ssh developer@radio1 python3 ~/deekly/kube_reload.py {stream}', shell=True).communicate()


我在nginx服务器上试了一下

./check_radio


还有这个

[developer@radio-lb1 deekly]$ ./check_radio
['rap', 'rock']
pod "radio-hls-rap-f4b86bd77-jpmr4" deleted
pod "radio-hls-rock-57fc8fcd64-m54k5" deleted
[developer@radio-lb1 deekly]$


在Kube服务器上

[developer@radio1 deekly]$ ls -la
total 8
drwxrwxrwx  2 developer developer   28 Aug  4 20:46 .
drwx------ 14 developer developer 4096 Aug  4 20:26 ..
-rwxrwxrwx  1 developer developer 2850 Aug  4 19:51 kube_reload.py
[developer@radio1 deekly]$


但是当我从kube master尝试这个时

./kube_reload.py rap rock


或者这个(没关系)

python3 kube_reload.py rap rock


我明白了

[developer@radio1 deekly]$ ./kube_reload.py rap rock
pod "radio-hls-rap-f4b86bd77-4bvcs" deleted
pod "radio-hls-rock-57fc8fcd64-g5j96" deleted
[developer@radio1 deekly]$ ls -la
total 32
drwxrwxrwx  2 developer developer   59 Aug  5 16:38 .
drwx------ 14 developer developer 4096 Aug  4 20:26 ..
-rwxrwxrwx  1 developer developer 2850 Aug  4 19:51 kube_reload.py
-rw-rw-r--  1 developer developer 8303 Aug  5 16:38 rap.log
-rw-rw-r--  1 developer developer 8345 Aug  5 16:38 rock.log

bogh5gae

bogh5gae1#

您的kube_reload.py脚本将其日志写入其当前工作目录:

with open (f'{arg}.log', 'w') as log:
...

字符串
当你以交互方式运行kube_reload.py时,你是从这个“deekly”目录运行它的,所以“deekly”是进程的工作目录,日志被写在那里:

[developer@radio1 deekly]$ ./kube_reload.py rap rock
...
[developer@radio1 deekly]$ ls -la
...
-rw-rw-r--  1 developer developer 8303 Aug  5 16:38 rap.log
-rw-rw-r--  1 developer developer 8345 Aug  5 16:38 rock.log


当这个check_radio通过ssh调用kube_reload.py时,kube_reload.py进程将这个“developer”用户的主目录作为其工作目录,而不是“deekly”目录:

sp.Popen(f'ssh developer@radio1 python3 ~/deekly/kube_reload.py {stream}', shell=True)...


kube_reload.py可能会将其日志文件写入这个“developer”用户的主目录,而不是“deekly”子目录。
如果您希望日志被写入这个“deekly”目录,您应该做以下三件事之一:
1.修改kube_reload.py,将日志放在您想要的位置,而不是当前的工作目录。
1.修改kube_reload.py,在打开日志之前将其工作目录更改为所需目录。
1.修改check_radio以使用正确的工作目录在远程主机上调用kube_reload.py。我不是Python程序员,所以我不能给予你确切的Python语法。但是像下面这样的命令应该可以做到这一点:
ssh developer@radio1 'cd deekly && python3 ./kube_reload.py args...'
你将不得不在python中做任何必要的事情来转义这些单引号,以便它们出现在实际执行的命令中。

相关问题