Sin conjunto



Una vez decidimos hacer la automatización de nuestros momentos de trabajo de rutina. Crea tu propio conjunto (ansible) o algo así. Subí al sitio web del conjunto, miré cómo funciona ... se conecta al servidor remoto a través de ssh y ejecuta algún tipo de scripts allí ... Pare, pensé, ¿esto realmente necesita un conjunto? Sin un conjunto, yo mismo ... solo ... ¡puedo hacerlo! Y para que no solo pudiera, decidí escribir una aplicación web. La aplicación se llamaba Update Server , abreviada como UpS .

Worning! Debajo del corte muchas fotos y un par de gifs.

Decidí hacer la aplicación usando python y dzhanga. Hay suficientes especialistas y "especialistas" tanto en este como en el otro. Por lo tanto, no mediré el número de líneas de código ahora. Los interesados pueden mirar aquí, no hay secretos, y la mayoría de los equipos están codificados especializados para nuestro proyecto. Solo contaré (y mostraré) qué funcionalidad se implementó en la aplicación. Entonces aquí. Recogí mi python, por cierto, mi python no es muy grande, normal, promedio 2.7. Le conseguí un dzhang 1.10 nuevo (en ese momento) y comencé a conectarlos. Y tan y tan conectado. Entré desde arriba y abajo, en todos los sentidos. Y así resultó al final.


Pero lo primero es lo primero, todo comienza con una página tan simple con una descripción.


Al hacer clic en Proyectos jumbotron llegamos a la página de selección de proyectos.


Una vez seleccionado el proyecto, llegamos a la página principal con una lista de servidores, scripts, etc.


Pasemos a los detalles. La aplicación identificó varias entidades: servidor (servidor), script (script), service pack (actualización), tarea en la corona (trabajo cron), evento en el historial (evento), proyecto (proyecto) y no la esencia del volcado (volcado).

Una ligera digresión
Jugamos con mi hijo en la misión Titán, o más bien yo juego, y él mira) Allí, algunos artefactos, llamados entidades en la versión rusa, abandonan a los monstruos. Un buen día, una especie de esencia de Aquiles me cayó allí. La imagen es otra cosa, pero de la misma ópera)
El hijo vio y gritó:
- ¡Papá, mira la credibilidad de Aquiles!)

La esencia principal es el proyecto. Servidores, scripts, actualizaciones se aferran al proyecto. Se crean trabajos de corona y vertederos. Los objetos se encuentran dispersos en las pestañas correspondientes. A la izquierda hay un menú con una lista de comandos. Repasemos los marcadores. Primeros guiones de marcadores.


Aquí vemos los scripts y servidores disponibles (los servidores están disponibles en todas las pestañas, porque casi siempre son necesarios). Los scripts pueden cargarse desde un archivo o crearse en la interfaz con el botón Agregar . Compatible con scripts SH, PY, YML y SQL. En el panel de secuencia de comandos hay una descripción ( descripción ), un fragmento de código ( vista previa ), autor y fecha. Para los scripts SH y PY, es posible agregar opciones (campo de opciones ). El script (y cualquier otro objeto) se selecciona haciendo clic en cualquier parte del panel (excepto los botones "rápidos"). Haga clic en el script (segundo, tercero, etc.), haga clic en el servidor (segundo, tercero, etc.) y haga clic en Ejecutar script . El guión o los guiones seleccionados se ejecutarán en el servidor o servidores seleccionados. Si necesita ejecutar un script "rápido", puede usar el botón "rápido" en el panel de script, hacer clic en el servidor (segundo, tercero, etc.) y hacer clic en Ejecutar el script deseado. Mientras escribía un artículo, aparecieron cambios. Scripts SQL separados del resto, agregaron un comando separado y permichon para ejecutar esquels. Esto permitió, por ejemplo, otorgar solo derechos para ejecutar esquels, porque SH y PY son mucho más potentes, ofrecen posibilidades casi ilimitadas. Pero no volví a hacer las capturas de pantalla) pude limitarme a los guiones, casi todo se podía hacer con ellos, pero ya era difícil de detener).
Adelante, paquetes de servicio.


