actualized for kubespray version 2.28.0
This commit is contained in:
@@ -1,8 +1,11 @@
|
||||
---
|
||||
# Set to true to allow pre-checks to fail and continue deployment
|
||||
ignore_assert_errors: false
|
||||
|
||||
epel_enabled: false
|
||||
# Set to false to disable the backup parameter, set to true to accumulate backups of config files.
|
||||
leave_etc_backup_files: true
|
||||
nameservers: []
|
||||
cloud_resolver: []
|
||||
disable_host_nameservers: false
|
||||
# Kubespray sets this to true after clusterDNS is running to apply changes to the host resolv.conf
|
||||
dns_late: false
|
||||
|
||||
@@ -51,26 +54,7 @@ etc_hosts_localhost_entries:
|
||||
minimal_node_memory_mb: 1024
|
||||
minimal_master_memory_mb: 1500
|
||||
|
||||
yum_repo_dir: /etc/yum.repos.d
|
||||
|
||||
# number of times package install task should be retried
|
||||
pkg_install_retries: 4
|
||||
|
||||
# Check if access_ip responds to ping. Set false if your firewall blocks ICMP.
|
||||
ping_access_ip: true
|
||||
|
||||
## NTP Settings
|
||||
# Start the ntpd or chrony service and enable it at system boot.
|
||||
ntp_enabled: false
|
||||
# The package to install which provides NTP functionality.
|
||||
# The default is ntp for most platforms, or chrony on RHEL/CentOS 7 and later.
|
||||
# The ntp_package can be one of ['ntp', 'chrony']
|
||||
ntp_package: >-
|
||||
{% if ansible_os_family == "RedHat" -%}
|
||||
chrony
|
||||
{%- else -%}
|
||||
ntp
|
||||
{%- endif -%}
|
||||
|
||||
# Manage the NTP configuration file.
|
||||
ntp_manage_config: false
|
||||
@@ -95,8 +79,13 @@ ntp_filter_interface: false
|
||||
# - listen xxx
|
||||
# The NTP driftfile path
|
||||
# Only takes effect when ntp_manage_config is true.
|
||||
ntp_driftfile: /var/lib/ntp/ntp.drift
|
||||
# Enable tinker panic is useful when running NTP in a VM environment.
|
||||
# Default value is `/var/lib/ntp/ntp.drift`, for ntpsec use '/var/lib/ntpsec/ntp.drift'
|
||||
ntp_driftfile: >-
|
||||
{% if ntp_package == "ntpsec" -%}
|
||||
/var/lib/ntpsec/ntp.drift
|
||||
{%- else -%}
|
||||
/var/lib/ntp/ntp.drift
|
||||
{%- endif -%}
|
||||
# Only takes effect when ntp_manage_config is true.
|
||||
ntp_tinker_panic: false
|
||||
|
||||
|
||||
@@ -1,80 +0,0 @@
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"$id": "https://kubespray.io/internal/os_packages.schema.json",
|
||||
"title": "Os packages",
|
||||
"description": "Criteria for selecting packages to install on Kubernetes nodes during installation by Kubespray",
|
||||
"type": "object",
|
||||
"patternProperties": {
|
||||
".*": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"enabled": {
|
||||
"description": "Escape hatch to filter packages. The value is expected to be pre-resolved to a boolean by Jinja",
|
||||
"type": "boolean",
|
||||
"default": true
|
||||
},
|
||||
"groups": {
|
||||
"description": "Match if the host is in one of these groups. If not specified match any host.",
|
||||
"type": "array",
|
||||
"minItems": 1,
|
||||
"items":{
|
||||
"type": "string",
|
||||
"pattern": "^[0-9A-Za-z_]*$"
|
||||
}
|
||||
},
|
||||
"os": {
|
||||
"type": "object",
|
||||
"description": "If not specified match any OS. Otherwise, must match by 'families' or 'distributions' to be included.",
|
||||
"additionalProperties": false,
|
||||
"minProperties": 1,
|
||||
"properties": {
|
||||
"families": {
|
||||
"description": "Match if ansible_os_family is part of the list.",
|
||||
"type": "array",
|
||||
"minItems": 1,
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"distributions": {
|
||||
"type": "object",
|
||||
"description": "Match if ansible_distribution match one of defined keys.",
|
||||
"minProperties": 1,
|
||||
"patternProperties": {
|
||||
".*": {
|
||||
"description": "Match if either the value is the empty hash, or one major_versions/versions/releases contains the corresponding variable ('ansible_distrbution_*')",
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"major_versions": {
|
||||
"type": "array",
|
||||
"minItems": 1,
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"versions": {
|
||||
"type": "array",
|
||||
"minItems": 1,
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"releases": {
|
||||
"type": "array",
|
||||
"minItems": 1,
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -35,7 +35,7 @@
|
||||
get_checksum: false
|
||||
get_mime: false
|
||||
register: kube_apiserver_set
|
||||
when: inventory_hostname in groups['kube_control_plane'] and dns_mode != 'none' and resolvconf_mode == 'host_resolvconf'
|
||||
when: ('kube_control_plane' in group_names) and dns_mode != 'none' and resolvconf_mode == 'host_resolvconf'
|
||||
listen: Preinstall | propagate resolvconf to k8s components
|
||||
|
||||
# FIXME(mattymo): Also restart for kubeadm mode
|
||||
@@ -46,7 +46,7 @@
|
||||
get_checksum: false
|
||||
get_mime: false
|
||||
register: kube_controller_set
|
||||
when: inventory_hostname in groups['kube_control_plane'] and dns_mode != 'none' and resolvconf_mode == 'host_resolvconf'
|
||||
when: ('kube_control_plane' in group_names) and dns_mode != 'none' and resolvconf_mode == 'host_resolvconf'
|
||||
listen: Preinstall | propagate resolvconf to k8s components
|
||||
|
||||
- name: Preinstall | restart kube-controller-manager docker
|
||||
@@ -55,7 +55,7 @@
|
||||
executable: /bin/bash
|
||||
when:
|
||||
- container_manager == "docker"
|
||||
- inventory_hostname in groups['kube_control_plane']
|
||||
- ('kube_control_plane' in group_names)
|
||||
- dns_mode != 'none'
|
||||
- resolvconf_mode == 'host_resolvconf'
|
||||
- kube_controller_set.stat.exists
|
||||
@@ -71,7 +71,7 @@
|
||||
until: preinstall_restart_controller_manager.rc == 0
|
||||
when:
|
||||
- container_manager in ['crio', 'containerd']
|
||||
- inventory_hostname in groups['kube_control_plane']
|
||||
- ('kube_control_plane' in group_names)
|
||||
- dns_mode != 'none'
|
||||
- resolvconf_mode == 'host_resolvconf'
|
||||
- kube_controller_set.stat.exists
|
||||
@@ -83,7 +83,7 @@
|
||||
executable: /bin/bash
|
||||
when:
|
||||
- container_manager == "docker"
|
||||
- inventory_hostname in groups['kube_control_plane']
|
||||
- ('kube_control_plane' in group_names)
|
||||
- dns_mode != 'none'
|
||||
- resolvconf_mode == 'host_resolvconf'
|
||||
- kube_apiserver_set.stat.exists
|
||||
@@ -99,7 +99,7 @@
|
||||
delay: 1
|
||||
when:
|
||||
- container_manager in ['crio', 'containerd']
|
||||
- inventory_hostname in groups['kube_control_plane']
|
||||
- ('kube_control_plane' in group_names)
|
||||
- dns_mode != 'none'
|
||||
- resolvconf_mode == 'host_resolvconf'
|
||||
- kube_apiserver_set.stat.exists
|
||||
@@ -116,7 +116,7 @@
|
||||
delay: 1
|
||||
when:
|
||||
- dns_late
|
||||
- inventory_hostname in groups['kube_control_plane']
|
||||
- ('kube_control_plane' in group_names)
|
||||
- dns_mode != 'none'
|
||||
- resolvconf_mode == 'host_resolvconf'
|
||||
- not ansible_os_family in ["Flatcar", "Flatcar Container Linux by Kinvolk"] and not is_fedora_coreos
|
||||
|
||||
@@ -33,30 +33,12 @@
|
||||
failed_when: false
|
||||
register: resolvconf_stat
|
||||
|
||||
- name: Fetch resolvconf
|
||||
when: resolvconf_stat.stat.exists is defined and resolvconf_stat.stat.exists
|
||||
block:
|
||||
|
||||
- name: Get content of /etc/resolv.conf
|
||||
slurp:
|
||||
src: /etc/resolv.conf
|
||||
register: resolvconf_slurp
|
||||
|
||||
- name: Get currently configured nameservers
|
||||
set_fact:
|
||||
configured_nameservers: "{{ resolvconf_slurp.content | b64decode | regex_findall('^nameserver\\s*(\\S*)', multiline=True) | ansible.utils.ipaddr }}"
|
||||
when: resolvconf_slurp.content is defined
|
||||
|
||||
- name: Stop if /etc/resolv.conf not configured nameservers
|
||||
assert:
|
||||
that: configured_nameservers | length>0
|
||||
fail_msg: "nameserver should not empty in /etc/resolv.conf"
|
||||
when:
|
||||
- not ignore_assert_errors
|
||||
- configured_nameservers is defined
|
||||
- not (upstream_dns_servers is defined and upstream_dns_servers | length > 0)
|
||||
- not (disable_host_nameservers | default(false))
|
||||
- dns_mode in ['coredns', 'coredns_dual']
|
||||
# Used in vars/
|
||||
- name: Fetch resolv.conf
|
||||
when: resolvconf_stat.stat.exists
|
||||
slurp:
|
||||
src: /etc/resolv.conf
|
||||
register: resolvconf_slurp
|
||||
|
||||
- name: NetworkManager | Check if host has NetworkManager
|
||||
# noqa command-instead-of-module - Should we use service_facts for this?
|
||||
@@ -77,19 +59,12 @@
|
||||
- name: Set default dns if remove_default_searchdomains is false
|
||||
set_fact:
|
||||
default_searchdomains: ["default.svc.{{ dns_domain }}", "svc.{{ dns_domain }}"]
|
||||
when: not remove_default_searchdomains | default() | bool or (remove_default_searchdomains | default() | bool and searchdomains | default([]) | length==0)
|
||||
when: not remove_default_searchdomains | default() | bool or (remove_default_searchdomains | default() | bool and searchdomains | length == 0)
|
||||
|
||||
- name: Set dns facts
|
||||
set_fact:
|
||||
resolvconf: >-
|
||||
{%- if resolvconf.rc == 0 and resolvconfd_path.stat.isdir is defined and resolvconfd_path.stat.isdir -%}true{%- else -%}false{%- endif -%}
|
||||
bogus_domains: |-
|
||||
{% for d in default_searchdomains | default([]) + searchdomains | default([]) -%}
|
||||
{{ dns_domain }}.{{ d }}./{{ d }}.{{ d }}./com.{{ d }}./
|
||||
{%- endfor %}
|
||||
cloud_resolver: "{{ ['169.254.169.254'] if cloud_provider is defined and cloud_provider == 'gce' else
|
||||
['169.254.169.253'] if cloud_provider is defined and cloud_provider == 'aws' else
|
||||
[] }}"
|
||||
|
||||
- name: Check if kubelet is configured
|
||||
stat:
|
||||
@@ -154,58 +129,6 @@
|
||||
dhclienthookfile: /etc/dhcp/dhclient-exit-hooks.d/zdnsupdate
|
||||
when: ansible_os_family == "Debian"
|
||||
|
||||
- name: Generate search domains to resolvconf
|
||||
set_fact:
|
||||
searchentries:
|
||||
search {{ (default_searchdomains | default([]) + searchdomains | default([])) | join(' ') }}
|
||||
domainentry:
|
||||
domain {{ dns_domain }}
|
||||
supersede_search:
|
||||
supersede domain-search "{{ (default_searchdomains | default([]) + searchdomains | default([])) | join('", "') }}";
|
||||
supersede_domain:
|
||||
supersede domain-name "{{ dns_domain }}";
|
||||
|
||||
- name: Pick coredns cluster IP or default resolver
|
||||
set_fact:
|
||||
coredns_server: |-
|
||||
{%- if dns_mode == 'coredns' and not dns_early | bool -%}
|
||||
{{ [skydns_server] }}
|
||||
{%- elif dns_mode == 'coredns_dual' and not dns_early | bool -%}
|
||||
{{ [skydns_server] + [skydns_server_secondary] }}
|
||||
{%- elif dns_mode == 'manual' and not dns_early | bool -%}
|
||||
{{ (manual_dns_server.split(',') | list) }}
|
||||
{%- elif dns_mode == 'none' and not dns_early | bool -%}
|
||||
[]
|
||||
{%- elif dns_early | bool -%}
|
||||
{{ upstream_dns_servers | default([]) }}
|
||||
{%- endif -%}
|
||||
|
||||
# This task should only run after cluster/nodelocal DNS is up, otherwise all DNS lookups will timeout
|
||||
- name: Generate nameservers for resolvconf, including cluster DNS
|
||||
set_fact:
|
||||
nameserverentries: |-
|
||||
{{ (([nodelocaldns_ip] if enable_nodelocaldns else []) + (coredns_server | d([]) if not enable_nodelocaldns else []) + nameservers | d([]) + cloud_resolver | d([]) + (configured_nameservers | d([]) if not disable_host_nameservers | d() | bool else [])) | unique | join(',') }}
|
||||
dhclient_supersede_nameserver_entries_list: |-
|
||||
{{ (([nodelocaldns_ip] if enable_nodelocaldns else []) + (coredns_server | d([]) if not enable_nodelocaldns else []) + nameservers | d([]) + cloud_resolver | d([]) + (configured_nameservers | d([]) if not disable_host_nameservers | d() | bool else [])) | unique }}
|
||||
when: not dns_early or dns_late
|
||||
|
||||
# This task should run instead of the above task when cluster/nodelocal DNS hasn't
|
||||
# been deployed yet (like scale.yml/cluster.yml) or when it's down (reset.yml)
|
||||
- name: Generate nameservers for resolvconf, not including cluster DNS
|
||||
set_fact:
|
||||
nameserverentries: |-
|
||||
{{ (nameservers | d([]) + cloud_resolver | d([]) + configured_nameservers | d([])) | unique | join(',') }}
|
||||
dhclient_supersede_nameserver_entries_list: |-
|
||||
{{ (nameservers | d([]) + cloud_resolver | d([])) | unique }}
|
||||
when: dns_early and not dns_late
|
||||
|
||||
- name: Generate supersede_nameserver from dhclient_supersede_nameserver_entries_list
|
||||
set_fact:
|
||||
supersede_nameserver: |-
|
||||
{%- if dhclient_supersede_nameserver_entries_list | length > 0 -%}
|
||||
supersede domain-name-servers {{ dhclient_supersede_nameserver_entries_list | join(', ') }};
|
||||
{%- endif -%}
|
||||
|
||||
- name: Set etcd vars if using kubeadm mode
|
||||
set_fact:
|
||||
etcd_cert_dir: "{{ kube_cert_dir }}"
|
||||
|
||||
@@ -1,19 +1,18 @@
|
||||
---
|
||||
- name: Stop if kube_control_plane group is empty
|
||||
- name: Stop if any host not in '--limit' does not have a fact cache
|
||||
vars:
|
||||
uncached_hosts: "{{ hostvars | dict2items | selectattr('value.ansible_default_ipv6', 'undefined') | selectattr('value.ansible_default_ipv4', 'undefined') | map(attribute='key') }}"
|
||||
excluded_hosts: "{{ groups['k8s_cluster'] | difference(query('inventory_hostnames', ansible_limit)) }}"
|
||||
assert:
|
||||
that: groups.get( 'kube_control_plane' )
|
||||
run_once: true
|
||||
when: not ignore_assert_errors
|
||||
|
||||
- name: Stop if etcd group is empty in external etcd mode
|
||||
assert:
|
||||
that: groups.get('etcd')
|
||||
fail_msg: "Group 'etcd' cannot be empty in external etcd mode"
|
||||
that: uncached_hosts | intersect(excluded_hosts) == []
|
||||
fail_msg: |
|
||||
Kubespray does not support '--limit' without a populated facts cache for the excluded hosts.
|
||||
Please run the facts.yml playbook first without '--limit'.
|
||||
The following excluded hosts are not cached: {{ uncached_hosts | intersect(excluded_hosts) }}
|
||||
run_once: true
|
||||
when:
|
||||
- ansible_limit is defined
|
||||
- not ignore_assert_errors
|
||||
- etcd_deployment_type != "kubeadm"
|
||||
|
||||
- name: Stop if non systemd OS type
|
||||
assert:
|
||||
that: ansible_service_mgr == "systemd"
|
||||
@@ -25,54 +24,19 @@
|
||||
msg: "{{ ansible_distribution }} is not a known OS"
|
||||
when: not ignore_assert_errors
|
||||
|
||||
- name: Stop if unknown network plugin
|
||||
assert:
|
||||
that: kube_network_plugin in ['calico', 'flannel', 'weave', 'cloud', 'cilium', 'cni', 'kube-ovn', 'kube-router', 'macvlan', 'custom_cni']
|
||||
msg: "{{ kube_network_plugin }} is not supported"
|
||||
when:
|
||||
- kube_network_plugin is defined
|
||||
- not ignore_assert_errors
|
||||
|
||||
- name: Stop if unsupported version of Kubernetes
|
||||
assert:
|
||||
that: kube_version is version(kube_version_min_required, '>=')
|
||||
msg: "The current release of Kubespray only support newer version of Kubernetes than {{ kube_version_min_required }} - You are trying to apply {{ kube_version }}"
|
||||
when: not ignore_assert_errors
|
||||
|
||||
# simplify this items-list when https://github.com/ansible/ansible/issues/15753 is resolved
|
||||
- name: "Stop if known booleans are set as strings (Use JSON format on CLI: -e \"{'key': true }\")"
|
||||
assert:
|
||||
that: item.value | type_debug == 'bool'
|
||||
msg: "{{ item.value }} isn't a bool"
|
||||
run_once: true
|
||||
with_items:
|
||||
- { name: download_run_once, value: "{{ download_run_once }}" }
|
||||
- { name: deploy_netchecker, value: "{{ deploy_netchecker }}" }
|
||||
- { name: download_always_pull, value: "{{ download_always_pull }}" }
|
||||
- { name: helm_enabled, value: "{{ helm_enabled }}" }
|
||||
- { name: openstack_lbaas_enabled, value: "{{ openstack_lbaas_enabled }}" }
|
||||
when: not ignore_assert_errors
|
||||
|
||||
- name: Stop if even number of etcd hosts
|
||||
assert:
|
||||
that: groups.etcd | length is not divisibleby 2
|
||||
when:
|
||||
- not ignore_assert_errors
|
||||
- inventory_hostname in groups.get('etcd',[])
|
||||
|
||||
- name: Stop if memory is too small for masters
|
||||
- name: Stop if memory is too small for control plane nodes
|
||||
assert:
|
||||
that: ansible_memtotal_mb >= minimal_master_memory_mb
|
||||
when:
|
||||
- not ignore_assert_errors
|
||||
- inventory_hostname in groups['kube_control_plane']
|
||||
- ('kube_control_plane' in group_names)
|
||||
|
||||
- name: Stop if memory is too small for nodes
|
||||
assert:
|
||||
that: ansible_memtotal_mb >= minimal_node_memory_mb
|
||||
when:
|
||||
- not ignore_assert_errors
|
||||
- inventory_hostname in groups['kube_node']
|
||||
- ('kube_node' in group_names)
|
||||
|
||||
# This command will fail if cgroups are not enabled on the node.
|
||||
# For reference: https://kubernetes.io/docs/concepts/architecture/cgroups/#check-cgroup-version
|
||||
@@ -81,21 +45,6 @@
|
||||
changed_when: false
|
||||
when: not ignore_assert_errors
|
||||
|
||||
# This assertion will fail on the safe side: One can indeed schedule more pods
|
||||
# on a node than the CIDR-range has space for when additional pods use the host
|
||||
# network namespace. It is impossible to ascertain the number of such pods at
|
||||
# provisioning time, so to establish a guarantee, we factor these out.
|
||||
# NOTICE: the check blatantly ignores the inet6-case
|
||||
- name: Guarantee that enough network address space is available for all pods
|
||||
assert:
|
||||
that: "{{ (kubelet_max_pods | default(110)) | int <= (2 ** (32 - kube_network_node_prefix | int)) - 2 }}"
|
||||
msg: "Do not schedule more pods on a node than inet addresses are available."
|
||||
when:
|
||||
- not ignore_assert_errors
|
||||
- inventory_hostname in groups['k8s_cluster']
|
||||
- kube_network_node_prefix is defined
|
||||
- kube_network_plugin != 'calico'
|
||||
|
||||
- name: Stop if ip var does not match local ips
|
||||
assert:
|
||||
that: (ip in ansible_all_ipv4_addresses) or (ip in ansible_all_ipv6_addresses)
|
||||
@@ -104,50 +53,26 @@
|
||||
- not ignore_assert_errors
|
||||
- ip is defined
|
||||
|
||||
- name: Ensure ping package
|
||||
package:
|
||||
# noqa: jinja[spacing]
|
||||
name: >-
|
||||
{%- if ansible_os_family == 'Debian' -%}
|
||||
iputils-ping
|
||||
{%- else -%}
|
||||
iputils
|
||||
{%- endif -%}
|
||||
state: present
|
||||
when:
|
||||
- access_ip is defined
|
||||
- not ignore_assert_errors
|
||||
- ping_access_ip
|
||||
- not is_fedora_coreos
|
||||
- not ansible_os_family in ["Flatcar", "Flatcar Container Linux by Kinvolk"]
|
||||
|
||||
- name: Stop if access_ip is not pingable
|
||||
command: ping -c1 {{ access_ip }}
|
||||
command: ping -c1 {{ main_access_ip }}
|
||||
when:
|
||||
- access_ip is defined
|
||||
- main_access_ip is defined
|
||||
- not ignore_assert_errors
|
||||
- ping_access_ip
|
||||
changed_when: false
|
||||
|
||||
- name: Stop if RBAC is not enabled when dashboard is enabled
|
||||
assert:
|
||||
that: rbac_enabled
|
||||
when:
|
||||
- dashboard_enabled
|
||||
- not ignore_assert_errors
|
||||
|
||||
- name: Stop if RBAC is not enabled when OCI cloud controller is enabled
|
||||
assert:
|
||||
that: rbac_enabled
|
||||
when:
|
||||
- cloud_provider is defined and cloud_provider == "oci"
|
||||
- not ignore_assert_errors
|
||||
|
||||
- name: Stop if kernel version is too low
|
||||
- name: Stop if kernel version is too low for cilium
|
||||
assert:
|
||||
that: ansible_kernel.split('-')[0] is version('4.9.17', '>=')
|
||||
when:
|
||||
- kube_network_plugin == 'cilium' or cilium_deploy_additionally | default(false) | bool
|
||||
- kube_network_plugin == 'cilium' or cilium_deploy_additionally
|
||||
- not ignore_assert_errors
|
||||
|
||||
- name: Stop if kernel version is too low for nftables
|
||||
assert:
|
||||
that: ansible_kernel.split('-')[0] is version('5.13', '>=')
|
||||
when:
|
||||
- kube_proxy_mode == 'nftables'
|
||||
- not ignore_assert_errors
|
||||
|
||||
- name: Stop if bad hostname
|
||||
@@ -156,179 +81,17 @@
|
||||
msg: "Hostname must consist of lower case alphanumeric characters, '.' or '-', and must start and end with an alphanumeric character"
|
||||
when: not ignore_assert_errors
|
||||
|
||||
- name: Check cloud_provider value
|
||||
- name: Stop if /etc/resolv.conf has no configured nameservers
|
||||
assert:
|
||||
that: cloud_provider in ['gce', 'aws', 'azure', 'openstack', 'vsphere', 'oci', 'external']
|
||||
msg: "If set the 'cloud_provider' var must be set either to 'gce', 'aws', 'azure', 'openstack', 'vsphere', 'oci' or 'external'"
|
||||
that: configured_nameservers | length>0
|
||||
fail_msg: "nameserver should not be empty in /etc/resolv.conf"
|
||||
when:
|
||||
- cloud_provider is defined
|
||||
- not ignore_assert_errors
|
||||
tags:
|
||||
- cloud-provider
|
||||
- facts
|
||||
|
||||
- name: "Check that kube_service_addresses is a network range"
|
||||
assert:
|
||||
that:
|
||||
- kube_service_addresses | ansible.utils.ipaddr('net')
|
||||
msg: "kube_service_addresses = '{{ kube_service_addresses }}' is not a valid network range"
|
||||
run_once: true
|
||||
|
||||
- name: "Check that kube_pods_subnet is a network range"
|
||||
assert:
|
||||
that:
|
||||
- kube_pods_subnet | ansible.utils.ipaddr('net')
|
||||
msg: "kube_pods_subnet = '{{ kube_pods_subnet }}' is not a valid network range"
|
||||
run_once: true
|
||||
|
||||
- name: "Check that kube_pods_subnet does not collide with kube_service_addresses"
|
||||
assert:
|
||||
that:
|
||||
- kube_pods_subnet | ansible.utils.ipaddr(kube_service_addresses) | string == 'None'
|
||||
msg: "kube_pods_subnet cannot be the same network segment as kube_service_addresses"
|
||||
run_once: true
|
||||
|
||||
- name: "Check that IP range is enough for the nodes"
|
||||
assert:
|
||||
that:
|
||||
- 2 ** (kube_network_node_prefix - kube_pods_subnet | ansible.utils.ipaddr('prefix')) >= groups['k8s_cluster'] | length
|
||||
msg: "Not enough IPs are available for the desired node count."
|
||||
when: kube_network_plugin != 'calico'
|
||||
run_once: true
|
||||
|
||||
- name: Stop if unknown dns mode
|
||||
assert:
|
||||
that: dns_mode in ['coredns', 'coredns_dual', 'manual', 'none']
|
||||
msg: "dns_mode can only be 'coredns', 'coredns_dual', 'manual' or 'none'"
|
||||
when: dns_mode is defined
|
||||
run_once: true
|
||||
|
||||
- name: Stop if unknown kube proxy mode
|
||||
assert:
|
||||
that: kube_proxy_mode in ['iptables', 'ipvs']
|
||||
msg: "kube_proxy_mode can only be 'iptables' or 'ipvs'"
|
||||
when: kube_proxy_mode is defined
|
||||
run_once: true
|
||||
|
||||
- name: Stop if unknown cert_management
|
||||
assert:
|
||||
that: cert_management | d('script') in ['script', 'none']
|
||||
msg: "cert_management can only be 'script' or 'none'"
|
||||
run_once: true
|
||||
|
||||
- name: Stop if unknown resolvconf_mode
|
||||
assert:
|
||||
that: resolvconf_mode in ['docker_dns', 'host_resolvconf', 'none']
|
||||
msg: "resolvconf_mode can only be 'docker_dns', 'host_resolvconf' or 'none'"
|
||||
when: resolvconf_mode is defined
|
||||
run_once: true
|
||||
|
||||
- name: Stop if etcd deployment type is not host, docker or kubeadm
|
||||
assert:
|
||||
that: etcd_deployment_type in ['host', 'docker', 'kubeadm']
|
||||
msg: "The etcd deployment type, 'etcd_deployment_type', must be host, docker or kubeadm"
|
||||
when:
|
||||
- inventory_hostname in groups.get('etcd',[])
|
||||
|
||||
- name: Stop if container manager is not docker, crio or containerd
|
||||
assert:
|
||||
that: container_manager in ['docker', 'crio', 'containerd']
|
||||
msg: "The container manager, 'container_manager', must be docker, crio or containerd"
|
||||
run_once: true
|
||||
|
||||
- name: Stop if etcd deployment type is not host or kubeadm when container_manager != docker
|
||||
assert:
|
||||
that: etcd_deployment_type in ['host', 'kubeadm']
|
||||
msg: "The etcd deployment type, 'etcd_deployment_type', must be host or kubeadm when container_manager is not docker"
|
||||
when:
|
||||
- inventory_hostname in groups.get('etcd',[])
|
||||
- container_manager != 'docker'
|
||||
|
||||
# TODO: Clean this task up when we drop backward compatibility support for `etcd_kubeadm_enabled`
|
||||
- name: Stop if etcd deployment type is not host or kubeadm when container_manager != docker and etcd_kubeadm_enabled is not defined
|
||||
run_once: true
|
||||
when: etcd_kubeadm_enabled is defined
|
||||
block:
|
||||
- name: Warn the user if they are still using `etcd_kubeadm_enabled`
|
||||
debug:
|
||||
msg: >
|
||||
"WARNING! => `etcd_kubeadm_enabled` is deprecated and will be removed in a future release.
|
||||
You can set `etcd_deployment_type` to `kubeadm` instead of setting `etcd_kubeadm_enabled` to `true`."
|
||||
changed_when: true
|
||||
|
||||
- name: Stop if `etcd_kubeadm_enabled` is defined and `etcd_deployment_type` is not `kubeadm` or `host`
|
||||
assert:
|
||||
that: etcd_deployment_type == 'kubeadm'
|
||||
msg: >
|
||||
It is not possible to use `etcd_kubeadm_enabled` when `etcd_deployment_type` is set to {{ etcd_deployment_type }}.
|
||||
Unset the `etcd_kubeadm_enabled` variable and set `etcd_deployment_type` to desired deployment type (`host`, `kubeadm`, `docker`) instead."
|
||||
when: etcd_kubeadm_enabled
|
||||
|
||||
- name: Stop if download_localhost is enabled but download_run_once is not
|
||||
assert:
|
||||
that: download_run_once
|
||||
msg: "download_localhost requires enable download_run_once"
|
||||
when: download_localhost
|
||||
|
||||
- name: Stop if kata_containers_enabled is enabled when container_manager is docker
|
||||
assert:
|
||||
that: container_manager != 'docker'
|
||||
msg: "kata_containers_enabled support only for containerd and crio-o. See https://github.com/kata-containers/documentation/blob/1.11.4/how-to/run-kata-with-k8s.md#install-a-cri-implementation for details"
|
||||
when: kata_containers_enabled
|
||||
|
||||
- name: Stop if gvisor_enabled is enabled when container_manager is not containerd
|
||||
assert:
|
||||
that: container_manager == 'containerd'
|
||||
msg: "gvisor_enabled support only compatible with containerd. See https://github.com/kubernetes-sigs/kubespray/issues/7650 for details"
|
||||
when: gvisor_enabled
|
||||
- upstream_dns_servers | length == 0
|
||||
- not disable_host_nameservers
|
||||
- dns_mode in ['coredns', 'coredns_dual']
|
||||
|
||||
- name: Stop if download_localhost is enabled for Flatcar Container Linux
|
||||
assert:
|
||||
that: ansible_os_family not in ["Flatcar", "Flatcar Container Linux by Kinvolk"]
|
||||
msg: "download_run_once not supported for Flatcar Container Linux"
|
||||
when: download_run_once or download_force_cache
|
||||
|
||||
- name: Ensure minimum containerd version
|
||||
assert:
|
||||
that: containerd_version is version(containerd_min_version_required, '>=')
|
||||
msg: "containerd_version is too low. Minimum version {{ containerd_min_version_required }}"
|
||||
run_once: true
|
||||
when:
|
||||
- containerd_version not in ['latest', 'edge', 'stable']
|
||||
- container_manager == 'containerd'
|
||||
|
||||
- name: Stop if using deprecated containerd_config variable
|
||||
assert:
|
||||
that: containerd_config is not defined
|
||||
msg: "Variable containerd_config is now deprecated. See https://github.com/kubernetes-sigs/kubespray/blob/master/inventory/sample/group_vars/all/containerd.yml for details."
|
||||
when:
|
||||
- containerd_config is defined
|
||||
- not ignore_assert_errors
|
||||
|
||||
- name: Stop if auto_renew_certificates is enabled when certificates are managed externally (kube_external_ca_mode is true)
|
||||
assert:
|
||||
that: not auto_renew_certificates
|
||||
msg: "Variable auto_renew_certificates must be disabled when CA are managed externally: kube_external_ca_mode = true"
|
||||
when:
|
||||
- kube_external_ca_mode
|
||||
- not ignore_assert_errors
|
||||
|
||||
- name: Stop if using deprecated comma separated list for admission plugins
|
||||
assert:
|
||||
that: "',' not in kube_apiserver_enable_admission_plugins[0]"
|
||||
msg: "Comma-separated list for kube_apiserver_enable_admission_plugins is now deprecated, use separate list items for each plugin."
|
||||
when:
|
||||
- kube_apiserver_enable_admission_plugins is defined
|
||||
- kube_apiserver_enable_admission_plugins | length > 0
|
||||
|
||||
- name: Verify that the packages list structure is valid
|
||||
ansible.utils.validate:
|
||||
criteria: "{{ lookup('file', 'pkgs-schema.json') }}"
|
||||
data: "{{ pkgs }}"
|
||||
|
||||
- name: Verify that the packages list is sorted
|
||||
vars:
|
||||
pkgs_lists: "{{ pkgs.keys() | list }}"
|
||||
assert:
|
||||
that: "pkgs_lists | sort == pkgs_lists"
|
||||
fail_msg: "pkgs is not sorted: {{ pkgs_lists | ansible.utils.fact_diff(pkgs_lists | sort) }}"
|
||||
|
||||
@@ -5,17 +5,17 @@
|
||||
state: directory
|
||||
owner: "{{ kube_owner }}"
|
||||
mode: "0755"
|
||||
when: inventory_hostname in groups['k8s_cluster']
|
||||
when: ('k8s_cluster' in group_names)
|
||||
become: true
|
||||
tags:
|
||||
- kubelet
|
||||
- k8s-secrets
|
||||
- kube-controller-manager
|
||||
- kube-apiserver
|
||||
- bootstrap-os
|
||||
- bootstrap_os
|
||||
- apps
|
||||
- network
|
||||
- master
|
||||
- master # master tag is deprecated and replaced by control-plane
|
||||
- control-plane
|
||||
- node
|
||||
with_items:
|
||||
- "{{ kube_config_dir }}"
|
||||
@@ -29,17 +29,17 @@
|
||||
state: directory
|
||||
owner: root
|
||||
mode: "0755"
|
||||
when: inventory_hostname in groups['k8s_cluster']
|
||||
when: ('k8s_cluster' in group_names)
|
||||
become: true
|
||||
tags:
|
||||
- kubelet
|
||||
- k8s-secrets
|
||||
- kube-controller-manager
|
||||
- kube-apiserver
|
||||
- bootstrap-os
|
||||
- bootstrap_os
|
||||
- apps
|
||||
- network
|
||||
- master
|
||||
- master # master tag is deprecated and replaced by control-plane
|
||||
- control-plane
|
||||
- node
|
||||
with_items:
|
||||
- "{{ kube_cert_dir }}"
|
||||
@@ -53,7 +53,7 @@
|
||||
get_mime: false
|
||||
register: kube_cert_compat_dir_check
|
||||
when:
|
||||
- inventory_hostname in groups['k8s_cluster']
|
||||
- ('k8s_cluster' in group_names)
|
||||
- kube_cert_dir != kube_cert_compat_dir
|
||||
|
||||
- name: Create kubernetes kubeadm compat cert dir (kubernetes/kubeadm issue 1498)
|
||||
@@ -63,7 +63,7 @@
|
||||
state: link
|
||||
mode: "0755"
|
||||
when:
|
||||
- inventory_hostname in groups['k8s_cluster']
|
||||
- ('k8s_cluster' in group_names)
|
||||
- kube_cert_dir != kube_cert_compat_dir
|
||||
- not kube_cert_compat_dir_check.stat.exists
|
||||
|
||||
@@ -78,7 +78,7 @@
|
||||
- "/opt/cni/bin"
|
||||
when:
|
||||
- kube_network_plugin in ["calico", "weave", "flannel", "cilium", "kube-ovn", "kube-router", "macvlan"]
|
||||
- inventory_hostname in groups['k8s_cluster']
|
||||
- ('k8s_cluster' in group_names)
|
||||
tags:
|
||||
- network
|
||||
- cilium
|
||||
@@ -86,7 +86,7 @@
|
||||
- weave
|
||||
- kube-ovn
|
||||
- kube-router
|
||||
- bootstrap-os
|
||||
- bootstrap_os
|
||||
|
||||
- name: Create calico cni directories
|
||||
file:
|
||||
@@ -98,11 +98,11 @@
|
||||
- "/var/lib/calico"
|
||||
when:
|
||||
- kube_network_plugin == "calico"
|
||||
- inventory_hostname in groups['k8s_cluster']
|
||||
- ('k8s_cluster' in group_names)
|
||||
tags:
|
||||
- network
|
||||
- calico
|
||||
- bootstrap-os
|
||||
- bootstrap_os
|
||||
|
||||
- name: Create local volume provisioner directories
|
||||
file:
|
||||
@@ -113,7 +113,7 @@
|
||||
mode: "{{ local_volume_provisioner_directory_mode }}"
|
||||
with_items: "{{ local_volume_provisioner_storage_classes.keys() | list }}"
|
||||
when:
|
||||
- inventory_hostname in groups['k8s_cluster']
|
||||
- ('k8s_cluster' in group_names)
|
||||
- local_volume_provisioner_enabled
|
||||
tags:
|
||||
- persistent_volumes
|
||||
|
||||
@@ -7,10 +7,9 @@
|
||||
blockinfile:
|
||||
path: "{{ resolvconffile }}"
|
||||
block: |-
|
||||
{% for item in [domainentry] + [searchentries] -%}
|
||||
{{ item }}
|
||||
{% endfor %}
|
||||
{% for item in nameserverentries.split(',') %}
|
||||
domain {{ dns_domain }}
|
||||
search {{ (default_searchdomains + searchdomains) | join(' ') }}
|
||||
{% for item in nameserverentries %}
|
||||
nameserver {{ item }}
|
||||
{% endfor %}
|
||||
options ndots:{{ ndots }} timeout:{{ dns_timeout | default('2') }} attempts:{{ dns_attempts | default('2') }}
|
||||
|
||||
@@ -4,11 +4,12 @@
|
||||
path: /etc/NetworkManager/conf.d/dns.conf
|
||||
section: global-dns-domain-*
|
||||
option: servers
|
||||
value: "{{ nameserverentries }}"
|
||||
value: "{{ nameserverentries | join(',') }}"
|
||||
mode: '0600'
|
||||
backup: true
|
||||
backup: "{{ leave_etc_backup_files }}"
|
||||
when:
|
||||
- nameserverentries != "127.0.0.53" or systemd_resolved_enabled.rc != 0
|
||||
- ('127.0.0.53' not in nameserverentries
|
||||
or systemd_resolved_enabled.rc != 0)
|
||||
notify: Preinstall | update resolvconf for networkmanager
|
||||
|
||||
- name: Set default dns if remove_default_searchdomains is false
|
||||
@@ -21,9 +22,9 @@
|
||||
path: /etc/NetworkManager/conf.d/dns.conf
|
||||
section: global-dns
|
||||
option: searches
|
||||
value: "{{ (default_searchdomains | default([]) + searchdomains | default([])) | join(',') }}"
|
||||
value: "{{ (default_searchdomains | default([]) + searchdomains) | join(',') }}"
|
||||
mode: '0600'
|
||||
backup: true
|
||||
backup: "{{ leave_etc_backup_files }}"
|
||||
notify: Preinstall | update resolvconf for networkmanager
|
||||
|
||||
- name: NetworkManager | Add DNS options to NM configuration
|
||||
@@ -33,5 +34,5 @@
|
||||
option: options
|
||||
value: "ndots:{{ ndots }},timeout:{{ dns_timeout | default('2') }},attempts:{{ dns_attempts | default('2') }}"
|
||||
mode: '0600'
|
||||
backup: true
|
||||
backup: "{{ leave_etc_backup_files }}"
|
||||
notify: Preinstall | update resolvconf for networkmanager
|
||||
|
||||
@@ -1,87 +0,0 @@
|
||||
---
|
||||
- name: Update package management cache (zypper) - SUSE
|
||||
command: zypper -n --gpg-auto-import-keys ref
|
||||
register: make_cache_output
|
||||
until: make_cache_output is succeeded
|
||||
retries: 4
|
||||
delay: "{{ retry_stagger | random + 3 }}"
|
||||
when:
|
||||
- ansible_pkg_mgr == 'zypper'
|
||||
tags: bootstrap-os
|
||||
|
||||
- name: Add debian 10 required repos
|
||||
when:
|
||||
- ansible_distribution == "Debian"
|
||||
- ansible_distribution_version == "10"
|
||||
tags:
|
||||
- bootstrap-os
|
||||
block:
|
||||
- name: Add Debian Backports apt repo
|
||||
apt_repository:
|
||||
repo: "deb http://deb.debian.org/debian {{ ansible_distribution_release }}-backports main"
|
||||
state: present
|
||||
filename: debian-backports
|
||||
|
||||
- name: Set libseccomp2 pin priority to apt_preferences on Debian buster
|
||||
copy:
|
||||
content: |
|
||||
Package: libseccomp2
|
||||
Pin: release a={{ ansible_distribution_release }}-backports
|
||||
Pin-Priority: 1001
|
||||
dest: "/etc/apt/preferences.d/libseccomp2"
|
||||
owner: "root"
|
||||
mode: "0644"
|
||||
|
||||
- name: Update package management cache (APT)
|
||||
apt:
|
||||
update_cache: true
|
||||
cache_valid_time: 3600
|
||||
when: ansible_os_family == "Debian"
|
||||
tags:
|
||||
- bootstrap-os
|
||||
|
||||
- name: Remove legacy docker repo file
|
||||
file:
|
||||
path: "{{ yum_repo_dir }}/docker.repo"
|
||||
state: absent
|
||||
when:
|
||||
- ansible_os_family == "RedHat"
|
||||
- not is_fedora_coreos
|
||||
|
||||
- name: Install epel-release on RHEL derivatives
|
||||
package:
|
||||
name: epel-release
|
||||
state: present
|
||||
when:
|
||||
- ansible_os_family == "RedHat"
|
||||
- not is_fedora_coreos
|
||||
- epel_enabled | bool
|
||||
tags:
|
||||
- bootstrap-os
|
||||
|
||||
- name: Install packages requirements
|
||||
vars:
|
||||
# The json_query for selecting packages name is split for readability
|
||||
# see files/pkgs-schema.json for the structure of `pkgs`
|
||||
# and the matching semantics
|
||||
full_query: "[? value | (enabled == null || enabled) && ( {{ filters_os }} ) && ( {{ filters_groups }} ) ].key"
|
||||
filters_groups: "groups | @ == null || [? contains(`{{ group_names }}`, @)]"
|
||||
filters_os: "os == null || (os | ( {{ filters_family }} ) || ( {{ filters_distro }} ))"
|
||||
dquote: !unsafe '"'
|
||||
# necessary to workaround Ansible escaping
|
||||
filters_distro: "distributions.{{ dquote }}{{ ansible_distribution }}{{ dquote }} |
|
||||
@ == `{}` ||
|
||||
contains(not_null(major_versions, `[]`), '{{ ansible_distribution_major_version }}') ||
|
||||
contains(not_null(versions, `[]`), '{{ ansible_distribution_version }}') ||
|
||||
contains(not_null(releases, `[]`), '{{ ansible_distribution_release }}')"
|
||||
filters_family: "families && contains(families, '{{ ansible_os_family }}')"
|
||||
package:
|
||||
name: "{{ pkgs | dict2items | to_json|from_json | community.general.json_query(full_query) }}"
|
||||
state: present
|
||||
register: pkgs_task_result
|
||||
until: pkgs_task_result is succeeded
|
||||
retries: "{{ pkg_install_retries }}"
|
||||
delay: "{{ retry_stagger | random + 3 }}"
|
||||
when: not (ansible_os_family in ["Flatcar", "Flatcar Container Linux by Kinvolk"] or is_fedora_coreos)
|
||||
tags:
|
||||
- bootstrap-os
|
||||
@@ -20,7 +20,7 @@
|
||||
- "'Amazon' not in ansible_distribution"
|
||||
- slc.stat.exists
|
||||
tags:
|
||||
- bootstrap-os
|
||||
- bootstrap_os
|
||||
|
||||
- name: Disable IPv6 DNS lookup
|
||||
lineinfile:
|
||||
@@ -28,13 +28,13 @@
|
||||
line: "precedence ::ffff:0:0/96 100"
|
||||
state: present
|
||||
create: true
|
||||
backup: true
|
||||
backup: "{{ leave_etc_backup_files }}"
|
||||
mode: "0644"
|
||||
when:
|
||||
- disable_ipv6_dns
|
||||
- not ansible_os_family in ["Flatcar", "Flatcar Container Linux by Kinvolk"]
|
||||
tags:
|
||||
- bootstrap-os
|
||||
- bootstrap_os
|
||||
|
||||
- name: Clean previously used sysctl file locations
|
||||
file:
|
||||
@@ -52,7 +52,7 @@
|
||||
get_mime: false
|
||||
register: sysctl_file_stat
|
||||
tags:
|
||||
- bootstrap-os
|
||||
- bootstrap_os
|
||||
|
||||
- name: Change sysctl file path to link source if linked
|
||||
set_fact:
|
||||
@@ -61,7 +61,7 @@
|
||||
- sysctl_file_stat.stat.islnk is defined
|
||||
- sysctl_file_stat.stat.islnk
|
||||
tags:
|
||||
- bootstrap-os
|
||||
- bootstrap_os
|
||||
|
||||
- name: Make sure sysctl file path folder exists
|
||||
file:
|
||||
@@ -76,6 +76,7 @@
|
||||
value: "1"
|
||||
state: present
|
||||
reload: true
|
||||
when: ipv4_stack | bool
|
||||
|
||||
- name: Enable ipv6 forwarding
|
||||
ansible.posix.sysctl:
|
||||
@@ -84,7 +85,7 @@
|
||||
value: "1"
|
||||
state: present
|
||||
reload: true
|
||||
when: enable_dual_stack_networks | bool
|
||||
when: ipv6_stack | bool
|
||||
|
||||
- name: Check if we need to set fs.may_detach_mounts
|
||||
stat:
|
||||
|
||||
@@ -1,12 +1,4 @@
|
||||
---
|
||||
- name: Ensure NTP package
|
||||
package:
|
||||
name:
|
||||
- "{{ ntp_package }}"
|
||||
state: present
|
||||
when:
|
||||
- not is_fedora_coreos
|
||||
- not ansible_os_family in ["Flatcar", "Flatcar Container Linux by Kinvolk"]
|
||||
|
||||
- name: Disable systemd-timesyncd
|
||||
service:
|
||||
@@ -21,6 +13,8 @@
|
||||
ntp_config_file: >-
|
||||
{% if ntp_package == "ntp" -%}
|
||||
/etc/ntp.conf
|
||||
{%- elif ntp_package == "ntpsec" -%}
|
||||
/etc/ntpsec/ntp.conf
|
||||
{%- elif ansible_os_family in ['RedHat', 'Suse'] -%}
|
||||
/etc/chrony.conf
|
||||
{%- else -%}
|
||||
@@ -56,10 +50,10 @@
|
||||
# noqa: jinja[spacing]
|
||||
command: >-
|
||||
timeout -k 60s 60s
|
||||
{% if ntp_package == "ntp" -%}
|
||||
ntpd -gq
|
||||
{%- else -%}
|
||||
{% if ntp_package == "chrony" -%}
|
||||
chronyd -q
|
||||
{%- else -%}
|
||||
ntpd -gq
|
||||
{%- endif -%}
|
||||
when:
|
||||
- ntp_force_sync_immediately
|
||||
|
||||
@@ -2,11 +2,10 @@
|
||||
- name: Hosts | create hosts list from inventory
|
||||
set_fact:
|
||||
etc_hosts_inventory_block: |-
|
||||
{% for item in (groups['k8s_cluster'] + groups['etcd'] | default([]) + groups['calico_rr'] | default([])) | unique -%}
|
||||
{% if 'access_ip' in hostvars[item] or 'ip' in hostvars[item] or 'ansible_default_ipv4' in hostvars[item] -%}
|
||||
{{ hostvars[item]['access_ip'] | default(hostvars[item]['ip'] | default(hostvars[item]['ansible_default_ipv4']['address'])) }}
|
||||
{%- if ('ansible_hostname' in hostvars[item] and item != hostvars[item]['ansible_hostname']) %} {{ hostvars[item]['ansible_hostname'] }}.{{ dns_domain }} {{ hostvars[item]['ansible_hostname'] }} {% else %} {{ item }}.{{ dns_domain }} {{ item }} {% endif %}
|
||||
|
||||
{% for item in (groups['k8s_cluster'] + groups['etcd'] | default([]) + groups['calico_rr'] | default([])) | unique %}
|
||||
{{ hostvars[item]['main_access_ip'] }} {{ hostvars[item]['ansible_hostname'] | default(item) }}.{{ dns_domain }} {{ hostvars[item]['ansible_hostname'] | default(item) }}
|
||||
{% if ipv4_stack and ipv6_stack %}
|
||||
{{ hostvars[item]['access_ip6'] | default(hostvars[item]['ip6'] | default(hostvars[item]['ansible_default_ipv6']['address'])) }} {{ hostvars[item]['ansible_hostname'] | default(item) }}.{{ dns_domain }} {{ hostvars[item]['ansible_hostname'] | default(item) }}
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
delegate_to: localhost
|
||||
@@ -20,7 +19,7 @@
|
||||
block: "{{ hostvars.localhost.etc_hosts_inventory_block }}"
|
||||
state: "{{ 'present' if populate_inventory_to_hosts_file else 'absent' }}"
|
||||
create: true
|
||||
backup: true
|
||||
backup: "{{ leave_etc_backup_files }}"
|
||||
unsafe_writes: true
|
||||
marker: "# Ansible inventory hosts {mark}"
|
||||
mode: "0644"
|
||||
@@ -31,7 +30,7 @@
|
||||
regexp: ".*{{ apiserver_loadbalancer_domain_name }}$"
|
||||
line: "{{ loadbalancer_apiserver.address }} {{ apiserver_loadbalancer_domain_name }}"
|
||||
state: present
|
||||
backup: true
|
||||
backup: "{{ leave_etc_backup_files }}"
|
||||
unsafe_writes: true
|
||||
when:
|
||||
- populate_loadbalancer_apiserver_to_hosts_file
|
||||
@@ -69,7 +68,7 @@
|
||||
line: "{{ item.key }} {{ item.value | join(' ') }}"
|
||||
regexp: "^{{ item.key }}.*$"
|
||||
state: present
|
||||
backup: true
|
||||
backup: "{{ leave_etc_backup_files }}"
|
||||
unsafe_writes: true
|
||||
loop: "{{ etc_hosts_localhosts_dict_target | default({}) | dict2items }}"
|
||||
|
||||
|
||||
@@ -1,15 +1,20 @@
|
||||
---
|
||||
- name: Configure dhclient to supersede search/domain/nameservers
|
||||
blockinfile:
|
||||
# 1 is the 2nd item of a tuple in items()
|
||||
block: |-
|
||||
{% for item in [supersede_domain, supersede_search, supersede_nameserver] | reject('equalto', '') -%}
|
||||
{{ item }}
|
||||
{% for key, val in dhclient_supersede.items() | rejectattr(1, '==', []) -%}
|
||||
{% if key == "domain-name-servers" -%}
|
||||
supersede {{ key }} {{ val | join(',') }};
|
||||
{% else -%}
|
||||
supersede {{ key }} "{{ val | join('","') }}";
|
||||
{% endif -%}
|
||||
{% endfor %}
|
||||
path: "{{ dhclientconffile }}"
|
||||
create: true
|
||||
state: present
|
||||
insertbefore: BOF
|
||||
backup: true
|
||||
backup: "{{ leave_etc_backup_files }}"
|
||||
marker: "# Ansible entries {mark}"
|
||||
mode: "0644"
|
||||
notify: Preinstall | propagate resolvconf to k8s components
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
blockinfile:
|
||||
path: "{{ dhclientconffile }}"
|
||||
state: absent
|
||||
backup: true
|
||||
backup: "{{ leave_etc_backup_files }}"
|
||||
marker: "# Ansible entries {mark}"
|
||||
notify: Preinstall | propagate resolvconf to k8s components
|
||||
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
- systemd_resolved_enabled.rc != 0
|
||||
- networkmanager_enabled.rc != 0
|
||||
tags:
|
||||
- bootstrap-os
|
||||
- bootstrap_os
|
||||
- resolvconf
|
||||
|
||||
- name: Apply systemd-resolved settings
|
||||
@@ -42,7 +42,7 @@
|
||||
- resolvconf_mode == 'host_resolvconf'
|
||||
- systemd_resolved_enabled.rc == 0
|
||||
tags:
|
||||
- bootstrap-os
|
||||
- bootstrap_os
|
||||
- resolvconf
|
||||
|
||||
- name: Apply networkmanager unmanaged devices settings
|
||||
@@ -50,7 +50,7 @@
|
||||
when:
|
||||
- networkmanager_enabled.rc == 0
|
||||
tags:
|
||||
- bootstrap-os
|
||||
- bootstrap_os
|
||||
|
||||
- name: Apply networkmanager DNS settings
|
||||
import_tasks: 0063-networkmanager-dns.yml
|
||||
@@ -59,23 +59,15 @@
|
||||
- resolvconf_mode == 'host_resolvconf'
|
||||
- networkmanager_enabled.rc == 0
|
||||
tags:
|
||||
- bootstrap-os
|
||||
- bootstrap_os
|
||||
- resolvconf
|
||||
|
||||
- name: Install required system packages
|
||||
import_tasks: 0070-system-packages.yml
|
||||
when:
|
||||
- not dns_late
|
||||
tags:
|
||||
- bootstrap-os
|
||||
- system-packages
|
||||
|
||||
- name: Apply system configurations
|
||||
import_tasks: 0080-system-configurations.yml
|
||||
when:
|
||||
- not dns_late
|
||||
tags:
|
||||
- bootstrap-os
|
||||
- bootstrap_os
|
||||
|
||||
- name: Configure NTP
|
||||
import_tasks: 0081-ntp-configurations.yml
|
||||
@@ -83,12 +75,12 @@
|
||||
- not dns_late
|
||||
- ntp_enabled
|
||||
tags:
|
||||
- bootstrap-os
|
||||
- bootstrap_os
|
||||
|
||||
- name: Configure /etc/hosts
|
||||
import_tasks: 0090-etchosts.yml
|
||||
tags:
|
||||
- bootstrap-os
|
||||
- bootstrap_os
|
||||
- etchosts
|
||||
|
||||
- name: Configure dhclient
|
||||
@@ -99,7 +91,7 @@
|
||||
- dhclientconffile is defined
|
||||
- not ansible_os_family in ["Flatcar", "Flatcar Container Linux by Kinvolk"]
|
||||
tags:
|
||||
- bootstrap-os
|
||||
- bootstrap_os
|
||||
- resolvconf
|
||||
|
||||
- name: Configure dhclient dhclient hooks
|
||||
@@ -110,7 +102,7 @@
|
||||
- dhclientconffile is defined
|
||||
- not ansible_os_family in ["Flatcar", "Flatcar Container Linux by Kinvolk"]
|
||||
tags:
|
||||
- bootstrap-os
|
||||
- bootstrap_os
|
||||
- resolvconf
|
||||
|
||||
# We need to make sure the network is restarted early enough so that docker can later pick up the correct system
|
||||
@@ -128,7 +120,7 @@
|
||||
when:
|
||||
- not dns_late
|
||||
tags:
|
||||
- bootstrap-os
|
||||
- bootstrap_os
|
||||
|
||||
- name: Run calico checks
|
||||
include_role:
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
[Resolve]
|
||||
{% if not dns_early and dns_late %}
|
||||
DNS={{ ([nodelocaldns_ip] if enable_nodelocaldns else coredns_server )| list | join(' ') }}
|
||||
DNS={{ ([nodelocaldns_ip] if enable_nodelocaldns else coredns_server) | list | join(' ') }}
|
||||
{% endif %}
|
||||
FallbackDNS={{ ( upstream_dns_servers|d([]) + nameservers|d([]) + cloud_resolver|d([])) | unique | join(' ') }}
|
||||
{% if remove_default_searchdomains and searchdomains|default([])|length != 0 %}
|
||||
Domains={{ searchdomains|default([]) | join(' ') }}
|
||||
FallbackDNS={{ ( upstream_dns_servers + nameservers + cloud_resolver) | unique | join(' ') }}
|
||||
{% if remove_default_searchdomains and searchdomains | length != 0 %}
|
||||
Domains={{ searchdomains | join(' ') }}
|
||||
{% else %}
|
||||
Domains={{ ([ 'default.svc.' + dns_domain, 'svc.' + dns_domain ] + searchdomains|default([])) | join(' ') }}
|
||||
Domains={{ ([ 'default.svc.' + dns_domain, 'svc.' + dns_domain ] + searchdomains) | join(' ') }}
|
||||
{% endif %}
|
||||
DNSSEC=no
|
||||
Cache=no-negative
|
||||
|
||||
@@ -1,103 +1,22 @@
|
||||
---
|
||||
pkgs:
|
||||
apparmor: &debian_family_base
|
||||
os:
|
||||
families:
|
||||
- Debian
|
||||
apt-transport-https: *debian_family_base
|
||||
aufs-tools: &deb_10
|
||||
groups:
|
||||
- k8s_cluster
|
||||
os:
|
||||
distributions:
|
||||
Debian:
|
||||
major_versions:
|
||||
- "10"
|
||||
bash-completion: {}
|
||||
conntrack: &deb_redhat
|
||||
groups:
|
||||
- k8s_cluster
|
||||
os:
|
||||
families:
|
||||
- Debian
|
||||
- RedHat
|
||||
conntrack-tools:
|
||||
groups:
|
||||
- k8s_cluster
|
||||
os:
|
||||
families:
|
||||
- Suse
|
||||
distributions:
|
||||
Amazon: {}
|
||||
container-selinux: &redhat_family
|
||||
groups:
|
||||
- k8s_cluster
|
||||
os:
|
||||
families:
|
||||
- RedHat
|
||||
curl: {}
|
||||
device-mapper:
|
||||
groups:
|
||||
- k8s_cluster
|
||||
os:
|
||||
families:
|
||||
- Suse
|
||||
device-mapper-libs: *redhat_family
|
||||
e2fsprogs: {}
|
||||
ebtables: {}
|
||||
gnupg: &debian
|
||||
groups:
|
||||
- k8s_cluster
|
||||
os:
|
||||
distributions:
|
||||
Debian:
|
||||
major_versions:
|
||||
- "11"
|
||||
- "12"
|
||||
ipset:
|
||||
enabled: "{{ kube_proxy_mode != 'ipvs' }}"
|
||||
groups:
|
||||
- k8s_cluster
|
||||
iptables: *deb_redhat
|
||||
ipvsadm:
|
||||
enabled: "{{ kube_proxy_mode == 'ipvs' }}"
|
||||
groups:
|
||||
- k8s_cluster
|
||||
libseccomp: *redhat_family
|
||||
libseccomp2:
|
||||
groups:
|
||||
- k8s_cluster
|
||||
os:
|
||||
families:
|
||||
- Suse
|
||||
- Debian
|
||||
libselinux-python: # TODO: Handle rehat_family + major < 8
|
||||
os:
|
||||
distributions:
|
||||
Amazon: {}
|
||||
libselinux-python3:
|
||||
os:
|
||||
distributions:
|
||||
Fedora: {}
|
||||
mergerfs:
|
||||
os:
|
||||
distributions:
|
||||
Debian:
|
||||
major_versions:
|
||||
- "12"
|
||||
nss: *redhat_family
|
||||
openssl: {}
|
||||
python-apt: *deb_10
|
||||
# TODO: not for debian 10
|
||||
python3-apt: *debian_family_base
|
||||
python3-libselinux:
|
||||
os:
|
||||
distributions:
|
||||
RedHat: {}
|
||||
CentOS: {}
|
||||
rsync: {}
|
||||
socat: {}
|
||||
software-properties-common: *debian_family_base
|
||||
tar: {}
|
||||
unzip: {}
|
||||
xfsprogs: {}
|
||||
coredns_server_by_mode:
|
||||
coredns: "{{ [skydns_server] }}"
|
||||
coredns_dual: "{{ [skydns_server, skydns_server_secondary] }}"
|
||||
manual: "{{ manual_dns_server.split(',') }}"
|
||||
none: []
|
||||
coredns_server: "{{ upstream_dns_servers if dns_early else coredns_server_by_mode[dns_mode] }}"
|
||||
|
||||
_nameserverentries:
|
||||
late:
|
||||
- "{{ nodelocaldns_ip if enable_nodelocaldns else coredns_server }}"
|
||||
early:
|
||||
- "{{ nameservers }}"
|
||||
- "{{ cloud_resolver }}"
|
||||
- "{{ configured_nameservers if not disable_host_nameservers else [] }}"
|
||||
nameserverentries: "{{ ((_nameserverentries['late'] if not dns_early else []) + _nameserverentries['early']) | flatten | unique }}"
|
||||
dhclient_supersede:
|
||||
domain-name-servers: "{{ ([nameservers, cloud_resolver] | flatten | unique) if dns_early else nameserverentries }}"
|
||||
domain-name: "{{ [dns_domain] }}"
|
||||
domain-search: "{{ default_searchdomains + searchdomains }}"
|
||||
configured_nameservers: "{{ (resolvconf_slurp.content | b64decode | regex_findall('^nameserver\\s*(\\S*)', multiline=True) | ansible.utils.ipaddr)
|
||||
if resolvconf_stat.stat.exists else [] }}"
|
||||
|
||||
Reference in New Issue
Block a user