Compare commits
2 Commits
31c7c2522f
...
5c2ec9ce78
Author | SHA1 | Date | |
---|---|---|---|
5c2ec9ce78 | |||
f2a6a4ac1f |
@@ -66,7 +66,7 @@ pvc:
|
|||||||
path: "/var/home/joshua/pvc"
|
path: "/var/home/joshua/pvc"
|
||||||
|
|
||||||
# Path to the deploy key (if applicable) used to clone and pull the repository
|
# Path to the deploy key (if applicable) used to clone and pull the repository
|
||||||
keyfile: "/var/home/joshua/id_ed25519.joshua.key"
|
key_file: "/var/home/joshua/id_ed25519.joshua.key"
|
||||||
|
|
||||||
# Git remote URI for the repository
|
# Git remote URI for the repository
|
||||||
remote: "ssh://git@git.bonifacelabs.ca:2222/bonifacelabs/pvc.git"
|
remote: "ssh://git@git.bonifacelabs.ca:2222/bonifacelabs/pvc.git"
|
||||||
@@ -77,6 +77,9 @@ pvc:
|
|||||||
# Clusters configuration file
|
# Clusters configuration file
|
||||||
clusters_file: "clusters.yml"
|
clusters_file: "clusters.yml"
|
||||||
|
|
||||||
|
# Lock file to use for Git interaction
|
||||||
|
lock_file: "/run/pvcbootstrapd.lock"
|
||||||
|
|
||||||
# Filenames of the various group_vars components of a cluster
|
# Filenames of the various group_vars components of a cluster
|
||||||
# Generally with pvc-ansible this will contain 2 files: "base.yml", and "pvc.yml"; refer to the
|
# Generally with pvc-ansible this will contain 2 files: "base.yml", and "pvc.yml"; refer to the
|
||||||
# pvc-ansible documentation and examples for details on these files.
|
# pvc-ansible documentation and examples for details on these files.
|
||||||
|
@@ -179,7 +179,7 @@ def read_config():
|
|||||||
)
|
)
|
||||||
|
|
||||||
# Get the Ansible configuration
|
# Get the Ansible configuration
|
||||||
for key in ["path", "keyfile", "remote", "branch", "clusters_file"]:
|
for key in ["path", "key_file", "remote", "branch", "clusters_file", "lock_file"]:
|
||||||
try:
|
try:
|
||||||
config[f"ansible_{key}"] = o_ansible[key]
|
config[f"ansible_{key}"] = o_ansible[key]
|
||||||
except Exception:
|
except Exception:
|
||||||
|
@@ -66,7 +66,7 @@ def run_bootstrap(config, cspec, cluster, nodes):
|
|||||||
limit=f"{cluster.name}",
|
limit=f"{cluster.name}",
|
||||||
playbook=f"{config['ansible_path']}/pvc.yml",
|
playbook=f"{config['ansible_path']}/pvc.yml",
|
||||||
extravars={
|
extravars={
|
||||||
"ansible_ssh_private_key_file": config["ansible_keyfile"],
|
"ansible_ssh_private_key_file": config["ansible_key_file"],
|
||||||
"bootstrap": "yes",
|
"bootstrap": "yes",
|
||||||
},
|
},
|
||||||
forks=len(nodes),
|
forks=len(nodes),
|
||||||
|
@@ -22,6 +22,7 @@
|
|||||||
import os.path
|
import os.path
|
||||||
import git
|
import git
|
||||||
import yaml
|
import yaml
|
||||||
|
from filelock import FileLock
|
||||||
|
|
||||||
import pvcbootstrapd.lib.notifications as notifications
|
import pvcbootstrapd.lib.notifications as notifications
|
||||||
|
|
||||||
@@ -36,7 +37,7 @@ def init_repository(config):
|
|||||||
Clone the Ansible git repository
|
Clone the Ansible git repository
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
git_ssh_cmd = f"ssh -i {config['ansible_keyfile']} -o StrictHostKeyChecking=no"
|
git_ssh_cmd = f"ssh -i {config['ansible_key_file']} -o StrictHostKeyChecking=no"
|
||||||
if not os.path.exists(config["ansible_path"]):
|
if not os.path.exists(config["ansible_path"]):
|
||||||
print(
|
print(
|
||||||
f"First run: cloning repository {config['ansible_remote']} branch {config['ansible_branch']} to {config['ansible_path']}"
|
f"First run: cloning repository {config['ansible_remote']} branch {config['ansible_branch']} to {config['ansible_path']}"
|
||||||
@@ -60,61 +61,65 @@ def pull_repository(config):
|
|||||||
"""
|
"""
|
||||||
Pull (with rebase) the Ansible git repository
|
Pull (with rebase) the Ansible git repository
|
||||||
"""
|
"""
|
||||||
logger.info(f"Updating local configuration repository {config['ansible_path']}")
|
with FileLock(config['ansible_lock_file']):
|
||||||
try:
|
logger.info(f"Updating local configuration repository {config['ansible_path']}")
|
||||||
git_ssh_cmd = f"ssh -i {config['ansible_keyfile']} -o StrictHostKeyChecking=no"
|
try:
|
||||||
g = git.cmd.Git(f"{config['ansible_path']}")
|
git_ssh_cmd = f"ssh -i {config['ansible_key_file']} -o StrictHostKeyChecking=no"
|
||||||
g.pull(rebase=True, env=dict(GIT_SSH_COMMAND=git_ssh_cmd))
|
g = git.cmd.Git(f"{config['ansible_path']}")
|
||||||
g.submodule("update", "--init", env=dict(GIT_SSH_COMMAND=git_ssh_cmd))
|
logger.debug("Performing git pull")
|
||||||
except Exception as e:
|
g.pull(rebase=True, env=dict(GIT_SSH_COMMAND=git_ssh_cmd))
|
||||||
logger.warn(e)
|
logger.debug("Performing git submodule update")
|
||||||
notifications.send_webhook(config, "failure", "Failed to update Git repository")
|
g.submodule("update", "--init", env=dict(GIT_SSH_COMMAND=git_ssh_cmd))
|
||||||
|
except Exception as e:
|
||||||
|
logger.warn(e)
|
||||||
|
notifications.send_webhook(config, "failure", "Failed to update Git repository")
|
||||||
|
logger.info("Completed repository synchonization")
|
||||||
|
|
||||||
|
|
||||||
def commit_repository(config):
|
def commit_repository(config):
|
||||||
"""
|
"""
|
||||||
Commit uncommitted changes to the Ansible git repository
|
Commit uncommitted changes to the Ansible git repository
|
||||||
"""
|
"""
|
||||||
logger.info(
|
with FileLock(config['ansible_lock_file']):
|
||||||
f"Committing changes to local configuration repository {config['ansible_path']}"
|
logger.info(
|
||||||
)
|
f"Committing changes to local configuration repository {config['ansible_path']}"
|
||||||
|
|
||||||
try:
|
|
||||||
g = git.cmd.Git(f"{config['ansible_path']}")
|
|
||||||
g.add("--all")
|
|
||||||
commit_env = {
|
|
||||||
"GIT_COMMITTER_NAME": "PVC Bootstrap",
|
|
||||||
"GIT_COMMITTER_EMAIL": "git@pvcbootstrapd",
|
|
||||||
}
|
|
||||||
g.commit(
|
|
||||||
"-m",
|
|
||||||
"Automated commit from PVC Bootstrap Ansible subsystem",
|
|
||||||
author="PVC Bootstrap <git@pvcbootstrapd>",
|
|
||||||
env=commit_env,
|
|
||||||
)
|
)
|
||||||
notifications.send_webhook(config, "success", "Successfully committed to Git repository")
|
try:
|
||||||
except Exception as e:
|
g = git.cmd.Git(f"{config['ansible_path']}")
|
||||||
logger.warn(e)
|
g.add("--all")
|
||||||
notifications.send_webhook(config, "failure", "Failed to commit to Git repository")
|
commit_env = {
|
||||||
|
"GIT_COMMITTER_NAME": "PVC Bootstrap",
|
||||||
|
"GIT_COMMITTER_EMAIL": "git@pvcbootstrapd",
|
||||||
|
}
|
||||||
|
g.commit(
|
||||||
|
"-m",
|
||||||
|
"Automated commit from PVC Bootstrap Ansible subsystem",
|
||||||
|
author="PVC Bootstrap <git@pvcbootstrapd>",
|
||||||
|
env=commit_env,
|
||||||
|
)
|
||||||
|
notifications.send_webhook(config, "success", "Successfully committed to Git repository")
|
||||||
|
except Exception as e:
|
||||||
|
logger.warn(e)
|
||||||
|
notifications.send_webhook(config, "failure", "Failed to commit to Git repository")
|
||||||
|
|
||||||
|
|
||||||
def push_repository(config):
|
def push_repository(config):
|
||||||
"""
|
"""
|
||||||
Push changes to the default remote
|
Push changes to the default remote
|
||||||
"""
|
"""
|
||||||
logger.info(
|
with FileLock(config['ansible_lock_file']):
|
||||||
f"Pushing changes from local configuration repository {config['ansible_path']}"
|
logger.info(
|
||||||
)
|
f"Pushing changes from local configuration repository {config['ansible_path']}"
|
||||||
|
)
|
||||||
try:
|
try:
|
||||||
git_ssh_cmd = f"ssh -i {config['ansible_keyfile']} -o StrictHostKeyChecking=no"
|
git_ssh_cmd = f"ssh -i {config['ansible_key_file']} -o StrictHostKeyChecking=no"
|
||||||
g = git.Repo(f"{config['ansible_path']}")
|
g = git.Repo(f"{config['ansible_path']}")
|
||||||
origin = g.remote(name="origin")
|
origin = g.remote(name="origin")
|
||||||
origin.push(env=dict(GIT_SSH_COMMAND=git_ssh_cmd))
|
origin.push(env=dict(GIT_SSH_COMMAND=git_ssh_cmd))
|
||||||
notifications.send_webhook(config, "success", "Successfully pushed Git repository")
|
notifications.send_webhook(config, "success", "Successfully pushed Git repository")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.warn(e)
|
logger.warn(e)
|
||||||
notifications.send_webhook(config, "failure", "Failed to push Git repository")
|
notifications.send_webhook(config, "failure", "Failed to push Git repository")
|
||||||
|
|
||||||
|
|
||||||
def load_cspec_yaml(config):
|
def load_cspec_yaml(config):
|
||||||
|
@@ -43,7 +43,7 @@ def run_paramiko(config, node_address):
|
|||||||
ssh_client.connect(
|
ssh_client.connect(
|
||||||
hostname=node_address,
|
hostname=node_address,
|
||||||
username=config["deploy_username"],
|
username=config["deploy_username"],
|
||||||
key_filename=config["ansible_keyfile"],
|
key_filename=config["ansible_key_file"],
|
||||||
)
|
)
|
||||||
yield ssh_client
|
yield ssh_client
|
||||||
ssh_client.close()
|
ssh_client.close()
|
||||||
|
@@ -43,7 +43,7 @@ def init_tftp(config):
|
|||||||
os.makedirs(config["tftp_root_path"])
|
os.makedirs(config["tftp_root_path"])
|
||||||
os.makedirs(config["tftp_host_path"])
|
os.makedirs(config["tftp_host_path"])
|
||||||
shutil.copyfile(
|
shutil.copyfile(
|
||||||
f"{config['ansible_keyfile']}.pub", f"{config['tftp_root_path']}/keys.txt"
|
f"{config['ansible_key_file']}.pub", f"{config['tftp_root_path']}/keys.txt"
|
||||||
)
|
)
|
||||||
|
|
||||||
build_tftp_repository(config)
|
build_tftp_repository(config)
|
||||||
|
Reference in New Issue
Block a user