En esta pestaña, puede agregar nuevas actualizaciones, copiarlas a los servidores, realizar actualizaciones. De hecho, puede ser cualquier archivo, ya que en este ejemplo se usa un archivo txt normal como actualización de prueba. Sube un archivo al servidor (la mayoría de las veces es un archivo zip) y de alguna manera lo usa usando scripts. Las actualizaciones también tienen una descripción, autor, fecha y tamaño que se muestran.
Luego vienen los basureros.


Muestra una lista de archivos recibidos por el comando Get dump o descargados aquí de la computadora. Los volcados no tienen una descripción, solo hay un nombre, tamaño y tiempo de creación. ¿Probablemente no solo todos al menos una vez (dos, tres) golpearon la base de alimentos? Aproveché esta oportunidad para un nuevo nivel) Enviar volcado este comando implementa la base del servidor desde el volcado seleccionado. ¿Siente la oportunidad? (Escucha el crujido de pedos) Sí, en manos incapaces, este comando puede matar TODAS las bases en TODOS los servidores con solo unos pocos clics. Es por eso que el botón de este (y similar) comando está pintado en rojo, debe presionarse con mucho cuidado. Para volcados de volumen, por supuesto, es problemático de usar, pero para bases de prueba pequeñas es algo muy conveniente. Cron


Toda esta desgracia se puede pasar por las coronas. Esta pestaña muestra las tareas activas. Cada tarea tiene un identificador único ( id de crontab ), es necesario para posteriores manipulaciones con ella. La descripción indica lo que hará la tarea. En el ejemplo, ejecute el script test2.sh en el servidor con la dirección jboss @ localhost. La hora de inicio de la tarea se indica en el campo Fecha de inicio en el formato AAAA-MM-DD HH: MM Se indica el autor y la hora de creación. Puede cancelar la tarea, cambiar la hora, hacer que la tarea sea permanente (se ejecutará todos los días a la hora especificada) o viceversa, una sola vez.
Los registros de los comandos en ejecución aparecen aquí.


No puede hacer nada con los registros, todo ya está hecho, siéntese y vea qué sucedió. Al hacer clic en la placa de registro, se abre en una ventana separada. Si se están ejecutando varios procesos, aparece el botón Todos los registros , abre todos los registros en una ventana (olvidé tomar esta captura de pantalla).

Servidores Como dije, la lista de servidores está disponible en todas las pestañas. El servidor muestra la dirección (dirección ssh ), puede escribirse en el formato usuario @ dirección, pero es mejor usar alias ssh (~ / .ssh / config) y especificar algunos nombres significativos. La dirección HTTP es la URL de una aplicación implementada en un servidor. La carpeta de trabajo ( carpeta del servidor ) y el puerto (puerto de enlace del servidor ), esta es la carpeta en la que se encuentra la aplicación y el puerto que abre, respectivamente. Descripción, autor, fecha. La captura de pantalla mostró un par de nuevos comandos agregados al momento de escribir: Prop y Full . Tenemos dos archivos de configuración principales, estos comandos le permiten editarlos convenientemente. El resto del equipo. Primero rojo:
Mantenimiento ON \ OFF : active / desactive la página Trabajos programados para el mantenimiento programado O_o o si algo salió mal (después de enviar un volcado, por ejemplo).
Recargar configuración : vuelve a cargar la configuración de jboss (nuestro proyecto usa jboss).
Reiniciar \ start \ stop \ kill jboss : detener, iniciar, reiniciar jboss y un brutal kill si nada más ayuda)
Además, varias cosas útiles:
Información del sistema : muestra información sobre el servidor: memoria, disco, procesador, usuarios, procesos.
Comprobar estado : una comprobación rápida del estado de la aplicación, busca el proceso de la aplicación, comprueba si el puerto está abierto e intenta tocar este puerto con el rizo.
Check conf : muestra el archivo de configuración de la aplicación.
Verificar registros : muestra los registros de la aplicación.
Comprobar registro de GC : muestra el recolector de basura de registro.
Obtener día \ semana \ mes \ todos los registros : le permite descargar registros durante un tiempo determinado en un archivo.
Backup base \ system \ full : crea una copia de seguridad de la base de datos, los archivos de la aplicación y hace ambas cosas.
Copiar utilidades : copia todo tipo de scripts diferentes en el servidor.
Peep passwords : le permite hacer palanca en la contraseña de administrador.
Comprobar actualizaciones : muestra qué archivos de actualización se cargan en el servidor.
Crear túnel : reenvía el puerto de la aplicación desde el servidor de aplicaciones a UpS (después de todo, tenemos ssh). Puede conectarse al puerto de la aplicación directamente. Útil para verificar la funcionalidad en caso de falta de acceso (http \ s) a la dirección principal.
Los comandos Información del sistema , Verificar estado , Verificar conf , Verificar registros , Peep contraseñas , Verificar actualizaciones y Crear túnel tienen análogos "rápidos" directamente en el panel de cada servidor.
Hay un enlace Historial en el panel superior, el resultado de la ejecución de todos (casi) comandos se registra en el historial. Se requieren permisos para ver el historial y ejecutar comandos. Los permichons son colgados por el panel de administración estándar de Dzhangovsky. Lo único que agregué aquí, atornillé la biblioteca django-guardian, que le permite adjuntar permichons a los objetos, me pareció muy conveniente, pero el dzhanga no puede hacerlo de la caja.

