簡體   English   中英

有沒有辦法使用 python 子進程模塊執行一個打開的 shift pod 並捕獲命令的 output?

[英]Is there a way to exec into an open shift pod and capture the output of a command using the python subprocess module?

我目前正在從事的項目有多個在 Redhat Openshift 中運行的 pod。 我希望能夠運行 python 腳本來查看當前在項目中運行的每個 pod 的版本,而不是手動進入每個 pod 並檢查版本。

這是我想要實現的基本偽代碼:

  • 獲取openshift項目
  • 使用我想查看正在運行的 pod 的項目
  • 獲取項目中所有當前的 pod
  • 遍歷每個 pod,執行它們,並獲取版本

通過使用 python 中的子進程模塊,我已經能夠一直走到最后一步。我想弄清楚的是,是否有辦法執行到 pod 中,然后運行命令,捕獲 output ,然后退出。 這是我到目前為止的代碼

import subprocess
from subprocess import PIPE


if __name__ == '__main__':

    projects = subprocess.run(['oc', 'projects'], capture_output=True)
    if projects.returncode != 0:
        print('Error obtaining open shift projects, make sure you are logged in and have the correct permissions')
    project = subprocess.run(['oc', 'project', 'my-project'])

    pods = subprocess.run(['oc', 'get', 'pods'], stdout=PIPE).stdout.splitlines()
    for pod in pods:
        curr_pod = pod.split()[0].decode()
        exec = subprocess.run(['oc', 'exec',  '-it', curr_pod, '--', 'bash'], capture_output=True, shell=True)
        print(curr_pod)
        if exec.returncode == 0:
            version = subprocess.run(['ls'])
            print(curr_pod, version.stdout)
            subprocess.run(['exit'], shell=True)


Exec 似乎可以解決進入 pod 的問題,但之前的命令沒有給我預期的 output。 如果我能夠在進入每個 pod 后對每個 pod 執行 'ls',並為每個 pod 執行此操作,那將足以完成工作。 提前致謝,這是我的第一個 Stack Overflow 問題,所以我很樂意詳細說明。

import subprocess
from subprocess import PIPE


if __name__ == '__main__':

    projects = subprocess.run(['oc', 'projects'], capture_output=True)
    if projects.returncode != 0:
        print('Error obtaining open shift projects, make sure you are logged in and have the correct permissions')
    project = subprocess.run(['oc', 'project', 'my-project'])

    pods = subprocess.run(['oc', 'get', 'pods', '--no-headers'], stdout=PIPE).stdout.splitlines()
    for pod in pods:
        curr_pod = pod.split()[0].decode()
        exec = subprocess.run(['oc', 'exec', curr_pod, '--', 'ls'])
        print(curr_pod, exec.stdout)

我稍微修改了oc exec命令,以便能夠將ls的 output 打印到終端。 還添加了--no-headers以避免在運行oc get pods時打印 header 文件。 希望這就是您要找的。

看起來您只想運行一個命令。 oc cli 允許您執行單個命令,而無需 shell 進入帶有交互式 pod 的 pod

$ oc execute <pod> "ls"

會做我認為你正在尋找的事情。

因此,為了稍微重寫您的代碼,我不會像您那樣切換項目,而是使用 -n 來指定命名空間/項目。 這是未經測試的,因此可能有語法錯誤

import subprocess
from subprocess import PIPE


if __name__ == '__main__':

    projects = subprocess.run(['oc', 'projects'], capture_output=True)
    if projects.returncode != 0:
        print('Error obtaining open shift projects, make sure you are logged in and have the correct permissions')

    pods = subprocess.run(['oc', 'get', 'pods', '-n', 'my-project'], stdout=PIPE).stdout.splitlines()
    for pod in pods:
        curr_pod = pod.split()[0].decode()
        version_result = subprocess.run(['oc', '-n', 'my-project', 'exec', curr_pod, 'ls'], stdout=PIPE).stdout.splitlines()
        print(curr_pod)
        print(version_result)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM