Skip to content
---
name: Build
on:
push:
branches:
- master
jobs:
test:
name: Build Ansible Galaxy collection artifact.
runs-on: ubuntu-latest
steps:
- name: Check out the codebase.
uses: actions/checkout@v4
- name: Set up Python 3.
uses: actions/setup-python@v4
with:
python-version: '3.x'
- name: Install test dependencies.
run: pip3 install ansible
- name: Build artifact.
run: ansible-galaxy collection build
- name: Upload artifact.
uses: actions/upload-artifact@v4
with:
name: galaxy-collection
path: k3s-orchestration-*.tar.gz
venv
.venv
.vscode .vscode
.vagrant .vagrant
inventory.yml inventory.yml
......
# `k3s-ansible` changelog (`k3s.orchestration`)
## 1.0.0
Initial Release
...@@ -20,7 +20,7 @@ on processor architectures: ...@@ -20,7 +20,7 @@ on processor architectures:
## System requirements ## System requirements
The control node **must** have Ansible 5.0+ (ansible-core 2.12.0+) The control node **must** have Ansible 8.0+ (ansible-core 2.15+)
All managed nodes in inventory must have: All managed nodes in inventory must have:
- Passwordless SSH access - Passwordless SSH access
......
---
### REQUIRED
# The namespace of the collection. This can be a company/brand/organization or product namespace under which all
# content lives. May only contain alphanumeric lowercase characters and underscores. Namespaces cannot start with
# underscores or numbers and cannot contain consecutive underscores
namespace: k3s
# The name of the collection. Has the same character restrictions as 'namespace'
name: orchestration
# The version of the collection. Must be compatible with semantic versioning
version: 1.0.0
# The path to the Markdown (.md) readme file. This path is relative to the root of the collection
readme: README.md
# A list of the collection's content authors. Can be just the name or in the format 'Full Name <email> (url)
# @nicks:irc/im.site#channel'
authors:
- Julien DOCHE <julien.doche@gmail.com>
- Derek Nola <derek.nola@suse.com>
- David Putzolu <dputzolu@gmail.com>
- Jeff Geerling <geerlingguy@mac.com>
- Staf Wagemakers <staf@wagemakers.be>
- Vincent RABAH <vincent.rabah@gmail.com>
### OPTIONAL but strongly recommended
# A short summary description of the collection
description: Build a Kubernetes cluster using K3s via Ansible
# Either a single license or a list of licenses for content inside of a collection. Ansible Galaxy currently only
# accepts L(SPDX,https://spdx.org/licenses/) licenses. This key is mutually exclusive with 'license_file'
license:
- Apache-2.0
# The path to the license file for the collection. This path is relative to the root of the collection. This key is
# mutually exclusive with 'license'
# license_file: ''
# A list of tags you want to associate with the collection for indexing/searching. A tag name has the same character
# requirements as 'namespace' and 'name'
tags: ['infrastructure', 'linux', 'tools']
# Collections that this collection requires to be installed for it to be usable. The key of the dict is the
# collection label 'namespace.name'. The value is a version range
# L(specifiers,https://python-semanticversion.readthedocs.io/en/latest/#requirement-specification). Multiple version
# range specifiers can be set and are separated by ','
dependencies:
community.general: ">=7.0.0"
ansible.posix: ">=1.5.0"
# The URL of the originating SCM repository
repository: https://github.com/k3s-io/k3s-ansible
# The URL to any online docs
documentation: https://github.com/k3s-io/k3s-ansible/blob/master/README.md
# The URL to the homepage of the collection/project
homepage: https://github.com/k3s-io/k3s-ansible
# The URL to the collection issue tracker
issues: https://github.com/k3s-io/k3s-ansible/issues
# A list of file glob-like patterns used to filter any files or directories that should not be included in the build
# artifact. A pattern is matched from the relative path of the file or directory of the collection directory. This
# uses 'fnmatch' to match the files or directories. Some directories and files like 'galaxy.yml', '*.pyc', '*.retry',
# and '.git' are always filtered. Mutually exclusive with 'manifest'
build_ignore: []
# A dict controlling use of manifest directives used in building the collection artifact. The key 'directives' is a
# list of MANIFEST.in style
# L(directives,https://packaging.python.org/en/latest/guides/using-manifest-in/#manifest-in-commands). The key
# 'omit_default_directives' is a boolean that controls whether the default directives are used. Mutually exclusive
# with 'build_ignore'
# manifest: null
---
requires_ansible: ">=2.14.0"
...@@ -11,7 +11,7 @@ WantedBy=multi-user.target ...@@ -11,7 +11,7 @@ WantedBy=multi-user.target
Type=notify Type=notify
EnvironmentFile=-/etc/default/%N EnvironmentFile=-/etc/default/%N
EnvironmentFile=-/etc/sysconfig/%N EnvironmentFile=-/etc/sysconfig/%N
EnvironmentFile=-/etc/systemd/system/k3s.service.env EnvironmentFile=-/etc/systemd/system/k3s-agent.service.env
KillMode=process KillMode=process
Delegate=yes Delegate=yes
# Having non-zero Limit*s causes performance problems due to accounting overhead # Having non-zero Limit*s causes performance problems due to accounting overhead
...@@ -26,4 +26,4 @@ RestartSec=5s ...@@ -26,4 +26,4 @@ RestartSec=5s
ExecStartPre=/bin/sh -xc '! /usr/bin/systemctl is-enabled --quiet nm-cloud-setup.service' ExecStartPre=/bin/sh -xc '! /usr/bin/systemctl is-enabled --quiet nm-cloud-setup.service'
ExecStartPre=-/sbin/modprobe br_netfilter ExecStartPre=-/sbin/modprobe br_netfilter
ExecStartPre=-/sbin/modprobe overlay ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/local/bin/k3s agent --data-dir {{ k3s_server_location }} --server https://{{ api_endpoint }}:{{ api_port }} --token {{ token }} {{ extra_agent_args }} ExecStart=/usr/local/bin/k3s agent --data-dir {{ k3s_server_location }} --server https://{{ api_endpoint }}:{{ api_port }} --token {{ token }} {{ extra_agent_args }}
\ No newline at end of file
...@@ -19,6 +19,12 @@ ...@@ -19,6 +19,12 @@
INSTALL_K3S_VERSION: "{{ k3s_version }}" INSTALL_K3S_VERSION: "{{ k3s_version }}"
changed_when: true changed_when: true
- name: Add K3s autocomplete to user bashrc
ansible.builtin.lineinfile:
path: "~{{ ansible_user }}/.bashrc"
regexp: '\.\s+<\(k3s completion bash\)'
line: ". <(k3s completion bash) # Added by k3s-ansible"
- name: Setup optional config file - name: Setup optional config file
when: server_config_yaml is defined when: server_config_yaml is defined
block: block:
...@@ -73,25 +79,6 @@ ...@@ -73,25 +79,6 @@
ansible.builtin.pause: ansible.builtin.pause:
seconds: 10 seconds: 10
- name: Add K3s autocomplete to user bashrc
ansible.builtin.lineinfile:
path: "~{{ ansible_user }}/.bashrc"
regexp: '\.\s+<\(k3s completion bash\)'
line: ". <(k3s completion bash) # Added by k3s-ansible"
- name: Change server to API endpoint instead of localhost
ansible.builtin.command: >-
/usr/local/bin/k3s kubectl config set-cluster default
--server=https://{{ api_endpoint }}:{{ api_port }}
--kubeconfig ~{{ ansible_user }}/.kube/config
changed_when: true
- name: Copy kubectl config to local machine
ansible.builtin.fetch:
src: /etc/rancher/k3s/k3s.yaml
dest: "{{ kubeconfig }}"
flat: true
- name: Check whether kubectl is installed on control node - name: Check whether kubectl is installed on control node
ansible.builtin.command: 'kubectl' ansible.builtin.command: 'kubectl'
register: kubectl_installed register: kubectl_installed
...@@ -100,29 +87,46 @@ ...@@ -100,29 +87,46 @@
become: false become: false
changed_when: false changed_when: false
- name: Setup kubeconfig k3s-ansible context - name: Apply K3S kubeconfig to control node
when: kubeconfig == "~/.kube/config.new" and kubectl_installed.rc == 0 when: kubectl_installed.rc == 0
ansible.builtin.replace: block:
path: "{{ kubeconfig }}" - name: Copy kubeconfig to control node
regexp: 'name: default' ansible.builtin.fetch:
replace: 'name: k3s-ansible' src: /etc/rancher/k3s/k3s.yaml
delegate_to: 127.0.0.1 dest: "{{ kubeconfig }}"
become: false flat: true
- name: Merge with any existing kube config - name: Change server address in kubeconfig on control node
when: kubeconfig == "~/.kube/config.new" and kubectl_installed.rc == 0 ansible.builtin.shell: |
ansible.builtin.shell: | KUBECONFIG={{ kubeconfig }} kubectl config set-cluster default --server=https://{{ api_endpoint }}:{{ api_port }}
TFILE=$(mktemp) delegate_to: 127.0.0.1
KUBECONFIG=~/.kube/config.new kubectl rename-context default k3s-ansible become: false
KUBECONFIG=~/.kube/config.new kubectl config set-context k3s-ansible --user=k3s-ansible --cluster=k3s-ansible register: csa_result
KUBECONFIG=~/.kube/config.new:~/.kube/config kubectl config view --flatten > ${TFILE} changed_when:
mv ${TFILE} ~/.kube/config - csa_result.rc == 0
rm ~/.kube/config.new
delegate_to: 127.0.0.1 - name: Setup kubeconfig k3s-ansible context on control node
become: false when: kubeconfig != "~/.kube/config"
register: mv_result ansible.builtin.replace:
changed_when: path: "{{ kubeconfig }}"
- mv_result.rc == 0 regexp: 'name: default'
replace: 'name: k3s-ansible'
delegate_to: 127.0.0.1
become: false
- name: Merge with any existing kubeconfig on control node
when: kubeconfig != "~/.kube/config"
ansible.builtin.shell: |
TFILE=$(mktemp)
KUBECONFIG={{ kubeconfig }} kubectl config set-context k3s-ansible --user=k3s-ansible --cluster=k3s-ansible
KUBECONFIG={{ kubeconfig }}:~/.kube/config kubectl config view --flatten > ${TFILE}
mv ${TFILE} ~/.kube/config
rm {{ kubeconfig }}
delegate_to: 127.0.0.1
become: false
register: mv_result
changed_when:
- mv_result.rc == 0
- name: Start other server if any and verify status - name: Start other server if any and verify status
when: when:
......