Por supuesto, no soy un gurú de wi, pero intenté hacer que la administración sea fácil y no forzada) Haga clic en los objetos necesarios, seleccione el equipo y eso es todo. Haga clic en el botón para obtener el resultado. Algo asi.


Algunas palabras sobre cómo funciona todo. Python y dzhanga, como dije, vistas, modelos, URL, formularios, esto es todo lo que hay en ese archivo command.py . Los archivos disponibles se describen en este archivo (hasta ahora todo es lógico, ¿verdad?). Se parece a esto:
class CommandClass: """ """ def __init__( self, permission='run_command', # Permission needed to run this command. position=1, # Position in commands list section='', # Section command will be placed to. style='', # Class assigned to a command button title='', # Pop up help message(via title) short='', # Short name for commands in quick section menu='', # Command name in UI name='', # Command name(an internal command name) run='', # Prevent CRONing his=True, # Command log will be saved to history fst=False, # Add command to quick section dgr='false', # If true will show confirmation window job='false', # Check if some cron jobs selected srv='false', # Check if some servers selected upd='false', # Check if some updates selected scr='false', # Check if some scripts selected dmp='false', # Check if some dumps selected ): self.permission = permission self.position = position self.section = section self.style = style self.title = title self.short = short self.name = name self.menu = menu self.run = run self.his = his self.fst = fst self.srv = srv self.upd = upd self.job = job self.scr = scr self.dmp = dmp self.dgr = dgr 

Y todos los comandos existentes se describen en el diccionario commandick . El nombre del diccionario es una especie de comando de juego de palabras (comando) y diccionario (diccionario), los conocedores del inglés probablemente encontrarán algún otro significado oculto. Diccionario:
 commandick = { # Cron submenu }----------------------------------- 'cancel_job': CommandClass( permission='run_cron', position=4, section='cron', title='Cancel selected cron job(s).', name='cancel_job', menu='Remove job', job='true', run="run_or_cron('RUN');", ), 'permanent_job': CommandClass( permission='run_cron', position=3, section='cron', title='Make selected cron job(s) permanent.', name='permanent_job', menu='Run everyday', job='true', run="run_or_cron('RUN');", ), ... 'tunnel': CommandClass( permission='tunnel', position=80, section='server', title='Make ssh tunnel to the bind port of selected server(s).', short='Tunnel', name='tunnel', menu='Create tunnel', run="run_or_cron('RUN');", srv='true', his=False, fst=True, ), 'test_ssh': CommandClass( permission='tunnel', position=90, section='server', title='Test ssh connection.', short='Tunnel', name='test_ssh', menu='Test ssh', run="run_or_cron('RUN');", srv='true', his=False, ), } 

Cada comando es un módulo separado en la carpeta de módulos . Los comandos se inician mediante un proceso separado, si se seleccionan varios servidores, se crea un script starter.py para cada uno , importa y ejecuta el módulo (comando) necesario. ¿Se te ocurrió una nueva característica? Agregue el archivo a la carpeta de módulos y describa en el diccionario, oh , todo. Aquí hay una aplicación. Vangyu comenta en masa sobre la construcción de bicicletas. A su altura ... cuentos, me gustaría responder a esto. ¿Por qué la gente sigue haciendo nuevas personas? Después de todo, la gente ya está ... hasta cierto punto, mucho. Porque me gusta el proceso) Entonces me gusta el proceso, que también te deseo, crea, inventa, prueba)

otras artesanías
En conclusión, quiero mencionar un par más de mis artesanías. Para el libro de colorear más pequeño. Un guión que simplifica el proceso de colorear otros guiones:
 #--------------------------------------------------------------------+ #Color picker, usage: printf $BLD$CUR$RED$BBLU'Hello World!'$DEF | #-------------------------+--------------------------------+---------+ # Text color | Background color | | #-----------+-------------+--------------+-----------------+ | # Base color|Lighter shade| Base color | Lighter shade | | #-----------+-------------+--------------+-----------------+ | BLK='\e[30m'; blk='\e[90m'; BBLK='\e[40m'; bblk='\e[100m' #| Black | RED='\e[31m'; red='\e[91m'; BRED='\e[41m'; bred='\e[101m' #| Red | GRN='\e[32m'; grn='\e[92m'; BGRN='\e[42m'; bgrn='\e[102m' #| Green | YLW='\e[33m'; ylw='\e[93m'; BYLW='\e[43m'; bylw='\e[103m' #| Yellow | BLU='\e[34m'; blu='\e[94m'; BBLU='\e[44m'; bblu='\e[104m' #| Blue | MGN='\e[35m'; mgn='\e[95m'; BMGN='\e[45m'; bmgn='\e[105m' #| Magenta | CYN='\e[36m'; cyn='\e[96m'; BCYN='\e[46m'; bcyn='\e[106m' #| Cyan | WHT='\e[37m'; wht='\e[97m'; BWHT='\e[47m'; bwht='\e[107m' #| White | #----------------------------------------------------------+---------+ # Effects | #--------------------------------------------------------------------+ DEF='\e[0m' #Default color and effects | BLD='\e[1m' #Bold\brighter | DIM='\e[2m' #Dim\darker | CUR='\e[3m' #Italic font | UND='\e[4m' #Underline | INV='\e[7m' #Inverted | COF='\e[?25l' #Cursor Off | CON='\e[?25h' #Cursor On | #--------------------------------------------------------------------+ # Text positioning, usage: XY 10 10 'Hello World!' | XY () { printf "\e[$2;${1}H$3"; } # | #--------------------------------------------------------------------+ # Print line, usage: line - 10 | line -= 20 | line 'Hello World!' 20 | line () { printf -v LINE "%$2s"; printf "${LINE// /$1}"; } # | #--------------------------------------------------------------------+ 

Para los niños mayores, pasar mucho tiempo en la consola, un buen tablero de instrumentos .
imagen

Para aquellos que ya están estrechamente en el marco del localhost, hay un script que crea un menú (diálogo) desde su ~ / .ssh / config . ¿Todos saben por qué se necesita ~ / .ssh / config ?) Se ve así:
imagen

Y por supuesto PIE-PIE!
A muchos les gustó Piu-Piu (más de 550 estrellas en el github), ¡gracias a todos por sus amables palabras y por su ayuda! ¿No escuchaste sobre piu-piu? Lee aquí , aquí y aquí . Quiero desarrollar más la trama y hacer que el juego sea más grande, tengo ideas para la optimización, pero no hay suficiente tiempo. Las vacaciones de Año Nuevo son muy bienvenidas, espero poder trabajar en el juego. Por cierto, piu-piu se puede instalar apt'om:
 sudo apt install -y piu-piu 

imagen

Feliz año nuevo!

Source: https://habr.com/ru/post/es428439/


All Articles