«Руководство по началу работы с Ansible: 2»

задняя часть Linux Командная строка Ansible

Ansible 上手指南 2.png

Когда лучше всего читать книгу? Когда вы впервые купили ее, воспользуйтесь свежестью, чтобы сначала понять книгу, а затем сразу же закончить ее чтение. Если вы пропустили лучшее время для чтения книги, когда это подходящее время, когда вам нужен материал или знания о ней.

В последнее время я работаю над инструментами автоматизации 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. Ссылки


Эти базовые вещи не очень легко объяснить словами, и когда я столкнусь со словами, которые трудно выразить в будущем, я буду записывать видео и практиковать их. Таким образом, читатель может понять лучше.