Ansible Playbook Documentation
This document provides an overview of the Ansible playbook configure_server.yml.
# ansible/configure_server.yml
---
- hosts: localhost
gather_facts: yes
become: yes
vars:
ansible_python_interpreter: /usr/bin/python3
tasks:
- name: Check if Ubuntu 20.xx is installed
assert:
that:
- ansible_distribution == 'Ubuntu'
- ansible_distribution_major_version | int >= 20
msg: "Please use Ubuntu 20.xx version. Current version: {{ ansible_distribution }} {{ ansible_distribution_version }}"
- name: Add NOPASSWD rule to sudoers
block:
- name: Add NOPASSWD rule to sudoers
lineinfile:
path: /etc/sudoers
line: '%sudo ALL=(ALL) NOPASSWD: ALL'
become: yes
register: result
ignore_errors: yes
- name: Print success message
debug:
msg: "Sudo NOPASSWD rule added successfully."
when: result is not failed
- name: Print error message and stop execution
block:
- debug:
msg: "Error occurred while modifying sudoers file."
- meta: end_play
when: result is failed
- name: Setup Current Directory and Destination Directory
block:
- name: Get Current Directory
command: pwd
register: current_dir_output
changed_when: false
ignore_errors: true
- name: Debug Current Directory
debug:
var: current_dir_output.stdout
- name: Debug current_dir_output.stdout
debug:
var: current_dir_output.stdout
- name: Set Destination Directory
set_fact:
dest_directory: "{{ current_dir_output.stdout | replace('/navidec/ansible', '') }}"
changed_when: false
- name: Debug Destination Directory
debug:
var: dest_directory
- name: Copy run.sh from navidec to parent directory
block:
- name: Copy run.sh file
copy:
src: "{{ dest_directory }}/navidec/run.sh"
dest: "{{ dest_directory }}/run.sh"
remote_src: yes
mode: preserve
- name: Change owner of run.sh
file:
path: "{{ dest_directory }}/run.sh"
owner: "{{ ansible_env.SUDO_USER }}"
group: "{{ ansible_env.SUDO_USER }}"
become: yes
- name: Install Containernet
block:
- name: Check if Containernet repository already exists
stat:
path: "{{ dest_directory }}/containernet"
register: containernet_repo
- name: Remove existing Containernet repository if it exists
when: containernet_repo.stat.exists
file:
path: "{{ dest_directory }}/containernet"
state: absent
ignore_errors: yes
become: yes
- name: Clone Containernet repository
git:
repo: https://github.com/containernet/containernet.git
dest: "{{ dest_directory }}/containernet"
clone: yes
update: yes
become: yes
- name: Remove existing 'openflow' directory if it exists
file:
path: "{{ dest_directory }}/openflow"
state: absent
ignore_errors: yes
become: yes
- name: Run Containernet install playbook
shell: ansible-playbook -i localhost, -c local "{{ dest_directory }}/containernet/ansible/install.yml"
become: yes
register: containernet_output
- name: Display Containernet install playbook output
debug:
var: containernet_output.stdout_lines
- name: Update package list and Install packages
apt:
name: sshpass, latexmk, texlive-fonts-recommended, texlive-latex-extra, texlive-fonts-extra
update_cache: yes
state: present
become: yes
- name: Install Kubectl
block:
- name: Download Kubectl
get_url:
url: "https://dl.k8s.io/release/{{ lookup('url', 'https://dl.k8s.io/release/stable.txt').split('\n')[0] }}/bin/linux/amd64/kubectl"
dest: "{{ dest_directory }}/kubectl"
become: yes
- name: Install Kubectl
command: >
install "{{ dest_directory }}/kubectl" kubectl
args:
chdir: /usr/local/bin
become: yes
- name: Remove Kubectl setup file
file:
path: "{{ dest_directory }}/kubectl"
state: absent
become: yes
- name: Install Sysbox
block:
- name: Download Sysbox
get_url:
url: "https://downloads.nestybox.com/sysbox/releases/v0.6.2/sysbox-ce_0.6.2-0.linux_amd64.deb"
dest: "{{ dest_directory }}/sysbox-ce_0.6.2-0.linux_amd64.deb"
become: yes
- name: Install jq
apt:
name: jq
state: present
become: yes
- name: Install Sysbox
apt:
deb: "{{ dest_directory }}/sysbox-ce_0.6.2-0.linux_amd64.deb"
become: yes
- name: Remove Sysbox setup file
file:
path: "{{ dest_directory }}/sysbox-ce_0.6.2-0.linux_amd64.deb"
state: absent
become: yes
- name: Check Sysbox Service Status
block:
- name: Get Sysbox service status
shell: systemctl is-active sysbox
register: sysbox_status
changed_when: false
- name: Print Sysbox service status
debug:
msg: "Sysbox service is {{ sysbox_status.stdout }}"
- name: Update Docker daemon and restart it
block:
- name: Insert line into file
ansible.builtin.lineinfile:
path: /etc/docker/daemon.json
insertafter: '"bip": "172.20.0.1/16",'
line: ' "default-runtime": "sysbox-runc",'
state: present
become: yes
- name: Restart docker
ansible.builtin.systemd:
name: docker
state: restarted
become: yes
- name: Install pip3 and required packages
command: pip3 install psutil networkx pika fastapi uvicorn requests rich sphinx sphinx-rtd-theme sphinx-sitemap myst-parser linkify-it-py
become: yes
- name: Install Node.js
block:
- name: Download Node.js setup script
get_url:
url: "https://deb.nodesource.com/setup_20.x"
dest: "{{ dest_directory }}/nodesource_setup.sh"
become: yes
- name: Run Node.js setup script
command: "bash {{ dest_directory }}/nodesource_setup.sh"
become: yes
- name: Install Node.js
apt:
name: nodejs
state: present
become: yes
- name: Remove Node.js setup script
file:
path: "{{ dest_directory }}/nodesource_setup.sh"
state: absent
become: yes
- name: Check Node.js version
command: "node --version"
register: node_version
changed_when: false
become: yes
- name: Print Node.js version
debug:
msg: "Node.js version is {{ node_version.stdout }}"
- name: Install nodemon
block:
- name: Upgrade npm using sudo
command: "npm install -g npm"
become: yes
ignore_errors: yes
- name: Print npm upgrade result
debug:
msg: "npm upgraded successfully."
when: node_version.stdout is defined and "npm" not in node_version.stdout
- name: Install nodemon using sudo
command: "npm install -g nodemon"
become: yes
ignore_errors: yes
- name: Print nodemon installation result
debug:
msg: "nodemon installed successfully."
when: node_version.stdout is defined and "nodemon" not in node_version.stdout
- name: Install nodemon using npm
command: "npm install -g nodemon"
become: yes
ignore_errors: yes
- name: Print nodemon installation result
debug:
msg: "nodemon installed successfully."
when: node_version.stdout is defined and "nodemon" not in node_version.stdout
- name: export COLORTERM=truecolor to current user
block:
- name: Get the current user
set_fact:
current_user: "{{ ansible_env.SUDO_USER | default(ansible_env.USER) }}"
- name: Print the username
ansible.builtin.debug:
msg: "Current user is: {{ current_user }}"
- name: Check if '#export COLORTERM=truecolor' is in ~/.bashrc
command: grep -q "#export COLORTERM=truecolor" "/home/{{ current_user }}/.bashrc"
register: grep_result
ignore_errors: yes
- name: Remove '#' from the line if it exists
replace:
path: "/home/{{ current_user }}/.bashrc"
regexp: '^#export COLORTERM=truecolor'
replace: 'export COLORTERM=truecolor'
when: grep_result.rc == 0
- name: Check if export COLORTERM=truecolor is in ~/.bashrc
command: grep -q "export COLORTERM=truecolor" "/home/{{ current_user }}/.bashrc"
register: grep_result
ignore_errors: yes
- name: Add export COLORTERM=truecolor to ~/.bashrc if not present
lineinfile:
path: "/home/{{ current_user }}/.bashrc"
line: "export COLORTERM=truecolor"
when: grep_result.rc != 0
- name: Create docker group & add current user to it
block:
- name: Get the current non root remote user
set_fact:
remote_regular_user: "{{ ansible_env.SUDO_USER }}"
- name: Print the username
ansible.builtin.debug:
msg: "Current user is: {{ remote_regular_user }}"
- name: Add docker group
ansible.builtin.group:
name: docker
state: present
- name: Add user to docker group
ansible.builtin.user:
name: "{{ remote_regular_user }}"
groups: docker
append: yes
Playbook Overview
The configure_server.yml playbook is designed to configure a server. It performs the following tasks:
Ensure that the server is running Ubuntu 20.xx.
Add an NOPASSWD rule to the sudoers file.
Set up the current directory and destination directory.
Copy the run.sh script from the navidec directory to the parent directory.
Install Containernet if it's not already installed.
Update the package list and install required packages.
Install Kubectl.
Install Sysbox.
Check the status of the Sysbox service.
Update the Docker daemon and restart it.
Install Python packages using pip3.
Install Node.js and nodemon.
Export COLORTERM=truecolor to the current user's environment.
Create a docker group and add the current user to it.
Please refer to the playbook source code for detailed task configurations.
For more information on Ansible, refer to the official documentation: https://docs.ansible.com/
For information on YAML syntax, refer to the YAML documentation: https://yaml.org/
Playbook Usage
You can run the playbook using the following command:
Firstly, initiate the installation of Ansible on a freshly installed version of Ubuntu 20.xx:
sudo apt-get update && sudo apt-get install ansible -y
Next, clone the NaviDec repository:
git clone -b v4-Auto https://gitlab.inria.fr/fgiarre/navidec.git
Lastly, run the Ansible playbook to install the required dependencies:
sudo ansible-playbook -i "localhost," -c local navidec/ansible/configure_server.yml && exit
After the installation is complete, the current active terminal session will automatically log you out. You can log back in to ensure that your group membership is re-evaluated.
Note
This playbook assumes that you have Ansible installed on your system.
Warning
Be cautious when making changes to system configurations, especially when using become and sudo privileges.
For more information on using Ansible playbooks, consult the Ansible documentation.