LINUX.ORG.RU
решено ФорумAdmin

Ubuntu server/Ansible/lxc не добавляется строка в файл

 ,


0

1

Доброй ночи!

В плэйбуке есть 2 строки:

'''

  • name: allow ssh root login

    command: lxc-attach -n ubu3 – echo «PermitRootLogin yes» | tee -a /etc/ssh/sshd_config > /dev/null && systemctl restart ssh

'''

Энсибл выдаёт следующую инфу при выполнении задачи:

'''

changed: [localhost] => {

"changed": true,

"cmd": [

    "lxc-attach",

    "-n",

    "ubu3",

    "--",

    "echo",

    "PermitRootLogin yes",

    "|",

    "tee",

    "-a",

    "/etc/ssh/sshd_config",

    ">",

    "/dev/null",

    "&&",

    "systemctl",

    "restart",

    "ssh"

],

"delta": "0:00:00.023631",

"end": "2023-01-20 01:03:09.815855",

"invocation": {

    "module_args": {

        "_raw_params": "lxc-attach -n ubu3 -- echo 

"PermitRootLogin yes" | tee -a /etc/ssh/sshd_config > /dev/null && systemctl restart ssh",

        "_uses_shell": false,

        "argv": null,

        "chdir": null,

        "creates": null,

        "executable": null,

        "removes": null,

        "stdin": null,

        "stdin_add_newline": true,

        "strip_empty_ends": true,

        "warn": false

    }

},

"msg": "",

"rc": 0,

"start": "2023-01-20 01:03:09.792224",

"stderr": "",

"stderr_lines": [],

"stdout": "PermitRootLogin yes | tee -a 

/etc/ssh/sshd_config > /dev/null && systemctl restart ssh",

"stdout_lines": [

    "PermitRootLogin yes | tee -a /etc/ssh/sshd_config > 

/dev/null && systemctl restart ssh"

'''

Изменений в файле не происходит. Почему?



Последнее исправление: paa66 (всего исправлений: 1)

А нет, у тебя, возможно, ещё веселее:

"stdout": "PermitRootLogin yes | tee -a /etc/ssh/sshd_config > /dev/null && systemctl restart ssh",

Вот эта строчка говорит нам, что команда lxc-attach -n ubu3 -- echo "PermitRootLogin yes" | tee -a /etc/ssh/sshd_config > /dev/null && systemctl restart ssh выполняется только до «--», а всё что после этого — не выполняется. Это связано с тем, как ansible парсит ввод команд.

В интернетах рекомендуют всю команду положить в скрипт, скрипт скопировать на удалённую машину во временную директорию и потом выполнить. И удалить, если надо.

Aceler ★★★★★
()
Последнее исправление: Aceler (всего исправлений: 1)
Ответ на: комментарий от adn

Я установил lxc на Убунту сервер. В контейнере есть 2 юзера без пароля: root и ubuntu. Доступ по ssh не настроен. Я смотрел видео, читал, как делают другие: все начинают с настройки доступа по ssh. Из этого делаю вывод, что этот модуль бесполезен в моём случае.

paa66
() автор топика
Ответ на: комментарий от paa66

Из этого делаю вывод, что этот модуль бесполезен в моём случае.

очень странный вывод, особенно учитывая что модуль работает через через команды lxc, а не чере ssh соединение

btw: а зачем тебе root login через ssh? ansible же умеет su и sudo использовать

adn ★★★★
()
Ответ на: комментарий от paa66

И это. Лучше официальную документацию использовать, а не видео смотреть и блогеров читать. Обычно квалификация таких медийных товарищей достаточно низкая, а их подходы странные. Потом просто придется переучиваться.

adn ★★★★
()
Ответ на: комментарий от adn

модуль работает через через команды lxc, а не чере ssh соединение

Я знаю 3 способа взаимодействия с lxc: запуск bash напрямую в контейнере, минуя логин (этот вариант я как раз и использую в Ansible, т.к. свежеустановленный контейнер имеет пользователей root и ubuntu без паролей); вход через консоль (тут нужен пароль, мне это не подходит); вход через ssh (тоже нужен пароль).

а зачем тебе root login через ssh? ansible же умеет su и sudo использовать

