LINUX.ORG.RU
ФорумAdmin

ansible запустить playbook без хостов, так как хост создается в процессе

 


0

2

Привет, у меня хитрая плейбука.

Она должна работать с lxc контейнером, который не существует на момент запуска.

Первая задача это создание lxc контейнера, которая делигируется на localhost, затем хост созданного контейнера добавляется в инвентори и идет работа с самим контейнером

Примерно так:

- name: Create a started container
  lxd_container:
    name: "{{ lxc_name | default('test-container') }}"
    state: started
    source:
      type: image
      mode: pull
      server: https://images.linuxcontainers.org
      protocol: simplestreams
      alias: ubuntu/xenial/amd64
    profiles: ["test"]
    wait_for_ipv4_addresses: true
    timeout: 600
  delegate_to: 127.0.0.1

- name: register container
    add_host:
      name: "{{ lxc_name | default('test-container') }}"
      ansible_connection: lxd

-name: some task for container
.....

Как ее запустить, указав в инвентори хост, имя которого берется с переменной?

★★★★

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

я создаю отдельный таск с

  gather_facts: no
. Который именно создает контейнер(или проверяет что он уже создан/изменяет параметры контейнера).

А lxD_container - нормально работает?

у меня lxC (на Debian 10) просто используется и баг покоя не дает, приходится делать все через мега костыль.

anonymous
()
- name: register container
  add_host:
    name: "{{ lxc_name | default('test-container') }}"
    ansible_connection: lxd
    group: lxd_hosts   

- hosts: lxd_hosts

  tasks:
  - name: some tasks for container
  

Вроде так.

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

Вроде так.

add_host я уже использую. Ваш пример не запустится без хостов в инвентори. И кстати, я не знаю, как запихать - hosts: lxd_hosts в структуру роли с папками, где tasks это отдельная папка.

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

gather_facts: no

те без проверки он вообще не станет ругаться, что ему вообще не дали хостов с которыми ему работать?

А lxD_container - нормально работает?

Все супер c ним.

По моему вопросу я нашел обходное решение. Я делаю плейбуку с направленную на хост lxd. Создаю контейнер , на лету добавляю его в хост и затем либо там же сразу делаю delegate_to:container_name , либо запускаю на него уже отдельную роль в зависимости от задач.

---
- name: Create a profile
  lxd_profile:
    name: "{{ profile_name | default('test') }}"
    config: {}
    description: test
    devices:
        eth0:
            ipv4.address: "{{ lxc_ip | default('10.9.9.222') }}"
            name: eth0
            nictype: bridged
            parent: lxdbr0
            type: nic
        root:
            path: /
            pool: default
            type: disk

- name: Create a started container
  lxd_container:
    name: "{{ lxc_name | default('test') }}"
    state: started
    source:
      type: image
      mode: pull
      server: https://images.linuxcontainers.org
      protocol: simplestreams 
      alias: ubuntu/xenial/amd64
    profiles: ["{{ profile_name | default('test') }}"]
    wait_for_ipv4_addresses: true
    timeout: 600

#- name: register container
#  add_host:
#    name: "{{ lxc_name | default('test') }}"
#    ansible_connection: lxd

- name: Check for Python
  raw: lxc exec "{{ lxc_name | default('test') }}" -- test -e /usr/bin/python
  changed_when: false
  failed_when: false
  register: check_python

- name: install python in container
  raw: lxc exec "{{ lxc_name | default('test') }}" -- apt-get --force-yes -y  install  python
  when: check_python.rc != 0


#- name: Install packages
#  action: apt pkg={{ item }} state=present
#  with_items:
#    - mc
#  delegate_to: "{{ lxc_name | default('test') }}"

#- name: Set up multiple authorized keys
#  authorized_key:
#    user: root
#    state: present
#    key: '{{ item }}'
#  with_file:
#    - public_keys/sdf
#  register: add_identity_keys
#  delegate_to: "{{ lxc_name | default('test') }}"
constin ★★★★
() автор топика
Ответ на: комментарий от constin

А вот и работает. :P

  1 ---
  2 - name: Test
  3   hosts: localhost
  4   gather_facts: no
  5
  6   tasks:
  7   - name: Register New Hosts
  8     add_host:
  9       name: rv-mm-001
 10       ansible_ssh_user: admin
 11       group: rv_mac                # Добавляем в группу in-memory
 12
 13 - hosts: rv_mac                    # Таски для хостов в группе
 14
 15   tasks:
 16   - name: Test
 17     ping:

Ес-сно у меня свалился с ошибкой т.к. я не указывал данные для подключения
Но, тем не менее

[xxxxxx@xx-ansible ansible]$ ansible-playbook test.yml
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'


PLAY [Test] ************************************************************************************************************************************************************

TASK [Register New Hosts] **********************************************************************************************************************************************
changed: [localhost]

PLAY [rv_mac] **********************************************************************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************************************************************
fatal: [rv-mm-001]: UNREACHABLE! => changed=false
  msg: 'Failed to connect to the host via ssh: ssh: connect to host rv-mm-001 port 22: Connection timed out'
  unreachable: true

PLAY RECAP *************************************************************************************************************************************************************
localhost                  : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
rv-mm-001                  : ok=0    changed=0    unreachable=1    failed=0    skipped=0    rescued=0    ignored=0

i3wm
()
Ответ на: комментарий от constin

«delegate_to: (какой нибудь сервер с доступом к lxc/lxd)» в каждом степе джоба.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.