У меня есть следующий скрипт для создания обновлений на удаленных системах.
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?
заранее спасибо.
Вот как я подхожу к вашей проблеме:
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