Экспериментирую :))

На самом деле с помощью Ansible создал пользователя, которого надо было наделить правами sudo, а для этого, по-моему, надо было ввести пароль от рута. Сейчас уже точно не помню про этот момент, но в будущем предполагаю идти по этому пути.

paa66
() автор топика
Ответ на: комментарий от vel

Нафига эта конструкция с echo & tail, если есть sed ?

sed -ie ‘$aPermitRootLogin yes’ /etc/ssh/sshd_config

Спасибо, добрый человек :) Всё сработало.

«Крылья, крылья… Хвост!» - напомнило из известного мультика прикол («Лыпы, крылья и хвосты», кажется, называется) :))

paa66
() автор топика
Ответ на: комментарий от Aceler

В интернетах рекомендуют всю команду положить в скрипт, скрипт скопировать на удалённую машину во временную директорию и потом выполнить. И удалить, если надо.

Этот вариант я рассматривал как крайнюю меру, т.к. стараюсь всё делать через Ansible. Но я всё-таки попробую сделать через shell: может прокатит?

paa66
() автор топика
Ответ на: комментарий от Aceler

Если всё делать через ansible, то надо использовать модуль lxc для ansible.

Я уже отвечал adn’y, что после установки у контейнера есть 2 пользователя (root и ubuntu), у которых нет пароля. Управление контейнером возможно через консоль и ssh, но для этого нужен пароль. По этой причине вынужден от этих способов отказаться, а применять применять attach, при таком подходе пароль не требуется. Я смотрел видео, где для использования модулей Ansible сначала настраивали ssh, т.е. имели на удалённой машине пользователя и пароль. Или я чего-то не знаю?

paa66
() автор топика
Ответ на: комментарий от paa66

А модуль lxc разве использует ssh? По-моему, он как раз использует lxc-attach и по этой причине ему не нужны реквизиты доступа.

Попробуй такой код:

name: Run a command in a container and then restart it
  community.general.lxc_container:
    name: test-container-started
    state: restarted
    container_command: |
      sed -ie '$aPermitRootLogin yes' /etc/ssh/sshd_config

Если затребует пароль от контейнера — значит, я не прав :-)

Aceler ★★★★★
()
Ответ на: комментарий от Aceler

Сделал так:

  - name: copy adduser script file
    command: cp -a /etc/ansible/adduser /var/lib/lxc/ubu3/rootfs/home/
  - name: Run a command in a container and then restart it
      community.general.lxc_container:
        name: test-container-started
        state: restarted
        container_command: |
          sed -ie '$aPermitRootLogin yes' /home/adduser

Система выдала ошибку:

ERROR! We were unable to read either as JSON nor YAML, these are the errors we got from each:
JSON: Expecting value: line 1 column 1 (char 0)

Syntax Error while loading YAML.
  mapping values are not allowed in this context

The error appears to be in '/etc/ansible/play1.yml': line 85, column 38, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:

  - name: Run a command in a container and then restart it
      community.general.lxc_container:
                                     ^ here

Специально показал предыдущую команду, чтобы было видно разметку yml.

paa66
() автор топика
Ответ на: комментарий от paa66

Ну очевидно, что name и community.general.lxc-container должны быть на одном уровне, ну ты как будто первый раз в Ansible. У меня при копировании пробел в первой строке пропал, что ж теперь :-)

Aceler ★★★★★
()
Ответ на: комментарий от Aceler

Оказалось, нарушил разметку yaml, надо было так:

  - name: run a command in container
    community.general.lxc_container:
      name: test container started
      state: restarted
      container_command: |
        sed -ie '$aPermitRootLogin yes' /home/adduser

Код заработал, но выдало ошибку:


"msg": "The `lxc` module is not importable. Check the requirements."

paa66
() автор топика
Ответ на: комментарий от Aceler

Оказалось, надо было установить python3-lxc. Установил, но теперь выдало другую ошибку, привожу весь текст:

TASK [run a command in container] *********************************************************************************************************************************
task path: /etc/ansible/play1.yml:84
<localhost> ESTABLISH LOCAL CONNECTION FOR USER: root
<localhost> EXEC /bin/sh -c 'echo ~root && sleep 0'
<localhost> EXEC /bin/sh -c '( umask 77 && mkdir -p "` echo /root/.ansible/tmp `"&& mkdir "` echo /root/.ansible/tmp/ansible-tmp-1674239225.0734332-56271-168704419867928 `" && echo ansible-tmp-1674239225.0734332-56271-168704419867928="` echo /root/.ansible/tmp/ansible-tmp-1674239225.0734332-56271-168704419867928 `" ) && sleep 0'
Using module file /root/.ansible/collections/ansible_collections/community/general/plugins/modules/lxc_container.py
<localhost> PUT /root/.ansible/tmp/ansible-local-556689oim2w9s/tmp179x5tz9 TO /root/.ansible/tmp/ansible-tmp-1674239225.0734332-56271-168704419867928/AnsiballZ_lxc_container.py
<localhost> EXEC /bin/sh -c 'chmod u+x /root/.ansible/tmp/ansible-tmp-1674239225.0734332-56271-168704419867928/ /root/.ansible/tmp/ansible-tmp-1674239225.0734332-56271-168704419867928/AnsiballZ_lxc_container.py && sleep 0'
<localhost> EXEC /bin/sh -c '/usr/bin/python3 /root/.ansible/tmp/ansible-tmp-1674239225.0734332-56271-168704419867928/AnsiballZ_lxc_container.py && sleep 0'
<localhost> EXEC /bin/sh -c 'rm -f -r /root/.ansible/tmp/ansible-tmp-1674239225.0734332-56271-168704419867928/ > /dev/null 2>&1 && sleep 0'
fatal: [localhost]: FAILED! => {
    "changed": false,
    "command": "/usr/bin/lxc-create --name test container started --quiet --template ubuntu --bdev dir",
    "err": "",
    "invocation": {
        "module_args": {
            "archive": false,
            "archive_compression": "gzip",
            "archive_path": null,
            "backing_store": "dir",
            "clone_name": null,
            "clone_snapshot": false,
            "config": null,
            "container_command": "sed -ie '$aPermitRootLogin yes' /home/adduser\n",
            "container_config": null,
            "container_log": false,
            "container_log_level": "INFO",
            "directory": null,
            "fs_size": "5G",
            "fs_type": "ext4",
            "lv_name": "test container started",
            "lxc_path": null,
            "name": "test container started",
            "state": "restarted",
            "template": "ubuntu",
            "template_options": null,
            "thinpool": null,
            "vg_name": "lxc",
            "zfs_root": null
        }
    },
    "msg": "Failed executing lxc-create.",
    "rc": 1
}
paa66
() автор топика
Ответ на: комментарий от paa66

Команда: /usr/bin/lxc-create --name test container started --quiet --template ubuntu --bdev dir

Ответ: Failed executing lxc-create.

У тебя на локалхосте есть lxc? Если есть, то не знаю, от рута не выполняется. Попробуй эту команду вручную от рута, посмотри, что не так.

Aceler ★★★★★
()
Ответ на: комментарий от Aceler

У тебя на локалхосте есть lxc?

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

Попробуй эту команду вручную от рута, посмотри, что не так.

При запуске команды долго что-то скачивалось, был создан контейнер test: команда выполнилась.

paa66
() автор топика
Ответ на: комментарий от paa66

При запуске команды долго что-то скачивалось, был создан контейнер test: команда выполнилась.

А не должна, потому что у тебя в плейбуке написана чушь. Имя контейнера не может содержать пробелы.

Aceler ★★★★★
()
Ответ на: комментарий от Aceler

А не должна, потому что у тебя в плейбуке написана чушь. Имя контейнера не может содержать пробелы.

Сделал в плэйбуке название test_container_started и такой контейнер создался. Я оказался неправ. Огромное спасибо! Теперь буду копать в другом направлении. Для меня это открытие.

paa66
() автор топика
Ответ на: комментарий от paa66

Тебе достаточно было пройти по моей ссылке и прочитать официальную документацию. Там и про то как он работает и про python3-lxc и примеры на все случаи жизни, но нет, мы верим исключительно блоггерам, которые тоже видимо не умеют читать.

adn ★★★★
()