Когда лучше всего читать книгу? Когда вы впервые купили ее, воспользуйтесь свежестью, чтобы сначала понять книгу, а затем сразу же закончить ее чтение. Если вы пропустили лучшее время для чтения книги, когда это подходящее время, когда вам нужен материал или знания о ней.
В последнее время я работаю над инструментами автоматизации Ansible. Пожалуйста, обратитесь кРуководство по началу работы с Ansible. Основная цель — реализовать задачу выполнения связанных операций на удаленном хосте и использовать это как точку входа для обучения.
После реализации своих задач я готов перейти к другим применениям Ansible. Ниже мое личное резюме.
Опыт:
- Контента в документе очень много, и осилить его весь невозможно.Используйте правило 2/8, чтобы увидеть, какой основной контент у ваших коллег
- Для практического контента вам все равно нужно написать код самостоятельно, запустить его и увидеть эффект. Когда вы просматриваете код, который вы написали сами, вы, возможно, усвоили этот пункт знаний.
- Вот быстрый способ начать: если вы отчаянно пытаетесь решить проблему, попросите кого-нибудь с опытом. Если вы не спешите, постарайтесь сначала понять содержание и спросите других, если вы не понимаете. Повторите ваши вопросы.
- Не стесняйтесь задавать вопросы, время дорого.
Следующее резюме в основном основано на примерах:
- Первый черновик: отбросить все ссылки и обобщить практический опыт
- Второй черновик: восполнить то, что я не понимаю
- Третий черновик: Исправьте не то место в ссылке и опубликуйте.
Контур:
- файл конфигурации ansible.cfg
- Переменная
- судить
- цикл
- Общие модули
- debug
- copy
- file
- shell
- command
- stat
- unarchive
- ping
- template
- user
- group
- service
- get_url
- include
- role
- Структура каталогов
- полагаться
- исполнительный лист
Ansible написан на Python и работает на основе модульного подхода, где реальные действия по обработке — это эти модули. Ansible обеспечивает общую структуру.
1. Установка
pip install ansible
Или установите его в соответствии с версией Linux
apt-get install ansible
Хосту управления требуется Linux, а хосту узла необходимо установить Python и соответствующие библиотеки.
Как правило, и хост управления, и хост узла работают под управлением Linux.
2. Основное использование
Запуск из командной строки:
Режим командной строки подходит для простых действий.
ansible all -m ping
Плейбук работает:
Плейбуки подходят для сложных действий по обработке.
ansible-playbook example.yml
Посмотреть поддерживаемые модули:
ansible-doc -l
Просмотр параметров использования и поддержки модуля:
ansible-doc -s ping
3. Файл конфигурации
После завершения установки в каталоге по умолчанию есть два файла:
/etc/ansible/hosts
/etc/ansible/ansible.cfg
Файл hosts определяет IP-адрес узла узла и следующую информацию о конфигурации.
Файл ansible.cfg определяет глобальный файл конфигурации.Есть много элементов конфигурации.Как правило, ваши ежедневные задачи могут выполняться по умолчанию.
Но в дополнение к сгенерированному по умолчанию файлу ansible.cfg вы можете создать такой же файл ansible.cfg с таким же именем в своем собственном проекте.
Порядок, в котором ansible читает файлы конфигурации, следующий:
- Определяется в переменной окружения ANSIBLE_CONFG.
- ansible.cfg текущий каталог
- */ansible.cfg текущий пользователь home/username/ansible.cfg
- /etc/ansible/ansible.cfg Путь к сгенерированному файлу по умолчанию
Как понимать эту информацию о чтении конфигурационного файла?
Например:
# 当前项目结构
ansible:
---playbooks
---example
---leanr-ansible/example.yml
---ansible.cfg
Вы выполняете в этом каталоге: команду ansible
- Затем сначала проверьте, установлена ли переменная среды, если нет, прочитайте информацию о конфигурации ansible.cfg в текущем каталоге;
- Если текущий каталог не задан, выполните поиск информации о конфигурации в домашнем каталоге.
- В противном случае прочтите сгенерированную по умолчанию информацию о конфигурации.
4. Общие модули
Пример действия операции
Вот пример, чтобы только понять сценарии использования этих модулей и сознательно выполнять многоэтапные операции.
- узел управления копированием
/home/ubuntu/zartclient
внизzartcli
а такжеzartcli.ini
файл на хост узла/home/ubuntu/zartclient
Вниз - На основе предыдущего шага скопируйте
/home/ubuntu/zartclient/zartcli
к/usr/bin/zartcli
- Используйте файл, только что скопированный на хосте узла, чтобы выполнить команду загрузки:
zartcli -o=download -i=admin -m=bin -n=op-cli -v=v0.0.3 -p=/home/ubuntu/download
Скачать в/home/ubuntu/download
содержание - Разархивируйте загруженный файл на хосте узла, чтобы
/paasdata/data
Под содержанием - Скопируйте распакованные файлы в каталог /etc/opcli на хосте node.
- Скопируйте на хост узла
op-cli
к/usr/bin
- на хосте узла
op-cli task list
Выполнение заказа - на хосте узла
op-cli node list
Выполнение заказа
Времена быстрого чтения предполагают, что никто не хочет серьезно рассматривать эти действия. Нарисуйте блок-схему.
Думайте о каждом действии как о задаче.
Шаг 1: Сначала проверьте, есть ли соответствующий файл, если да, скопируйте его
Модули: статистика, копирование, отладка, файл
- Определите, существует ли соответствующая папка на хосте удаленного узла.
- Создать, если его нет
- Скопируйте локальный файл в соответствующий каталог хоста удаленного узла.
- name: is /home/ubuntu/zartclient exists
stat:
path: /home/ubuntu/zartclient
register: result
- name: show result
debug:
msg: "{{result}}"
- name: create dest path in remote
file:
path: "{{ dest-path }}"
state: direstory
with_items:
- "/home/ubuntu/zartclient"
when: not result.stat.exists
- name: copy file to remote
copy:
src: "{{item.src}}"
dest: "{{item.dest}}"
with_items:
- { src: "/home/ubuntu/zartclient/zartcli" dest: "/home/ubuntu/zartclient"}
- { src: "/home/ubuntu/zartclient/zartcli.ini" dest: "/home/ubuntu/zartclient"}
- name: copy zartcli into /usr/bin
copy:
src: "{{item.src}}"
dest: "{{item.dest}}"
with_items:
- { src: "/home/ubuntu/zartclient/zartcli", dest: "/usr/bin"}
Видно, что есть соответствующие модули для обработки соответствующих действий, а модули имеют параметры для выполнения задачи.
-
{{ }}
внутри переменной - with_items: это список, указывающий, что цикл получает переменную
- register : Указывает, что результат выполненного действия присваивается переменной, которая является картой, и содержимое может быть получено по значению ключа
- когда: Указывает на суждение и действует в соответствии с логическим значением результата.
Шаг 2: Сначала проверьте, есть ли файл, и выполните команду загрузки, если он существует.
Файл, скопированный на первом этапе, является клиентом, в основном для загрузки, скачивания и запроса файлов.
Модуль: оболочка, команда
- name: is /home/ubuntu/download exists
stat:
path: "{{item}}"
with_items:
- "/home/ubunt/download"
register: result
- name: create /home/ubuntu/download
file:
path: "{{item}}"
state: direstroy
with_items:
- "home/ubuntu/download"
when: not result.stat.exists
- name: query op-cli
command: "{{tools}} -o={{operate}} -i={{tenants}} -m={{type}} -n={{name}} \
-v={{version}}"
vars:
tools: zartcli
operate: query
tenants: admin
type: bin
name: op-cli
version: v0.0.3
register: result
- name: download op-cli
command: "{{tools}} -o={{operate}} -i={{tenants}} -m={{type}} -n={{name}} \
-v={{version}} -p={{path}}"
vars:
tools: zartcli
operate: query
tenants: admin
type: bin
name: op-cli
version: v0.0.3
path: /home/ubuntu/download
- item — это ключевое слово, представляющее переменную
- item[0] может указывать на то, что переменная является списком, здесь первое значение списка
- item.src может указывать, что переменная является картой, здесь значение src карты
- VARS указывает, что значение соответствующего имени переменной может быть заполнено в модуле.
Шаг 3: Разархивируйте загруженный файл
Файл, загруженный на втором этапе, представляет собой пакет tar, который необходимо распаковать в указанный каталог.
Модуль: разархивировать, файл
- name: create /paasdata/data
file:
path: "/paasdata/data"
state: direstory
- name: untar file
unarchive:
src: "{{src-path}}"
dest: "{{dest-path}}"
remote_src: yes
vars:
src-path: "/home/ubuntu/download/admin_op_cli_v0.0.3/op-cli.tar.gz"
dest-path: "/paasdata/data"
- нет разницы между да и правда
- remote_src: yes указывает, что распакованный файл работает на хосте узла
Шаг 4: Скопируйте файл
- name: create /etc/opcli
file:
path: "/etc/opcli"
state: directory
- name: copy /paadata/data/conf||op-cli
copy:
src: "{{item.src}}"
dest: "{{item.dest}}"
with_items:
- { src: "/paasdata/data/conf/common.yml" dest: "/etc/opcli/conf"}
- { src: "/paasdata/data/op-cli" dest: "/usr/bin"}
Шаг 5: Выполните команду запроса
- name: op-cli task list || op-cli node list
command: "{{item[0]}} {{item[1]}} list"
with_nested:
- [ "op-cli" ]
- ["task", "node", "nodepool"]
- with_nested: вложенный цикл
Вышеприведенное эквивалентно:op-cli task list, op-cli node list, op-cli nodepool list
Вышеприведенное использует несколько циклов для изменения ранее запланированных восьми действий на пять действий, то есть каждое из пяти действий содержит несколько действий.
Новичку легко справиться со всеми вышеуказанными действиями в одном файле, но есть способ получше.
# main.yml
---
- hosts: 10.62.60.21
romote_user: root
tasks:
- name: one # 第一步
- name: two # 第二步
- name: three # 第三步
- name: four # 第四步
- name: five # 第五步
- name: six # 第六步
...
5. include_tasks
Если вы хотите писать задачи, которые можно использовать повторно, это эквивалентно абстрагированию функций в области программирования. ansible предоставляет такой механизм. То есть разбивая большой файл выше на отдельные файлы. Импортируйте файл с помощью метода include_tasks.
Например: описанные выше пятишаговые действия записывают файлы отдельно
- zartclient.yml
- download.yml
- untarfile.yml
- copyfile.yml
- executecommand.yml
запись в плейбуке: mail.yml
Тогда main.yml выглядит следующим образом:
---
- hosts: 10.62.60.21
root_usr: root
tasks:
- include_tasks: zartclient.yml
- include_tasks: download.yml
- include_tasks: untarfile.yml
- include_tasks: copyfile.yml
- include_tasks: executecommand.yml
То есть каждое действие обработки является независимым. повторное использование в любое время.
6. роли
Включить_Тазы, способ найти одну анабедный игровой книг лучшей организации.
Anbible предоставляет лучшую организацию: роли
Роли автоматически загружают определенные vars_files, задачи и обработчики на основе известной файловой структуры. Группировка контента на основе ролей позволяет нам легко делиться ролями с другими пользователями. Такая организация упрощает повторное использование. Каждое относительно независимое действие обработки является независимым и может применяться к более сложным сценариям.
Файл роли, вероятно, включает в себя следующее:
- файл задач: в основном писать действия по обработке независимого модуля
- файл обработчиков:
- файл vars: в основном записывайте переменные независимого модуля
- метафайл: в основном пишут зависимости, то есть независимый модуль ссылается на другую роль
- файл по умолчанию: файл переменных по умолчанию
- файл шаблонов: файл шаблона
- файлы файл
Обратите внимание, что в папке с именем может быть несколько суффиксов.yml
файл, но должен иметьmain.yml
документ
Вышеуказанная обработка операции, использующая роли реорганизованными следующим образом:
содержание:
├─ansible
│ ├─playbook
│ └─roles
│ ├─download-bin
│ │ ├─tasks
│ │ └─vars
│ └─op-cli
│ ├─meta
│ ├─tasks
│ └─vars
Вот пример описанного выше действия по обработке: загрузить файл самостоятельно в роль загрузки-бина и описать, как написать роль.
tasks/deploy.yml
- name: download bin by zartcli
command: "{{zartcli_cli_path}}/zartcli -o=download -i={{tenant_id}} -m={{bin_type}} \
-n={{bin_name}} -v={{bin_version}} -p={{download_path}}"
tasks/main.yml
---
- include_tasks: download.yml
vars:
zartcli_cli_path: "{{zartcli_clipath}}"
tenant_id: "{{tenantid}}"
bin_name: "{{binname}}"
bin_version: "{{binversion}}"
download_path: "{{downloadpath}}"
bin_type: "{{bintype}}"
vars/main.yml
---
zartcli_clipath: "/home/cloud/zartclient"
tenantid: "admin"
binname: "op-cli"
binversion: "v0.0.3"
downloadpath: "/home/cloud/zartclidownload"
bintype: "bin"
task/main.yml — запись для этой роли. Импортируйте файл download.yml и поместите все переменные, необходимые для загрузки, в файл var/main.yml.
Другие роли должны повторно использовать этот модуль:
op-cli/meta/main.yml
dependencies:
- role: download-bin
Таким образом, роль op-cli также имеет действие загрузки.
Роли подходят для проектов с более сложной организацией.Каждый модуль обрабатывается независимо и может повторно использоваться друг с другом. Использование include_tasks имеет такие недостатки, как более низкая возможность повторного использования модулей и повторное определение переменных.
Вышеупомянутая роль op-cli повторно использует download-bin без повторного определения переменных.
Еще одна вещь, на которую стоит обратить внимание, это то, что порядок выполнения общего playbook согласуется с порядком определения задачи.
После использования ролей сначала выполняются роли в плейбуке, а затем выполняются в порядке, определенном задачами.
Если вам нужно сначала выполнить задачу или выполнить задачу в последнюю очередь, вы можете использоватьpre_tasks
а такжеpost_tasks
.
-
pre_tasks
выполнить первым -
post-tasks
Окончательная реализация
Другое использование ролей требует настройки ansible.cfg
roles_path = 目录
# 即roles 所在的文件目录
7. Ссылки
Эти базовые вещи не очень легко объяснить словами, и когда я столкнусь со словами, которые трудно выразить в будущем, я буду записывать видео и практиковать их. Таким образом, читатель может понять лучше.