Fabric использует конфигурационный файл хоста - PullRequest
0 голосов
/ 14 февраля 2019

После долгих чтений я все еще не понимаю, как это действительно работает.Например, если у меня есть файл конфигурации hosts.yml, подобный этому:

hosts.yml:

server1:
  host: serverip
  user: username

Как мне использовать это для создания Соединения?Мне пришлось переименовать hosts.yml в fabric.yml, чтобы получить доступ к этим данным через переменную контекста, например:

@task
def do(ctx):
    ctx['server1']

И он вернет DataProxy, который я не могу использовать для созданиясоединение, или я просто не нашел в документации

Моя еще одна проблема: как можно указать эти хосты, объявленные в файле hosts.yml с переключателем -H?Это работает, только если я создаю псевдоним в файле ~ / .ssh / config , который совсем не так хорош.

1 Ответ

0 голосов
/ 28 февраля 2019

Я отвечу на оба вопроса, приведя пример, в котором вы читаете внешний файл (файл .env), в котором хранится информация о хосте, к которому вы пытаетесь подключиться с конкретным пользователем.

info.envcontent:

# The hostname of the server you want to connect to 
DP_HOST=myserverAlias

# Username you use to connect to the remote server. It must be an existing user
DP_USER=bence

~/.ssh/config contnet:

Host myserverAlias //it must be identical to the value of DP_HOST in info.env
     Hostname THE_HOSTNAME_OR_THE_IP_ADDRESS
     User bence //it must be identical to the value of DP_USER in info.env
     Port 22

Теперь у вас fabfile.py вы должны сделать следующее

from pathlib import Path
from fabric import Connection as connection, task
import os
from dotenv import load_dotenv
import logging as logger
from paramiko import AuthenticationException, SSHException


@task
def deploy(ctx, env=None):
    logger.basicConfig(level=logger.INFO)
    logger.basicConfig(format='%(name)s ----------------------------------- %(message)s')

    if env is None:
        logger.error("Env variable and branch name are required!, try to call it as follows : ")
        exit()
    # Load the env files
    if os.path.exists(env):
        load_dotenv(dotenv_path=env, verbose=True)
        logger.info("The ENV file is successfully loaded")
    else:
        logger.error("The ENV is not found")
        exit()
    user = os.getenv("DP_USER")
    host = os.getenv("DP_HOST")
    try:
        with connection(host=host, user=user,) as c:
            c.run('whoami')
            c.run('mkdir new_dir')
    except AuthenticationException as message:
        print(message)
    except SSHException as message:
        print(message)

Тогда вы можете позвонить вамfabfile.py с помощью следующей команды:

fab deploy -e info.env 

Убедитесь, что ваш info.env находится в том же каталоге, что и ваш fabfile.py

...