Можно ли проверить open_ports в очарование juju?

Я пишу подчиненный брелок, который откроет определенный порт с помощью Charmhelpers.core.hookenv.open_port. Теперь я хочу развернуть тот же подчиненный брелок на другой брелок, который находится на той же машине. Проблема, с которой я столкнулся, заключается в том, что мой порт, который я хочу открыть, уже открыт другим подчиненным брелком, поэтому мои брелки подсказывают мне ошибку:

subprocess.CalledProcessError: Command '['open-port', '8080/TCP']' returned non-zero exit status 1

Я не могу открыть один и тот же порт дважды та же машина, которая имеет смысл, но в Charmhelpers.core.hookenv я не могу найти какой-либо метод, который позволил бы перечислить все открытые порты. Есть ли способ, как я могу проверить свой чарм, если мой порт уже открыт или нет?

1
задан 5 December 2017 в 17:41

2 ответа

Из документов видно, что вы можете использовать инструмент подключения открытых портов:

https://jujucharms.com/docs/stable/reference-hook-tools#opened-ports

Похоже, что это в помощниках очарования здесь:

https://github.com/juju/charm-helpers/blob/dfd42251406f4f45dc4a2317ee4e02171239979f/charmhelpers/core/hookenv .py # L689

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

1
ответ дан 5 December 2017 в 17:41

Чтобы ответить на вопрос, заданный в заголовке: да!

Charms, написанные на Python

Библиотека charmhelpers включает в себя функции, которые вам нужны:

from charmhelpers.core.hookenv import opened_ports

opened_ports() предоставит вам список открытых диапазонов портов и протоколов:

>>> opened_ports()
['80/tcp', '8081-8083/tcp', 'icmp']

Протокол icmp является специальным, так как нет номеров портов.

Не-Python прелести

Если вы хотите сделать это вне Python, ваш скрипт должен выполнить команду оболочки:

open-ports

Вам нужно будет интерпретировать его вывод изнутри ваш обработчик крюка. Итак, что же на самом деле обеспечивает команда open-ports? Вы можете поэкспериментировать, войдя в систему с защищенной оболочкой и выполнив команду самостоятельно.

Сначала мы устанавливаем модель по умолчанию с помощью брелка ubuntu:

$ juju bootstrap localhost c-testing
$ juju deploy ubuntu

Теперь мы можем попросить Джуджу предоставить нам прямой доступ к машине, на которой работает брелок ubuntu в контексте ubuntu/0 unit:

$ juju run --unit ubuntu/0 -- opened-ports --help
Usage: opened-ports [options]

Summary:
lists all ports or ranges opened by the unit

Options:
--format  (= smart)
    Specify output format (json|smart|yaml)
-o, --output (= "")
    Specify an output file

Details:
Each list entry has format <port>/<protocol> (e.g. "80/tcp") or
<from>-<to>/<protocol> (e.g. "8080-8088/udp").

Просто чтобы подтвердить, мы можем запустить opened-ports из контекста, который нам небезразличен в облаке, прямо с ноутбука, на котором мы сидим:

$ juju run --unit ubuntu/0 -- opened-ports --format=smart
80/tcp
8081-8083/tcp
icmp

Или, если вы предпочитаете машиночитаемый вывод:

$ juju run --unit ubuntu/0 -- opened-ports --format=json
["icmp","80/tcp","8081-8083/tcp"]

Можем ли мы проверить открытые порты родительского брелка у его подчиненного?

Не без боли. .. Я постараюсь найти ответ, как только понял, что это относительно просто.

1
ответ дан 5 December 2017 в 17:41

Другие вопросы по тегам:

Похожие вопросы: