Skip to content

Commit

Permalink
Provide support for personal and local settings
Browse files Browse the repository at this point in the history
With this patch it will be possible to define customized settings using
user defined files outside of the repository that will override the
values from settings.yml.

This can be useful to adapt sit-environment to the personal environment
characteristics without having to modify the settings.yml file each time
it's updated.

There are two places were personal settings can be defined:

  - ~/.site/settings.yml
    This file can contain settings used by all sit-environments. This
    one overrides configurations from settings.yml.

  - ./local.yml (normally the root of the repo)
    This file can contain settings specific for this instance of the
    repo. This one overrides configurations from settings.yml and
    ~/.site/settings.yml.

Signed-off-by: Xavi Hernandez <[email protected]>
  • Loading branch information
xhernandez committed Jan 18, 2024
1 parent 4323eae commit 8ac38c9
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 38 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,4 @@ playbooks/ssh-config-host
playbooks/Vagrantfile
playbooks/ansible/config.yml
devel/authorized_keys
local.yml
29 changes: 27 additions & 2 deletions playbooks/roles/local.defaults/tasks/main.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,32 @@
---
- name: Load settings
- name: Load global settings
include_vars:
file: "settings.yml"
name: global_settings
file: settings.yml

- name: Load personal settings
include_vars:
name: personal_settings
file: ~/.site/settings.yml
failed_when: false

- name: Load local settings
include_vars:
name: local_settings
file: "{{ lookup('env', 'PWD') | default('.') }}/local.yml"
failed_when: false

- name: Combine settings
set_fact:
settings: >-
{{
global_settings |
combine(personal_settings, local_settings,
recursive = true, list_merge = 'append_rp')
}}
- debug:
var: settings

- name: Generate config.yml in ansible directory
template:
Expand Down
70 changes: 35 additions & 35 deletions playbooks/roles/local.defaults/templates/config.yml.j2
Original file line number Diff line number Diff line change
@@ -1,57 +1,57 @@
---
config:
os:
{%- for os_name in os_info +%}
{%- for os_name in settings.os_info +%}
{{ os_name }}:
family: "{{ os_info[os_name].family }}"
distro: "{{ os_info[os_name].distro }}"
version: "{{ os_info[os_name].version }}"
family: "{{ settings.os_info[os_name].family }}"
distro: "{{ settings.os_info[os_name].distro }}"
version: "{{ settings.os_info[os_name].version }}"
includes:
- "{{ os_info[os_name].distro }}{{ os_info[os_name].version}}.yml"
- "{{ os_info[os_name].distro }}.yml"
- "{{ os_info[os_name].family }}.yml"
- "{{ settings.os_info[os_name].distro }}{{ settings.os_info[os_name].version}}.yml"
- "{{ settings.os_info[os_name].distro }}.yml"
- "{{ settings.os_info[os_name].family }}.yml"
{%- endfor +%}

be:
name: "{{ be }}"
variant: "{{ variant }}"

data: {{ environments[be].data | default({}) }}
data: {{ settings.environments[be].data | default({}) }}

paths: {{ paths }}
paths: {{ settings.paths }}

tests: {{ tests }}
tests: {{ settings.tests }}

provisioners:
{%- for prov in environments[be].nodes | dict2items | map(attribute='value.provisioner', default='vagrant') | unique +%}
{%- for prov in settings.environments[be].nodes | dict2items | map(attribute='value.provisioner', default='vagrant') | unique +%}
{{ prov }}:
{%- for item in provisioners[prov] | default({}) +%}
{{ item }}: {{ provisioners[prov][item] }}
{%- for item in settings.provisioners[prov] | default({}) +%}
{{ item }}: {{ settings.provisioners[prov][item] }}
{%- endfor +%}
hosts:
{%- for name in environments[be].nodes +%}
{%- set data = environments[be].nodes[name] +%}
{%- if data.provisioner | default(environments[be].provisioner | default('vagrant')) == prov +%}
{%- for name in settings.environments[be].nodes +%}
{%- set data = settings.environments[be].nodes[name] +%}
{%- if data.provisioner | default(settings.environments[be].provisioner | default('vagrant')) == prov +%}
{%- for idx in range(data.instances | default(1)) +%}
- {{ name }}{{ idx }}
{%- endfor +%}
{%- endif +%}
{%- endfor +%}
{%- endfor +%}

{%- set total_mem = max_memory * ((memory | default(resources.memory | default(50))) | int) / 100 +%}
{%- set total_cpu = max_cpu * ((cpu | default(resources.cpu | default(100))) | int) / 100 +%}
{%- set total_mem = max_memory * ((memory | default(settings.resources.memory | default(50))) | int) / 100 +%}
{%- set total_cpu = max_cpu * ((cpu | default(settings.resources.cpu | default(100))) | int) / 100 +%}
{%- set extra_mem = 0 +%}
{%- set extra_cpu = 0 +%}
{%- set base_mem = [] +%}
{%- set base_cpu = [] +%}
{%- set weight_mem = [] +%}
{%- set weight_cpu = [] +%}
{%- for name in environments[be].nodes +%}
{%- set data = environments[be].nodes[name] +%}
{%- for name in settings.environments[be].nodes +%}
{%- set data = settings.environments[be].nodes[name] +%}
{%- set count = data.instances | default(1) +%}
{%- set _ = base_mem.append(count * (data.memory | default(environments[be].memory))) +%}
{%- set _ = base_cpu.append(count * (data.cpus | default(environments[be].cpus))) +%}
{%- set _ = base_mem.append(count * (data.memory | default(settings.environments[be].memory))) +%}
{%- set _ = base_cpu.append(count * (data.cpus | default(settings.environments[be].cpus))) +%}
{%- set _ = weight_mem.append(count * (data.memory_weight | default(1))) +%}
{%- set _ = weight_cpu.append(count * (data.cpu_weight | default(1))) +%}
{%- endfor +%}
Expand All @@ -67,37 +67,37 @@ config:
{%- endif +%}

nodes:
{%- for name in environments[be].nodes +%}
{%- set data = environments[be].nodes[name] +%}
{%- set prov = data.provisioner | default(environments[be].provisioner | default('vagrant')) +%}
{%- for name in settings.environments[be].nodes +%}
{%- set data = settings.environments[be].nodes[name] +%}
{%- set prov = data.provisioner | default(settings.environments[be].provisioner | default('vagrant')) +%}
{%- for idx in range(data.instances | default(1)) +%}
{{ name }}{{ idx }}:
groups: {{ data.groups }}
provisioner: {{ prov }}
os: {{ data.os | default(environments[be].os | default(os)) }}
cpus: {{ (data.cpus | default(environments[be].cpus)) + ((extra_cpu * (data.cpu_weight | default(1))) | int) }}
memory: {{ (data.memory | default(environments[be].memory)) + 1024 * ((extra_mem * (data.memory_weight | default(1))) | int) }}
os: {{ data.os | default(settings.environments[be].os | default(os)) }}
cpus: {{ (data.cpus | default(settings.environments[be].cpus)) + ((extra_cpu * (data.cpu_weight | default(1))) | int) }}
memory: {{ (data.memory | default(settings.environments[be].memory)) + 1024 * ((extra_mem * (data.memory_weight | default(1))) | int) }}
disks: {{ data.disks | default([]) }}
networks:
{%- for net in data.networks | default({}) +%}
{{ net }}: {{ provisioners[prov].networks[net] | ansible.utils.ipaddr(data.networks[net] + idx) | ansible.utils.ipaddr('address') }}
{{ net }}: {{ settings.provisioners[prov].networks[net] | ansible.utils.ipaddr(data.networks[net] + idx) | ansible.utils.ipaddr('address') }}
{%- endfor +%}
ctdb:
{%- for net in data.ctdb | default({}) +%}
{{ net }}: {{ provisioners[prov].networks[net] | ansible.utils.ipaddr(data.ctdb[net] + idx) | ansible.utils.ipaddr('address') }}
{{ net }}: {{ settings.provisioners[prov].networks[net] | ansible.utils.ipaddr(data.ctdb[net] + idx) | ansible.utils.ipaddr('address') }}
{%- endfor +%}
{%- endfor +%}
{%- endfor +%}

groups:
{%- for group in environments[be].nodes.values() | map(attribute='groups') | flatten | unique | list +%}
{%- for group in settings.environments[be].nodes.values() | map(attribute='groups') | flatten | unique | list +%}
{{ group }}:
{%- for host in environments[be].nodes | dict2items | selectattr('value.groups', 'contains', group) | map(attribute='key') | list +%}
{%- for idx in range(environments[be].nodes[host].instances | default(1)) +%}
{%- for host in settings.environments[be].nodes | dict2items | selectattr('value.groups', 'contains', group) | map(attribute='key') | list +%}
{%- for idx in range(settings.environments[be].nodes[host].instances | default(1)) +%}
- {{ host }}{{ idx }}
{%- endfor +%}
{%- endfor +%}
{%- endfor +%}

statedir: "{{ misc.host.statedir }}/sit_statedump"
configdir: "{{ misc.host.configdir }}"
statedir: "{{ settings.misc.host.statedir }}/sit_statedump"
configdir: "{{ settings.misc.host.configdir }}"
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ Vagrant.configure("2") do |config|
{%- set node = config.nodes[host] %}
{%- set vm_idx = loop.index0 +%}
config.vm.define "{{ host }}" do |node|
node.vm.box = "{{ provisioners[node.provisioner].images[node.os] }}"
node.vm.box = "{{ settings.provisioners[node.provisioner].images[node.os] }}"
node.vm.hostname = "{{ host }}"
{%- for net in node.networks +%}
node.vm.network :private_network, ip: "{{ node.networks[net] }}"
Expand Down

0 comments on commit 8ac38c9

Please sign in to comment.