Я полностью согласен с @ P Ekambaram , что автоматизация kubernetes может быть успешно выполнена с ansible, но в то же время я полностью не согласен с ним, когда дело доходит до того, как это должно быть сделано. Такой «декларативный» код на самом деле вообще не декларативен. Он превращается в простую обертку для набора императивных команд. Кроме того, такая пьеса не является идемпотентным (напомним, что операция является идемпотентной, если результат ее однократного выполнения точно такой же, как и результат ее многократного выполнения без каких-либо вмешательств .). Этот подход противоречит одному из ключевых понятий, представленных в ansible.
shell
или command
модулях, которые следует использовать в ansible как Модули последней инстанции, только если нет другого способа выполнить требуемую задачу, например, когда выделенный модуль не существует или не обладает некоторыми важными функциями.
Когда дело доходит до автоматизации kubernetes с помощью ansible, такие выделенные модули уже существуют.
Взгляните на модуль k8s - ansible для управления объектами kubernetes , и вы увидите, что желаемых результатов можно достичь гораздо более элегантный и понятный способ:
создание пространства имен:
- name: Create a k8s namespace
k8s:
name: testing
api_version: v1
kind: Namespace
state: present
создание службы на основе файла определения yaml
- name: Create a Service object by reading the definition from a file
k8s:
state: present
src: /testing/service.yml
Вы только что упомянули, что используете helm для управления kubernetes приложениями? Взгляните на документацию на штурвал . Есть примеры? Вот вы:
- name: Install helm chart from a git repo
helm:
host: localhost
chart:
source:
type: git
location: https://github.com/user/helm-chart.git
state: present
name: my-example
namespace: default
обновление:
Чтобы иметь возможность запускать большинство Ansible модулей на определенном хосте, вам необходимо установить на него два вещи:
Хотя это верно для большинства модулей, некоторые из них имеют дополнительные требования, которые должны быть выполнены, прежде чем модуль может быть запущен на таком хосте.
Когда дело доходит до модуля k8s
, как мы можем прочитать в его документах :
Для хоста, который выполняет это, необходимы следующие требования module.
python >= 2.7
openshift >= 0.6
PyYAML >= 3.11
Это неправда, что требуется openshift (другая реализация kubernetes). Не имеет смысла устанавливать openshift для управления рабочей нагрузкой нашего kubernetes cluster . Итак, давайте будем точны, чтобы не распространять потенциально вводящую в заблуждение информацию: для этого требуется OpenShift python клиентская библиотека и она должна быть установлена на хосте, на котором работает модуль ( т.е. на хосте, на котором мы обычно выполняем наши kubectl
команды).
Клиент OpenShift Python оборачивает клиента K8s Python, предоставляя полный доступ ко всем доступным APIS и моделям на обеих платформах. Для получения подробной информации о версии API и дополнительной информации посетите страницу https://github.com/openshift/openshift-restclient-python
Внимание!: Вам не нужно устанавливать какие-либо дополнительные модули на узлах kubernetes. Они нужны вам только на машине, с которой вы управляете рабочей нагрузкой kubernetes .
Если у нас установлен Ansible на том же хосте, на котором мы настроили наш инструмент kubectl
, и мы хотим запускать на нем наши игровые книги напрямую, без необходимости использования s sh или настройки ansible инвентарь , нам просто нужно обратиться к нему в нашей ansible playbook as:
hosts: localhost
connection: local
Вся книга воспроизведения для создания нового пространства имен k8s может выглядеть так:
---
- hosts: localhost
connection: local
tasks:
- name: Create a k8s namespace
k8s:
name: testing
api_version: v1
kind: Namespace
state: present
И мы можем запустить его просто выполнив:
ansible-playbook playbook.yaml
Прежде чем мы сможем это сделать, нам нужно убедиться, что у нас установлены все необходимые зависимости, которых на самом деле не так много, и они ограничиваются python 2.7 и две вышеупомянутые библиотеки (в необходимых версиях).
После того, как на вашем хосте установлено Python, самый простой способ установить остальные необходимые зависимости - выполнить runnig:
pip install openshift
и
pip install PyYAML
Вы можете столкнуться со следующей ошибкой:
"msg": "Failed to import the required Python library (openshift) on ***** Python /usr/bin/python. Please read module documentation and install in the appropriate location. If the required library is installed, but Ansible is using the wrong Python interpreter, please consult the documentation on ansible_python_interpreter"
Если это так, запуск:
pip install --upgrade requests
должен исправить это (по крайней мере, это исправило это в моем случае), и после этого наш простой ansible playbook , который создает новый namespace
в нашем kubernetes кластере , должен работать гладко. :)