Python Fabric, передающий пароль root в качестве аргумента командной строки, не работает

1

У меня есть следующий скрипт для создания обновлений на удаленных системах.

from fabric.api import run
serverIp   = "192.168.1.1"
serverPort = "8000"
filename   = "MyFIle.tar.gz"
dirName    = "MyDir"

def makeUpdate():
    run("/bin/update.sh {0} {1} {2} {3}".format(serverIp, serverPort,
                                                filename, dirName))

У меня есть список из нескольких сотен IP, где мне нужно делать обновления. Я делаю это, используя следующий скрипт.

import os
data =  open("clients.txt").read().strip().split("\n")

for i in data:
    if i:
        print(i)

for i in data:
    os.system("fab -H {0} -u root -I host_type".format(i))

Когда ключ ssh настроен, все работает нормально, но я должен развернуть его на машинах, где ssh-ключ не должен быть настроен. В этом случае он запрашивает пароль каждый раз, когда он создает новое соединение ssh. Пароль для всех устройств одинаковый. Чтобы ввести пароль в несколько сотен раз, это не удобно.

Когда я передал пароль из командной строки, это не сработало.

По какой-то причине я должен войти в систему как root, поэтому пароль sudo не работает в этом случае; это то, что я думаю, происходит.

Есть ли способ автоматизировать это или передать пароль в аргументе команды fab?

заранее спасибо.

Теги:
python-2.7
fabric

1 ответ

2
Лучший ответ

Вот как я подхожу к вашей проблеме:

import getpass # for getting the password from the user
import json # for outputting raw data
from fabric.api import execute, run, settings, task

@task
def make_update():
    # keeping global scope clean
    server_ip = "192.168.1.1"
    server_port = "8000"
    file_name = "MyFIle.tar.gz"
    dir_name = "MyDir"
    # return data so we can review it if we want
    return run("/bin/update.sh {0} {1} {2} {3}".format(
        server_ip, server_port, file_name, dir_name
    ))

@task
def make_update_all():
    # generate host list from file
    with open("clients.txt") as f:
        hosts = f.read().splitlines()
    # locally modify fabric environment
    with settings(
        user="root",
        password=getpass.getpass(), # get the root password
        parallel=True # do work in parallel to save time (False for debug)
    ):
        results = execute(make_update, hosts=hosts)
    print json.dumps(results, indent=4) # output results in a semi-legible way

Тогда я буду запускать его так:

fab make_update_all

Ещё вопросы

Сообщество Overcoder
Наверх
Меню