Мне удалось использовать Ansible внутри Vagrant.
Вот что я сделал, чтобы все заработало:
Шаги для воспроизведения:
- Установка Vagrant, Virtualbox
- Создайте все необходимые файлы и каталоги
- ansible .cfg
- playbook.yml
- hosts
- insecure_private_key
- Vagrant file
- Тест
Установка Vagrant, Virtualbox
Следуйте инструкциям по установке на соответствующих сайтах:
Создание всех необходимых файлов и каталогов
Этот пример основан на оригинальных файлах постеров .
Создание папок vagrant
и ansible
для хранения всех файлов конфигурации и каталогов. Структура может выглядеть так:
vagrant
- каталог - Vagrantfile - файл с основной конфигурацией
ansible
- каталог - ansible .cfg - файл конфигурации Ansible
- playbook.yml - файл с шагами для Ansible для выполнения
- hosts - файл с информацией о хостах
- insecure_private_key - закрытый ключ созданных машин * Папка 1070 *
Ansible
- это отдельный каталог, который будет скопирован в k8s-node-1
.
По умолчанию Vagrant совместно использует папку vagrant
с разрешениями 777
. Это позволяет владельцу, группе и другим иметь полный доступ ко всему, что находится внутри него.
Вход в виртуальную машину вручную и запуск команды ansible-playbook
внутри каталога vagrant
выведет ошибки, связанные с разрешениями. Это сделает ansible.cfg
и insecure_private_key
бесполезными.
Ansible .cfg
Ansible.cfg
- файл конфигурации Ansible. Пример, используемый ниже:
[defaults]
connection = smart
timeout = 60
deprecation_warnings = False
host_key_checking = False
[ssh_connection]
ssh_args = -o ControlMaster=auto -o ControlPersist=60s -o UserKnownHostsFile=/dev/null -o IdentitiesOnly=yes
Создание ansible.cfg
внутри ansible
каталога.
Playbook.yml
Пример playbook.yml
- это файл с шагами для Ansible выполнить. Он проверит соединения и проверит, правильно ли настроены группы:
- name: Check all connections
hosts: all
tasks:
- name: Ping
ping:
- name: Check specific connection to masters
hosts: masters
tasks:
- name: Ping
ping:
- name: Check specific connection to nodes
hosts: nodes
tasks:
- name: Ping
ping:
Создать playbook.yml
внутри ansible
каталога.
Insecure_private_key
Для успешного подключения к виртуальным машинам вам понадобится insecure_private_key
. Вы можете создать его, вызвав команду: $ vagrant init
внутри vagrant
директории. Он создаст insecure_private_key
внутри вашей физической машины в HOME_DIRECTORY/.vagrant.d
. Скопируйте его в папку ansible
.
Хосты
Ниже hosts
файл отвечает за передачу информации о хостах в Ansible:
[masters]
k8s-master ansible_host=192.168.50.10 ansible_user=vagrant
[nodes]
k8s-node-1 ansible_host=192.168.50.11 ansible_user=vagrant
[all:vars]
ansible_python_interpreter=/usr/bin/python3
ansible_ssh_user=vagrant
ansible_ssh_private_key_file=/ansible/insecure_private_key
Создание hosts
файла в каталоге ansible
.
Пожалуйста, укажите c, смотрите: ansible_ssh_private_key_file=/ansible/insecure_private_key
Это объявление для Ansible для использования ранее упомянутого ключа.
Vagrant
Vagrant
Файл является основным файлом конфигурации:
# -*- mode: ruby -*-
# vi: set ft=ruby :
IMAGE_NAME = "ubuntu/bionic64"
Vagrant.configure("2") do |config|
config.ssh.insert_key = false
config.vm.box = IMAGE_NAME
# Virtualbox configuration
config.vm.provider "virtualbox" do |v|
v.memory = 4096
v.cpus = 2
#v.linked_clone = true
end
# master and node definition
boxes = [
{ :name => "k8s-master", :ip => "192.168.50.10" },
{ :name => "k8s-node-1", :ip => "192.168.50.11" }
]
boxes.each do |opts|
config.vm.define opts[:name] do |config|
config.vm.hostname = opts[:name]
config.vm.network :private_network, ip: opts[:ip]
if opts[:name] == "k8s-node-1"
config.vm.synced_folder "../ansible", "/ansible", :mount_options => ["dmode=700", "fmode=700"]
config.vm.provision "ansible_local" do |ansible|
ansible.compatibility_mode = "2.0"
ansible.limit = "all"
ansible.config_file = "/ansible/ansible.cfg"
ansible.become = true
ansible.playbook = "/ansible/playbook.yml"
ansible.inventory_path = "/ansible/hosts"
end
end
end
end
end
Пожалуйста, укажите c посмотрите:
config.vm.synced_folder "../ansible", "/ansible", :mount_options => ["dmode=700", "fmode=700"]
config.vm.synced_folder
скопирует каталог ansible
в k8s-node-1
со всеми файлами внутри.
Устанавливает разрешения на полный доступ только для владельца (бродячего пользователя).
ansible.inventory_path = "/ansible/hosts"
ansible.inventory_path
скажет Vagrant предоставить файл hosts
для Ansible.
Test
Для проверки выполните следующую команду из каталога vagrant
: $ vagrant up
Часть вывода, отвечающая за Ansible, должна выглядеть следующим образом:
==> k8s-node-1: Running provisioner: ansible_local...
k8s-node-1: Installing Ansible...
k8s-node-1: Running ansible-playbook...
PLAY [Check all connections] ***************************************************
TASK [Gathering Facts] *********************************************************
ok: [k8s-master]
ok: [k8s-node-1]
TASK [Ping] ********************************************************************
ok: [k8s-master]
ok: [k8s-node-1]
PLAY [Check specific connection to masters] ************************************
TASK [Gathering Facts] *********************************************************
ok: [k8s-master]
TASK [Ping] ********************************************************************
ok: [k8s-master]
PLAY [Check specific connection to nodes] **************************************
TASK [Gathering Facts] *********************************************************
ok: [k8s-node-1]
TASK [Ping] ********************************************************************
ok: [k8s-node-1]
PLAY RECAP *********************************************************************
k8s-master : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
k8s-node-1 : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0