Advertisement
askanton

Автоматическое размещение python скриптов на сервере

Sep 3rd, 2020
385
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.51 KB | None | 0 0
  1. Tutorial https://www.youtube.com/watch?v=Rf3-xc9JHgI&feature=youtu.be
  2.  
  3. # импортируем библиотеки
  4. import paramiko
  5. import time
  6. # собираем данные для ввода
  7. while True:
  8.     host = input("Enter server IP: ")
  9.     user = input("Enter server admin user name: ")
  10.     secret = input("Enter server admin password: ")
  11.     port = input("Enter server port: ")
  12.     script_name = input("Enter new script name: ")
  13.     new_user = input("Enter new user name: ")
  14.     new_user_pass = input("Enter new user password: ")
  15.     script_file_name = input("Enter file to upload: ")
  16.     print("Your input: ",host,user,secret,port,script_name,new_user,new_user_pass,script_file_name)
  17.     check = input("If correct type 'y', esle type any key:" )
  18.     if check == "y":
  19.         break
  20. # подключаемся к серверу под админом
  21. client = paramiko.SSHClient()
  22. client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  23. client.connect(hostname=host, username=user, password=secret, port=port)
  24. ssh = client.invoke_shell()
  25. time.sleep(2)
  26. out = ssh.recv(60000)
  27. name = str(out[-16:]) # получаем имя сервера и админа
  28.  
  29. def service(): # собираем сервис
  30.     transport = paramiko.Transport((host, int(port)))
  31.     transport.connect(username=user, password=secret)
  32.     sftp = paramiko.SFTPClient.from_transport(transport)
  33.     output = open("{}.service".format(script_name), 'w')  # перезаписываем новые даные в файл конфига
  34.     print("[Unit]", file=output)
  35.     print("Description=My {}".format(script_name), file=output)
  36.     print("After=network.target", file=output)
  37.     print("[Service]", file=output)
  38.     print("User={}".format(new_user), file=output)
  39.     print("Group={}".format(new_user), file=output)
  40.     print("Restart=on-failure", file=output)
  41.     print("RestartSec=3", file=output)
  42.     print("WorkingDirectory=/home/{}/".format(new_user), file=output)
  43.     print('Environment="PYTHONPATH=/home/{}/"'.format(new_user), file=output)
  44.     print("ExecStart=/home/{}/.venv/bin/python /home/{}/{}".format(new_user, new_user, script_file_name), file=output)
  45.     print("[Install]", file=output)
  46.     print("WantedBy=multi-user.target", file=output)
  47.     output.close()  # закрываем файл
  48.     remotepath_ser = "/etc/systemd/system/{}.service".format(script_name)
  49.     localpath_ser = "{}.service".format(script_name)
  50.     sftp.put(localpath_ser, remotepath_ser)
  51.     sftp.close()
  52.     transport.close()
  53.     client.close()
  54.  
  55. def command(comm):  # выполняем команду, проверяя закончилось ли её выполнение
  56.     ssh.send(comm + "\n")
  57.     time.sleep(1)
  58.     while True:
  59.         out = ssh.recv(60000)
  60.         if str(out[-16:]) == name:
  61.             break
  62.         else:
  63.             print("Wait fo it!")
  64.             time.sleep(5)
  65.  
  66. command("sudo su")
  67. command("apt update")  # обновлемся
  68. print("updating")
  69. command("apt install -y git build-essential libssl-dev libffi-dev python3-pip python3-dev python3-setuptools python3-venv") # устанавливаем питон и необходимые библиотеки
  70. print("packs installed")
  71. time.sleep(1)
  72. # создаем нового пользователя
  73. ssh.send("adduser {}".format(new_user) + "\n")
  74. time.sleep(1)
  75. ssh.send(new_user_pass + "\n")
  76. time.sleep(1)
  77. ssh.send(new_user_pass + "\n")
  78. time.sleep(1)
  79. i = 0
  80. while i < 5:
  81.     ssh.send("" + "\n")
  82.     i = i + 1
  83.     time.sleep(1)
  84. ssh.send("y" + "\n")
  85. time.sleep(1)
  86. print("user created")
  87. client.close()
  88. service() # загружаем сервис на сервер
  89. print("service uploaded")
  90. # загружаем на сервер файлы скрипта и требований
  91. transport = paramiko.Transport((host, int(port)))
  92. transport.connect(username=new_user, password=new_user_pass)
  93. sftp = paramiko.SFTPClient.from_transport(transport)
  94. remotepath = '/home/{}/{}'.format(new_user, script_file_name)
  95. localpath = script_file_name
  96. remotepath_req = '/home/{}/requirements.txt'.format(new_user)
  97. localpath_req = 'requirements.txt'
  98. sftp.put(localpath, remotepath)
  99. sftp.put(localpath_req, remotepath_req)
  100. sftp.close()
  101. transport.close()
  102. client.close()
  103. print("files uploded")
  104. # входим на сервер под новым пользователем
  105. client.connect(hostname=host, username=new_user, password=new_user_pass, port=port)
  106. ssh = client.invoke_shell()
  107. ssh.send("python3 -m venv .venv" + "\n")  # разворачиваем виртуальное окружение
  108. time.sleep(1)
  109. print("venv created")
  110. ssh.send("source /home/{}/.venv/bin/activate".format(new_user) + "\n")  # активируем виртуальное окружение
  111. out = ssh.recv(60000)
  112. time.sleep(1)
  113. print("venv activated")
  114. ssh.send("pip install -r /home/tst08/requirements.txt && deactivate" + "\n")  # устанавливаем библиотеки из файл с требованиями
  115. out = ssh.recv(60000)
  116. time.sleep(3)
  117. print("requirements installed")
  118. client.close()
  119. # заходим на сервер под админом
  120. client.connect(hostname=host, username=user, password=secret, port=port)
  121. ssh = client.invoke_shell()
  122. ssh.send("systemctl daemon-reload" + "\n")  # перезапускаем демона сервисов
  123. time.sleep(1)
  124. print("trying to start service")
  125. ssh.send("sudo systemctl start {}".format(script_name) + "\n")  # запускам новый сервис
  126. time.sleep(1)
  127. ssh.send(secret + "\n")
  128. print("service started")
  129. time.sleep(1)
  130. client.close()
  131.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement