roles/ansible-gentoo_install/
This commit is contained in:
parent
94c76b2e4b
commit
f2575772ec
@ -1,5 +1,5 @@
|
|||||||
[defaults]
|
[defaults]
|
||||||
log_path = var/tmp/2023/12/30/pentoo/base_proxy_toxcore.log
|
log_path = var/tmp/2023/12/31/pentoo/base_proxy_toxcore.log
|
||||||
callback_plugins = ./lib/plugins/
|
callback_plugins = ./lib/plugins/
|
||||||
# /i/data/DevOps/net/Http/docs.ansible.com/ansible/intro_configuration.html
|
# /i/data/DevOps/net/Http/docs.ansible.com/ansible/intro_configuration.html
|
||||||
# http://docs.ansible.com/ansible/intro_configuration.html#command-warnings
|
# http://docs.ansible.com/ansible/intro_configuration.html#command-warnings
|
||||||
|
30
hosts.yml
30
hosts.yml
@ -219,12 +219,6 @@ all:
|
|||||||
BOX_ALSO_USERS:
|
BOX_ALSO_USERS:
|
||||||
- gentoo
|
- gentoo
|
||||||
BOX_PROXY_MODE: "{{lookup('env', 'MODE'|default('tor'}}"
|
BOX_PROXY_MODE: "{{lookup('env', 'MODE'|default('tor'}}"
|
||||||
BOX_NBD_DEV: nbd1
|
|
||||||
BOX_NBD_MP: /mnt/gentoo
|
|
||||||
BOX_NBD_FILES: "/i/data/Agile/tmp/Topics/GentooImgr"
|
|
||||||
BOX_NBD_BASE_QCOW: "/g/Agile/tmp/Topics/GentooImgr/gentoo.qcow2"
|
|
||||||
BOX_NBD_OVERLAY_NAME: "gentoo1"
|
|
||||||
BOX_NBD_OVERLAY_QCOW: "/o/var/lib/libvirt/images/gentoo1.qcow2"
|
|
||||||
BOX_GENTOO_FROM_MP: "/mnt/linuxPen19"
|
BOX_GENTOO_FROM_MP: "/mnt/linuxPen19"
|
||||||
|
|
||||||
linuxPen19:
|
linuxPen19:
|
||||||
@ -251,12 +245,6 @@ all:
|
|||||||
BOX_BASE_FEATURES: []
|
BOX_BASE_FEATURES: []
|
||||||
BOX_TOXCORE_FEATURES: ['nbd', 'libvirt', 'docker']
|
BOX_TOXCORE_FEATURES: ['nbd', 'libvirt', 'docker']
|
||||||
BOX_PROXY_MODE: "{{lookup('env', 'MODE'|default('tor'}}"
|
BOX_PROXY_MODE: "{{lookup('env', 'MODE'|default('tor'}}"
|
||||||
BOX_NBD_DEV: nbd1
|
|
||||||
BOX_NBD_MP: /mnt/gentoo
|
|
||||||
BOX_NBD_OVERLAY_NAME: "gentoo1"
|
|
||||||
BOX_NBD_BASE_QCOW: "/g/Agile/tmp/Topics/GentooImgr/gentoo.qcow2"
|
|
||||||
BOX_NBD_OVERLAY_QCOW: "/o/var/lib/libvirt/images/gentoo1.qcow2"
|
|
||||||
BOX_NBD_FILES: "/i/data/Agile/tmp/Topics/GentooImgr"
|
|
||||||
|
|
||||||
# linux_chroot_group vars
|
# linux_chroot_group vars
|
||||||
vars:
|
vars:
|
||||||
@ -271,7 +259,7 @@ all:
|
|||||||
# for a non-root login: ansible_ssh_extra_args: "--userspec=foo:adm"
|
# for a non-root login: ansible_ssh_extra_args: "--userspec=foo:adm"
|
||||||
vars: # linux_unix_group
|
vars: # linux_unix_group
|
||||||
# toxcore
|
# toxcore
|
||||||
BOX_NBD_DEV: nbd1
|
BOX_NBD_DEV: nbd3
|
||||||
BOX_NBD_MP: /mnt/gentoo
|
BOX_NBD_MP: /mnt/gentoo
|
||||||
BOX_NBD_OVERLAY_NAME: "gentoo1"
|
BOX_NBD_OVERLAY_NAME: "gentoo1"
|
||||||
BOX_NBD_FILES: "/i/data/Agile/tmp/Topics/GentooImgr"
|
BOX_NBD_FILES: "/i/data/Agile/tmp/Topics/GentooImgr"
|
||||||
@ -281,18 +269,21 @@ all:
|
|||||||
BOX_NBD_BASE_PROFILE: openrc
|
BOX_NBD_BASE_PROFILE: openrc
|
||||||
BOX_NBD_BASE_DIR: "/a/tmp/GentooImgr"
|
BOX_NBD_BASE_DIR: "/a/tmp/GentooImgr"
|
||||||
BOX_NBD_BASE_QCOW: "{{BOX_NBD_BASE_DIR}}/gentoo.qcow2"
|
BOX_NBD_BASE_QCOW: "{{BOX_NBD_BASE_DIR}}/gentoo.qcow2"
|
||||||
# BOX_NBD_OVERLAY_QCOW: "/o/var/lib/libvirt/images/gentoo1.qcow2"
|
BOX_NBD_OVERLAY_QCOW: "/o/var/lib/libvirt/images/gentoo1.qcow2"
|
||||||
BOX_NBD_BASE_PUBKEY: "/root/.ssh/id_rsa-ansible.pub"
|
BOX_NBD_BASE_PUBKEY: "/root/.ssh/id_rsa-ansible.pub"
|
||||||
|
|
||||||
# libvirt overlay
|
# libvirt overlay
|
||||||
BOX_NBD_OVERLAY_DIR: "/a/tmp/GentooImgr/create-vm"
|
BOX_NBD_OVERLAY_DIR: "/a/tmp/GentooImgr/create-vm"
|
||||||
|
BOX_NBD_LOGLEVEL: 10
|
||||||
BOX_NBD_OVERLAY_GB: "20"
|
BOX_NBD_OVERLAY_GB: "20"
|
||||||
BOX_NBD_OVERLAY_CPUS: 1
|
BOX_NBD_OVERLAY_CPUS: 1
|
||||||
BOX_NBD_OVERLAY_RAM: 2048
|
BOX_NBD_OVERLAY_RAM: 2048
|
||||||
BOX_NBD_OVERLAY_BR: virbr1
|
BOX_NBD_OVERLAY_BR: virbr1
|
||||||
|
# unused?
|
||||||
BOX_NBD_OVERLAY_NETWORK: default
|
BOX_NBD_OVERLAY_NETWORK: default
|
||||||
# plaintext
|
# plaintext
|
||||||
BOX_NBD_OVERLAY_PASS: "gentoo"
|
BOX_NBD_OVERLAY_PASS: "gentoo"
|
||||||
|
BOX_GENTOOIMGR_CONFIGFILE: "/g/Agile/tmp/Topics/GentooImgr/base.json"
|
||||||
|
|
||||||
|
|
||||||
vars:
|
vars:
|
||||||
@ -386,18 +377,25 @@ all:
|
|||||||
BOX_NBD_MP: ""
|
BOX_NBD_MP: ""
|
||||||
BOX_NBD_FILES: ""
|
BOX_NBD_FILES: ""
|
||||||
BOX_NBD_LOGLEVEL: 20
|
BOX_NBD_LOGLEVEL: 20
|
||||||
|
BOX_NBD_PORTAGE_FILE: "{{AGI_NBD_FILES}}/portage-20231223.tar.xz"
|
||||||
|
BOX_NBD_STAGE3_FILE: "{{AGI_NBD_FILES}}/stage3-amd64-openrc-20231217T170203Z.tar.xz"
|
||||||
|
BOX_NBD_KERNEL_DIR: /usr/src/linux
|
||||||
|
BOX_NBD_BASE_PROFILE: openrc
|
||||||
|
BOX_NBD_BASE_DIR: ""
|
||||||
BOX_NBD_BASE_QCOW: ""
|
BOX_NBD_BASE_QCOW: ""
|
||||||
BOX_NBD_BASE_PUBKEY: "/root/.ssh/id_rsa-ansible.pub"
|
BOX_NBD_BASE_PUBKEY: ""
|
||||||
|
|
||||||
# libvirt overlay
|
# libvirt overlay
|
||||||
|
BOX_NBD_OVERLAY_QCOW: ""
|
||||||
BOX_NBD_OVERLAY_DIR: ""
|
BOX_NBD_OVERLAY_DIR: ""
|
||||||
BOX_NBD_OVERLAY_BR: ""
|
BOX_NBD_OVERLAY_BR: ""
|
||||||
BOX_NBD_OVERLAY_GB: "20"
|
BOX_NBD_OVERLAY_GB: "20"
|
||||||
BOX_NBD_OVERLAY_NAME: "gentoo1"
|
BOX_NBD_OVERLAY_NAME: ""
|
||||||
BOX_NBD_OVERLAY_CPUS: 1
|
BOX_NBD_OVERLAY_CPUS: 1
|
||||||
BOX_NBD_OVERLAY_RAM: 2048
|
BOX_NBD_OVERLAY_RAM: 2048
|
||||||
# plaintext
|
# plaintext
|
||||||
BOX_NBD_OVERLAY_PASS: ""
|
BOX_NBD_OVERLAY_PASS: ""
|
||||||
|
BOX_GENTOOIMGR_CONFIGFILE: ""
|
||||||
|
|
||||||
# Controls what compression method is used for new-style ansible modules when
|
# Controls what compression method is used for new-style ansible modules when
|
||||||
# they are sent to the remote system. The compression types depend on having
|
# they are sent to the remote system. The compression types depend on having
|
||||||
|
241
library/#ansible_gentooimgr.py#
Executable file
241
library/#ansible_gentooimgr.py#
Executable file
@ -0,0 +1,241 @@
|
|||||||
|
#!/usr/bin/python3
|
||||||
|
|
||||||
|
from __future__ import (absolute_import, division, print_function)
|
||||||
|
__metaclass__ = type
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import logging
|
||||||
|
from argparse import Namespace
|
||||||
|
import pathlib
|
||||||
|
import traceback
|
||||||
|
|
||||||
|
# in the library
|
||||||
|
mod_path = ''
|
||||||
|
if os.environ.get('PLAY_ANSIBLE_SRC',''):
|
||||||
|
# running from source
|
||||||
|
mod_path = os.environ.get('PLAY_ANSIBLE_SRC','')
|
||||||
|
mod_path = os.path.join(mod_path, 'src', 'ansible_gentooimgr')
|
||||||
|
assert os.path.isdir(mod_path), f"parent {mod_path}"
|
||||||
|
assert os.path.isfile(os.path.join(mod_path, '__init__.py')),f"index {mod_path}"
|
||||||
|
assert os.path.isdir(os.path.join(mod_path, 'gentooimgr')), f"sub {mod_path}"
|
||||||
|
sys.path.append(mod_path)
|
||||||
|
else:
|
||||||
|
# in the library
|
||||||
|
mod_path = os.path.dirname(os.path.realpath('__file__'))
|
||||||
|
mod_path = os.path.join(mod_path, 'src', 'ansible_gentooimgr')
|
||||||
|
assert os.path.isdir(mod_path), f"parent {mod_path}"
|
||||||
|
assert os.path.isfile(os.path.join(mod_path, '__init__.py')),f"index {mod_path}"
|
||||||
|
assert os.path.isdir(os.path.join(mod_path, 'gentooimgr')), f"sub {mod_path}"
|
||||||
|
sys.path.append(mod_path)
|
||||||
|
try:
|
||||||
|
import gentooimgr
|
||||||
|
except Exception as e:
|
||||||
|
sys.stderr.write(f"{mod_path} {sys.path} {traceback.print_exc()}")
|
||||||
|
raise
|
||||||
|
import ansible
|
||||||
|
|
||||||
|
DOCUMENTATION = rf'''
|
||||||
|
---
|
||||||
|
module: gentooimgr
|
||||||
|
|
||||||
|
short_description: Gentoo Image Builder for Cloud and Turnkey ISO installers
|
||||||
|
|
||||||
|
|
||||||
|
version_added: "1.0.0"
|
||||||
|
|
||||||
|
description:
|
||||||
|
* This project enables easy access to building ``systemd`` or ``openrc`` -based images.
|
||||||
|
* Performs automatic download AND verification of the linux iso, stage3 tarball and portage.
|
||||||
|
* Caches the iso and stage3 .txt files for at most a day before redownloading and rechecking for new files
|
||||||
|
* Sane and readable cli commands to build, run and test.
|
||||||
|
* Step system to enable user to continue off at the same place if a step fails
|
||||||
|
* No heavy packages like rust included ** TODO
|
||||||
|
|
||||||
|
options:
|
||||||
|
action:
|
||||||
|
description: The action to be run by the image builder
|
||||||
|
choices:
|
||||||
|
- build
|
||||||
|
- run
|
||||||
|
- status
|
||||||
|
- install
|
||||||
|
- chroot
|
||||||
|
- unchroot
|
||||||
|
- command
|
||||||
|
- shrink
|
||||||
|
- kernel
|
||||||
|
required: true
|
||||||
|
# clean test
|
||||||
|
config:
|
||||||
|
default: cloud.json
|
||||||
|
description: init configuration file or or base.json or cloud.json
|
||||||
|
required: false
|
||||||
|
loglevel:
|
||||||
|
default: {logging.INFO}
|
||||||
|
description: python logging level <= 50, INFO=20
|
||||||
|
required: false
|
||||||
|
threads:
|
||||||
|
default: 1
|
||||||
|
description: Number of threads to use
|
||||||
|
required: false
|
||||||
|
profile:
|
||||||
|
default: openrc
|
||||||
|
description: The init system
|
||||||
|
choices:
|
||||||
|
- openrc
|
||||||
|
- systemd
|
||||||
|
required: false
|
||||||
|
kernel_dir:
|
||||||
|
default: /usr/src/linux
|
||||||
|
description: Where kernel is specified. By default uses the active linux kernel
|
||||||
|
required: false
|
||||||
|
portage:
|
||||||
|
description: Extract the specified portage tarball onto the filesystem
|
||||||
|
required: false
|
||||||
|
stage3:
|
||||||
|
description: Extract the specified stage3 package onto the filesystema
|
||||||
|
required: false
|
||||||
|
action_args:
|
||||||
|
default: []
|
||||||
|
description: Arguments for some of the actions - UNUSED!
|
||||||
|
required: false
|
||||||
|
temporary_dir:
|
||||||
|
description: Path to temporary directory for downloading files (20G)
|
||||||
|
required: false
|
||||||
|
qcow:
|
||||||
|
description: Path to file to serve as the base image
|
||||||
|
required: false
|
||||||
|
|
||||||
|
# Specify this value according to your collection
|
||||||
|
# in format of namespace.collection.doc_fragment_name
|
||||||
|
# extends_documentation_fragment:
|
||||||
|
# - my_namespace.my_collection.my_doc_fragment_name
|
||||||
|
|
||||||
|
author:
|
||||||
|
- Your Name (@yourGitHubHandle)
|
||||||
|
'''
|
||||||
|
|
||||||
|
#[-y DAYS]
|
||||||
|
# [-d DOWNLOAD_DIR]
|
||||||
|
# [-f]
|
||||||
|
# [--format FORMAT]
|
||||||
|
|
||||||
|
EXAMPLES = r'''
|
||||||
|
# Pass in a message
|
||||||
|
- name: Test with a message
|
||||||
|
my_namespace.my_collection.my_test:
|
||||||
|
name: hello world
|
||||||
|
|
||||||
|
# pass in a message and have changed true
|
||||||
|
- name: Test with a message and changed output
|
||||||
|
my_namespace.my_collection.my_test:
|
||||||
|
name: hello world
|
||||||
|
new: true
|
||||||
|
|
||||||
|
# fail the module
|
||||||
|
- name: Test failure of the module
|
||||||
|
my_namespace.my_collection.my_test:
|
||||||
|
name: fail me
|
||||||
|
'''
|
||||||
|
|
||||||
|
RETURN = r'''
|
||||||
|
# These are examples of possible return values, and in general should use other names for return values.
|
||||||
|
message:
|
||||||
|
description: The output message that the test module generates.
|
||||||
|
type: str
|
||||||
|
returned: always
|
||||||
|
sample: 'goodbye'
|
||||||
|
'''
|
||||||
|
|
||||||
|
from ansible.module_utils.basic import AnsibleModule
|
||||||
|
|
||||||
|
|
||||||
|
def run_module():
|
||||||
|
# define available arguments/parameters a user can pass to the module
|
||||||
|
#? default config from __file__ ?
|
||||||
|
if mod_path and os.path.isdir(mod_path):
|
||||||
|
def_config = os.path.join(mod_path, 'configs', 'base.json')
|
||||||
|
else:
|
||||||
|
# WARN:
|
||||||
|
def_config = 'base.json'
|
||||||
|
module_args = dict(
|
||||||
|
action=dict(type='str', required=True),
|
||||||
|
loglevel=dict(type='int', required=False, default=logging.INFO),
|
||||||
|
threads=dict(type='int', required=False, default=1),
|
||||||
|
config=dict(type='path', default=def_config, required=True),
|
||||||
|
profile=dict(type='str', required=False),
|
||||||
|
kernel_dir=dict(type='path', required=False),
|
||||||
|
portage=dict(type='path', required=False),
|
||||||
|
stage3=dict(type='path', required=False),
|
||||||
|
temporary_dir=dict(type='path', required=False, default=pathlib.Path(os.getcwd())),
|
||||||
|
download_dir=dict(type='path', required=False, default=pathlib.Path(os.getcwd())),
|
||||||
|
qcow=dict(type='path', required=False),
|
||||||
|
)
|
||||||
|
|
||||||
|
# seed the result dict in the object
|
||||||
|
# we primarily care about changed and state
|
||||||
|
# changed is if this module effectively modified the target
|
||||||
|
# state will include any data that you want your module to pass back
|
||||||
|
# for consumption, for example, in a subsequent task
|
||||||
|
result = dict(
|
||||||
|
changed=False,
|
||||||
|
original_message='',
|
||||||
|
message=''
|
||||||
|
)
|
||||||
|
|
||||||
|
# the AnsibleModule object will be our abstraction working with Ansible
|
||||||
|
# this includes instantiation, a couple of common attr would be the
|
||||||
|
# args/params passed to the execution, as well as if the module
|
||||||
|
# supports check mode
|
||||||
|
module = AnsibleModule(
|
||||||
|
argument_spec=module_args,
|
||||||
|
supports_check_mode=True
|
||||||
|
)
|
||||||
|
|
||||||
|
# if the user is working with this module in only check mode we do not
|
||||||
|
# want to make any changes to the environment, just return the current
|
||||||
|
# state with no modifications
|
||||||
|
if module.check_mode:
|
||||||
|
module.exit_json(**result)
|
||||||
|
|
||||||
|
# manipulate or modify the state as needed (this is going to be the
|
||||||
|
# part where your module will do what it needs to do)
|
||||||
|
# if module.params.get('thirsty'):
|
||||||
|
|
||||||
|
oargs = Namespace(**module.params)
|
||||||
|
# during the execution of the module, if there is an exception or a
|
||||||
|
# conditional state that effectively causes a failure, run
|
||||||
|
# AnsibleModule.fail_json() to pass in the message and the result
|
||||||
|
result['original_message'] = ""
|
||||||
|
try:
|
||||||
|
from gentooimgr.__main__ import main
|
||||||
|
retval = main(oargs)
|
||||||
|
# should be 0
|
||||||
|
# is stdout already in result? how can it be?
|
||||||
|
except Exception as e:
|
||||||
|
result['message'] = str(e)
|
||||||
|
e = traceback.print_exc()
|
||||||
|
if e: result['original_message'] += f"{e}"
|
||||||
|
module.fail_json(msg='Exception', **result)
|
||||||
|
else:
|
||||||
|
result['message'] = str(retval)
|
||||||
|
|
||||||
|
# use whatever logic you need to determine whether or not this module
|
||||||
|
# made any modifications to your target
|
||||||
|
if dArgs['action'] in ['status', '']:
|
||||||
|
result['changed'] = False
|
||||||
|
else:
|
||||||
|
result['changed'] = True
|
||||||
|
|
||||||
|
# in the event of a successful module execution, you will want to
|
||||||
|
# simple AnsibleModule.exit_json(), passing the key/value results
|
||||||
|
module.exit_json(**result)
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
run_module()
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
||||||
|
|
1
library/.#ansible_gentooimgr.py
Symbolic link
1
library/.#ansible_gentooimgr.py
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
root@pentoo.152064:1703733868
|
@ -11,6 +11,7 @@ import pathlib
|
|||||||
import traceback
|
import traceback
|
||||||
|
|
||||||
# in the library
|
# in the library
|
||||||
|
mod_path = ''
|
||||||
if os.environ.get('PLAY_ANSIBLE_SRC',''):
|
if os.environ.get('PLAY_ANSIBLE_SRC',''):
|
||||||
# running from source
|
# running from source
|
||||||
mod_path = os.environ.get('PLAY_ANSIBLE_SRC','')
|
mod_path = os.environ.get('PLAY_ANSIBLE_SRC','')
|
||||||
@ -152,11 +153,17 @@ from ansible.module_utils.basic import AnsibleModule
|
|||||||
|
|
||||||
def run_module():
|
def run_module():
|
||||||
# define available arguments/parameters a user can pass to the module
|
# define available arguments/parameters a user can pass to the module
|
||||||
|
#? default config from __file__ ?
|
||||||
|
if mod_path and os.path.isdir(mod_path):
|
||||||
|
def_config = os.path.join(mod_path, 'configs', 'base.json')
|
||||||
|
else:
|
||||||
|
# WARN:
|
||||||
|
def_config = 'base.json'
|
||||||
module_args = dict(
|
module_args = dict(
|
||||||
action=dict(type='str', required=True),
|
action=dict(type='str', required=True),
|
||||||
loglevel=dict(type='int', required=False, default=logging.INFO),
|
loglevel=dict(type='int', required=False, default=logging.INFO),
|
||||||
threads=dict(type='int', required=False, default=1),
|
threads=dict(type='int', required=False, default=1),
|
||||||
config=dict(type='str', default='cloud.json', required=False),
|
config=dict(type='path', default=def_config, required=True),
|
||||||
profile=dict(type='str', required=False),
|
profile=dict(type='str', required=False),
|
||||||
kernel_dir=dict(type='path', required=False),
|
kernel_dir=dict(type='path', required=False),
|
||||||
portage=dict(type='path', required=False),
|
portage=dict(type='path', required=False),
|
||||||
@ -204,6 +211,8 @@ def run_module():
|
|||||||
try:
|
try:
|
||||||
from gentooimgr.__main__ import main
|
from gentooimgr.__main__ import main
|
||||||
retval = main(oargs)
|
retval = main(oargs)
|
||||||
|
# should be 0
|
||||||
|
# is stdout already in result? how can it be?
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
result['message'] = str(e)
|
result['message'] = str(e)
|
||||||
e = traceback.print_exc()
|
e = traceback.print_exc()
|
||||||
@ -214,7 +223,7 @@ def run_module():
|
|||||||
|
|
||||||
# use whatever logic you need to determine whether or not this module
|
# use whatever logic you need to determine whether or not this module
|
||||||
# made any modifications to your target
|
# made any modifications to your target
|
||||||
if dArgs['action'] in ['status']:
|
if dArgs['action'] in ['status', '']:
|
||||||
result['changed'] = False
|
result['changed'] = False
|
||||||
else:
|
else:
|
||||||
result['changed'] = True
|
result['changed'] = True
|
||||||
@ -227,7 +236,6 @@ def run_module():
|
|||||||
def main():
|
def main():
|
||||||
run_module()
|
run_module()
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
main()
|
main()
|
||||||
|
|
||||||
|
@ -8,8 +8,11 @@ AGI_NBD_MP: "{{BOX_NBD_MP|default('/mnt/gentoo')}}"
|
|||||||
AGI_NBD_FILES: "{{BOX_NBD_FILES}}"
|
AGI_NBD_FILES: "{{BOX_NBD_FILES}}"
|
||||||
AGI_GENTOO_FROM_MP: "{{BOX_GENTOO_FROM_MP}}"
|
AGI_GENTOO_FROM_MP: "{{BOX_GENTOO_FROM_MP}}"
|
||||||
|
|
||||||
|
AGI_GENTOOIMGR_CONFIGFILE: "{{AGI_NBD_FILES}}/base.json"
|
||||||
|
|
||||||
AGI_PROXY_MODE: "{{PROXY_MODE|default('')}}"
|
AGI_PROXY_MODE: "{{PROXY_MODE|default('')}}"
|
||||||
|
|
||||||
|
AGI_use_local_kernel: false
|
||||||
AGI_install_disklabel: msdos
|
AGI_install_disklabel: msdos
|
||||||
AGI_install_timezone: UTC
|
AGI_install_timezone: UTC
|
||||||
AGI_install_locales:
|
AGI_install_locales:
|
||||||
|
@ -103,12 +103,12 @@
|
|||||||
shell: |
|
shell: |
|
||||||
cd {{AGI_GENTOO_FROM_MP}} || exit 1
|
cd {{AGI_GENTOO_FROM_MP}} || exit 1
|
||||||
for dir in {{AGI_bootstrap_dirs}}; do
|
for dir in {{AGI_bootstrap_dirs}}; do
|
||||||
[ -d "{{AGI_NBD_MP}}/{{dir}}" ] && continue
|
[ -d "{{AGI_NBD_MP}}/$dir" ] && continue
|
||||||
mkdir -p "{{AGI_NBD_MP}}/{{dir}}"
|
mkdir -p "{{AGI_NBD_MP}}/$dir"
|
||||||
done
|
done
|
||||||
for file in {{AGI_bootstrap_files}}; do
|
for file in {{AGI_bootstrap_files}}; do
|
||||||
[ -f "{{AGI_NBD_MP}}/{{file}}" ] && continue
|
[ -f "{{AGI_NBD_MP}}/$file" ] && continue
|
||||||
cp -np "$file" "{{AGI_NBD_MP}}/{{file}}"
|
cp -np "$file" "{{AGI_NBD_MP}}/$file"
|
||||||
done
|
done
|
||||||
|
|
||||||
# dracut
|
# dracut
|
||||||
|
@ -9,13 +9,6 @@
|
|||||||
- set_fact:
|
- set_fact:
|
||||||
AGI_target: Gentoo2
|
AGI_target: Gentoo2
|
||||||
|
|
||||||
- name: "ansible-gentoo_install"
|
|
||||||
set_fact:
|
|
||||||
ansible_check_mode: false
|
|
||||||
when:
|
|
||||||
- "'ansible-gentoo_install' in ROLES"
|
|
||||||
- ansible_check_mode is true
|
|
||||||
|
|
||||||
- name: look for nbd partitions
|
- name: look for nbd partitions
|
||||||
shell: |
|
shell: |
|
||||||
grep nbd /proc/partitions | head -1|sed -e 's/.* //'
|
grep nbd /proc/partitions | head -1|sed -e 's/.* //'
|
||||||
@ -40,7 +33,7 @@
|
|||||||
[ -d '{{PLAY_ANSIBLE_SRC}}/src/ansible_gentooimgr/gentooimgr' ] || exit 3
|
[ -d '{{PLAY_ANSIBLE_SRC}}/src/ansible_gentooimgr/gentooimgr' ] || exit 3
|
||||||
[ -f '{{PLAY_ANSIBLE_SRC}}/src/ansible_gentooimgr/gentooimgr/__init__.py' ] || exit 4
|
[ -f '{{PLAY_ANSIBLE_SRC}}/src/ansible_gentooimgr/gentooimgr/__init__.py' ] || exit 4
|
||||||
{{ansible_python_interpreter}} \
|
{{ansible_python_interpreter}} \
|
||||||
-c "import os sys; sys.path.append('{{PLAY_ANSIBLE_SRC}}/src/ansible_gentooimgr'); import gentooimgr; print(os.path.dirname(gentooimgr.__file__))"
|
-c "import os, sys; sys.path.append('{{PLAY_ANSIBLE_SRC}}/src/ansible_gentooimgr'); import gentooimgr; print(os.path.dirname(gentooimgr.__file__))" || exit 5
|
||||||
register: gentooimgr_out
|
register: gentooimgr_out
|
||||||
check_mode: false
|
check_mode: false
|
||||||
ignore_errors: true
|
ignore_errors: true
|
||||||
@ -49,18 +42,72 @@
|
|||||||
|
|
||||||
- name: set AGI_gentooimgr_configs
|
- name: set AGI_gentooimgr_configs
|
||||||
set_fact:
|
set_fact:
|
||||||
AGI_gentooimgr_configs: "{{gentooimgr_out.stdout}}/configs"
|
AGI_gentooimgr_configs: "{{gentooimgr_out.stdout_lines[-1]}}/configs"
|
||||||
|
|
||||||
- name: ansible_gentooimgr nbd status
|
- name: check for a gentooimgr base config
|
||||||
|
shell: |
|
||||||
|
if [ -z "{{BOX_NBD_DEV}}" ] ; then
|
||||||
|
echo ERROR: empty "BOX_NBD_DEV" - define it in hosts.yml
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if ! grep -q "{{BOX_NBD_DEV}}" /proc/partitions ; then
|
||||||
|
echo ERROR: not mounted BOX_NBD_DEV="{{BOX_NBD_DEV}}" - use qemu-nbd
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
exit 0
|
||||||
|
|
||||||
|
- name: make a gentooimgr base config
|
||||||
|
shell: |
|
||||||
|
base=base.json
|
||||||
|
tofile="{{AGI_GENTOOIMGR_CONFIGFILE}}"
|
||||||
|
todir=`dirname "$tofile"`
|
||||||
|
[ -d $todir ] || mkdir $todir
|
||||||
|
if [ ! -f "$tofile" ] ; then
|
||||||
|
if [ -f "{{AGI_gentooimgr_configs}}/$base" ] ; then
|
||||||
|
cp -p "{{AGI_gentooimgr_configs}}/$base" "$tofile" || exit 2
|
||||||
|
else
|
||||||
|
echo WARN: FNF "{{AGI_gentooimgr_configs}}/$base"
|
||||||
|
# use base.json
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
# should operate on json with jq
|
||||||
|
# "imgsize": "20G",
|
||||||
|
# "memory": 4096,
|
||||||
|
# "mountpoint": "/mnt/gentoo",
|
||||||
|
# "imagename": null,
|
||||||
|
# "initsys": "openrc",
|
||||||
|
# "iso": null,
|
||||||
|
# "portage": null,
|
||||||
|
# "stage3": null,
|
||||||
|
# "partition": 1
|
||||||
|
if [ -f "$tofile" ] ; then
|
||||||
|
# but this is crucial
|
||||||
|
# "disk": "/dev/sda",
|
||||||
|
sed -i -e 's@"disk": ".*"@"disk": "'{{BOX_NBD_DEV}}'"@' $tofile
|
||||||
|
grep {{BOX_NBD_DEV}} $tofile || exit 4
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: check for library/ansible_gentooimgr.py
|
||||||
|
shell: |
|
||||||
|
# find it
|
||||||
|
[ -f '{{PLAY_ANSIBLE_SRC}}/library/ansible_gentooimgr.py' ] || exit 1
|
||||||
|
# run it
|
||||||
|
echo '{}' | \
|
||||||
|
{{ansible_python_interpreter}} \
|
||||||
|
'{{PLAY_ANSIBLE_SRC}}/library/ansible_gentooimgr.py' 2>&1| \
|
||||||
|
grep "Unable to figure out what parameters were passed" && exit 0
|
||||||
|
echo WARN: ansible_gentooimgr.py BROKEN
|
||||||
|
|
||||||
|
- name: ansible_gentooimgr NBD STATUS
|
||||||
ansible_gentooimgr:
|
ansible_gentooimgr:
|
||||||
action: status
|
action: status
|
||||||
loglevel: "{{BOX_NBD_LOGLEVEL}}"
|
loglevel: "{{BOX_NBD_LOGLEVEL}}"
|
||||||
threads: 1
|
threads: 1
|
||||||
config: base.config
|
config: "{{AGI_GENTOOIMGR_CONFIGFILE}}" # base.json - bare filename in configs
|
||||||
profile: "{{BOX_NBD_BASE_PROFILE}}"
|
profile: "{{BOX_NBD_BASE_PROFILE}}"
|
||||||
kernel_dir: "{{BOX_NBD_KERNEL_DIR}}"
|
kernel_dir: "{{BOX_NBD_KERNEL_DIR}}"
|
||||||
portage: '{{BOX_NBD_PORTAGE_FILE}}'
|
portage: "{{BOX_NBD_PORTAGE_FILE}}"
|
||||||
stage3: '{{BOX_NBD_STAGE3_FILE }}'
|
stage3: "{{BOX_NBD_STAGE3_FILE }}"
|
||||||
temporary_dir: "{{BOX_NBD_BASE_DIR}}"
|
temporary_dir: "{{BOX_NBD_BASE_DIR}}"
|
||||||
download_dir: "{{AGI_NBD_FILES}}"
|
download_dir: "{{AGI_NBD_FILES}}"
|
||||||
register: ansible_gentooimgr_out
|
register: ansible_gentooimgr_out
|
||||||
|
@ -12,20 +12,6 @@
|
|||||||
[ -d "{{AGI_NBD_MP}}" ] || exit 3
|
[ -d "{{AGI_NBD_MP}}" ] || exit 3
|
||||||
check_mode: false
|
check_mode: false
|
||||||
|
|
||||||
- name: gpg keys system
|
|
||||||
# Option --keyserver must be used to
|
|
||||||
environment: "{{proxy_env}}"
|
|
||||||
shell: |
|
|
||||||
/usr/bin/gpg --list-keys | grep "{{ item.uid }}" || \
|
|
||||||
/usr/bin/gpg --recv-keys \
|
|
||||||
--keyserver "{{ AGI_GPG_SERVER }}" "{{ item.uid }}"
|
|
||||||
with_items: "{{ agi_gpg_keys_system }}"
|
|
||||||
when:
|
|
||||||
- agi_gpg_keys_system|length > 0
|
|
||||||
- BASE_ARE_CONNECTED|default('') != ''
|
|
||||||
# FixMe:
|
|
||||||
ignore_errors: true
|
|
||||||
|
|
||||||
- name: check files dir
|
- name: check files dir
|
||||||
environment: "{{shell_env}}"
|
environment: "{{shell_env}}"
|
||||||
shell: |
|
shell: |
|
||||||
@ -138,6 +124,20 @@
|
|||||||
when:
|
when:
|
||||||
- "ansible_distribution == 'Gentoo'"
|
- "ansible_distribution == 'Gentoo'"
|
||||||
|
|
||||||
|
- name: gpg keys system
|
||||||
|
# Option --keyserver must be used to
|
||||||
|
environment: "{{proxy_env}}"
|
||||||
|
shell: |
|
||||||
|
/usr/bin/gpg --list-keys | grep "{{ item.uid }}" || \
|
||||||
|
/usr/bin/gpg --recv-keys \
|
||||||
|
--keyserver "{{ AGI_GPG_SERVER }}" "{{ item.uid }}"
|
||||||
|
with_items: "{{ agi_gpg_keys_system }}"
|
||||||
|
when:
|
||||||
|
- agi_gpg_keys_system|length > 0
|
||||||
|
- BASE_ARE_CONNECTED|default('') != ''
|
||||||
|
# FixMe:
|
||||||
|
ignore_errors: true
|
||||||
|
|
||||||
- name: test portage tarball gpg our copy
|
- name: test portage tarball gpg our copy
|
||||||
environment: "{{shell_env}}"
|
environment: "{{shell_env}}"
|
||||||
shell: |
|
shell: |
|
||||||
@ -145,6 +145,8 @@
|
|||||||
gpg --list-keys | grep E1D6ABB63BFCFB4BA02FDF1CEC590EEAC9189250 || exit 2
|
gpg --list-keys | grep E1D6ABB63BFCFB4BA02FDF1CEC590EEAC9189250 || exit 2
|
||||||
gpg --verify "{{AGI_NBD_FILES}}/{{ latest_portage_tarball }}.gpgsig" \
|
gpg --verify "{{AGI_NBD_FILES}}/{{ latest_portage_tarball }}.gpgsig" \
|
||||||
"{{AGI_NBD_FILES}}/{{ latest_portage_tarball }}" || exit 3$?
|
"{{AGI_NBD_FILES}}/{{ latest_portage_tarball }}" || exit 3$?
|
||||||
|
# FixMe:
|
||||||
|
ignore_errors: true
|
||||||
|
|
||||||
- name: extract portage tarball
|
- name: extract portage tarball
|
||||||
unarchive:
|
unarchive:
|
||||||
|
@ -69,6 +69,7 @@ AGI_bootstrap_pkgs:
|
|||||||
- sys-libs/gpm
|
- sys-libs/gpm
|
||||||
- app-portage/eix
|
- app-portage/eix
|
||||||
- www-client/lynx
|
- www-client/lynx
|
||||||
|
- linux-firmware
|
||||||
|
|
||||||
AGI_cloud_pkgs:
|
AGI_cloud_pkgs:
|
||||||
# get these from base.json
|
# get these from base.json
|
||||||
@ -87,7 +88,6 @@ AGI_cloud_pkgs:
|
|||||||
- pciutils
|
- pciutils
|
||||||
- net-misc/ntp
|
- net-misc/ntp
|
||||||
- net-fs/nfs-utils
|
- net-fs/nfs-utils
|
||||||
- linux-firmware
|
|
||||||
# get these from config.json
|
# get these from config.json
|
||||||
- app-emulation/cloud-init
|
- app-emulation/cloud-init
|
||||||
- sys-block/open-iscsi
|
- sys-block/open-iscsi
|
||||||
|
@ -2,16 +2,18 @@ GentooImgr: Gentoo Image Builder for Cloud and Turnkey ISO installers
|
|||||||
=====================================================================
|
=====================================================================
|
||||||
|
|
||||||
**This is a modified version of https://github.com/NucleaPeon/gentooimgr/
|
**This is a modified version of https://github.com/NucleaPeon/gentooimgr/
|
||||||
where we've modified the code a little to do use Python logging. We can
|
where we've modified the code a little to do use Python logging and maybe fixed a bug or two. We can still use it for the build stage, but we think the install stage is better done using ansible, hence the libvirt_cloud playbook; you don't check return values in your install steps, and I'm confused on the precedence of the config json file.
|
||||||
still use it for the build stage, but we think the install stage is better
|
|
||||||
done using ansible, hence the libvirt_cloud playbook.
|
I think you should merge args into the configjson object and have the code work only on the merged object: the precedence shouldn't be down in the code.
|
||||||
|
|
||||||
|
The code is a WIP so look to see if the repo is active. It's being supported as an ansible module using library/ansible_gentooimgr.py which is a work in progress; the idea is to use it for the build and status test? actions, but handle the install tasks using ansible.
|
||||||
|
|
||||||
|
Instead of using cloud-init, our approach is to build a base image with qemu-guest-agent installed which means you don't need cloud-init. That means you don't need 384 crates of opaque googled code. Apart from making the base smaller, it makes it auditable, I can't imaging why the libvirt base images on the Internet don't include qemu-guest-agent.........
|
||||||
|
|
||||||
|
Take any of the code you want back into your repo: I think the changes are all logging and bulletproofing. If you use ansible you can maintain the library file. If you don't maybe it a good time to look at it, because writing the install in Python will be painfully limiting, and it may take you a while to write tests.py.
|
||||||
|
|
||||||
|
Please wrap the code after if __name__ == "__main__" in __main__.py into a function that returns an int, 0 on success so it's callable from an import.
|
||||||
|
|
||||||
The code is in overlay/Linux/usr/local/src/ansible_gentooimgr
|
|
||||||
for reasons to do with how the ansible role transfers files.
|
|
||||||
The code is being supported as an ansible module using
|
|
||||||
library/ansible_gentooimgr.py which is a work in progress; the idea
|
|
||||||
is to use it for the build and status actions, but handle the install
|
|
||||||
tasks using ansible.
|
|
||||||
**
|
**
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user