Рубрики
Uncategorized

Ansible IV: управление переменными и фактами

Синдуцированный контент! Проверьте оригинал ANSIBLE IV: Управление переменными и фактами @ hectormartinez.dev … с меткой DevOps, Ansible, Automation.

Синдуцированный контент! Проверьте оригинал Ansible IV: управление переменными и фактами @ hectormartinez.dev

В последнем посте мы создали три машины с использованием Vagrant и VirtualBox. Эти машины соответствуют База данных В Бэкэнд и фронт в нашей системе. В этой четвертой записи мы настроим базу данных, взглянув на то, как работают переменные и факты.

Примечание : Мы работаем как в PowerShell, так и в WSL. Каждый раз, когда вы сталкиваетесь с кодовым ящиком «Bash», и вы находитесь в Windows, вы должны запустить его внутри WSL. Проверьте первый пост серии, чтобы установить WSL.

В переменные и факты

Мы уже использовали переменные в верхней части наших пьес, чтобы определить ansible_user а также ansible_private_key_file :

- name: install database
  hosts: database

  vars:
    ansible_user: vagrant
    ansible_private_key_file: .vagrant/machines/database/virtualbox/private_key

Извлечено из документация … » Ansible использует переменные, чтобы помочь справиться с различиями между системами «.

Например, две конфигурации могут иметь разные версии, поэтому вы отражаете это внутри переменной и используете эту переменную для создания правильных задач. Или конфигурация, которая должна быть готова к запуску внутри CentOS и Debian, которая должна будет знать, как вызываются зависимости в двух ОС.

Есть много способов использовать переменные, где много означает 22 . Да, это безумие. Закладка эта ссылка так как это поможет вам узнать, где поместить переменную. Два основных местах, где я использую переменные: внутри Groups_vars Папка, в командной строке и внутри файла инвентаризации.

каталог GROUP_VARS

Group_vars Справочник может быть размещен в двух местах: рядом с пьесами или рядом с инвентарем:

ansible-directory/
├── group_vars # Playbook group_vars
├── inventories
│   ├── group_vars # Inventory group vars
│   └── inventory.ini
└── playbook.yml

Я обычно создаю Group_vars Папка Playbook, но с несколькими запасами с разными переменными, каждая — хорошая идея, чтобы использовать Group_vars на уровне инвентаря.

Внутри Group_vars Папка Вы можете создавать файлы с переменными для каждой из групп инвентаризации. Итак, всегда будет группа, которая называется все , который содержит все хосты. Итак, переменные, определенные в group_vars/all.yml будет добавлен ко всем хостам. У вас есть группа для серверов в Европе под названием ЕС ? Если вы хотите применить конкретные значения к их переменным, например, зеркало для загрузки пакетов, создайте group_vars/eu.yml И они будут загружать эти переменные.

Будьте осторожны, потому что переменные внутри group_vars/all.yml Предпочтительны по сравнению с group_vars/eu.yml ( Документация ).

-Extra-Vars | -e Опция команды

Переменные, проходящие здесь, будут переоценить любую другую переменную, указанную где угодно. Я использую их экономно, я склонен использовать другие варианты. С уважением, я использую их для передачи параметров подключения, таких как ansible_user и ansible_password В Но я не буду рекомендовать, есть лучшие варианты, такие как Ansible Vault Анкет

Теперь вернемся к нашим файлам.

Где мы ушли в прошлый раз …

Последний пост завершился нашими книгами и файлами таким образом:

.
├── Vagrantfile 
├── backend.yml 
├── database.yml
├── frontend.yml
├── inventory
└── main.yml

Мы будем работать только с Database.yml в это время. Итак, давайте начнем с воссоздания окружающей среды (которую вы, вероятно, уничтожили):

vagrant up database

Тогда мы должны очистить наши ~/.ssh/stornal_hosts Как будет жаловаться на IPS, имеющие другие хосты ( Предупреждение: Удаленная идентификация хоста изменилась! ):

ssh-keygen -f ~/.ssh/known_hosts -R 10.0.0.30

Еще один шаг, на котором мы сгенерируем ключи хоста, чтобы поместить в нашем ~/.ssh/stornal_hosts Чтобы избежать подтверждения ключа хоста:

$ ssh-keyscan -H 10.0.0.30 > ~/.ssh/known_hosts
# 10.0.0.30:22 SSH-2.0-OpenSSH_7.6p1 Ubuntu-4ubuntu0.3
# 10.0.0.30:22 SSH-2.0-OpenSSH_7.6p1 Ubuntu-4ubuntu0.3
# 10.0.0.30:22 SSH-2.0-OpenSSH_7.6p1 Ubuntu-4ubuntu0.3

Примечание : Иногда вам приходится запустить эту команду два раза, не спрашивайте меня, почему.

И последнее, но не менее важное шаг, который исправит ошибку в отношении ключей, имеющих слишком открытые разрешения:

chmod 400 .vagrant/machines/*/virtualbox/private_key

Теперь мы готовы запустить наши пьесы! Но на этот раз только та база данных:

$ ansible-playbook -i inventory database.yml
PLAY [configure database]

TASK [Gathering Facts]
ok: [10.0.0.30]

TASK [Hello!]
ok: [10.0.0.30] => {
    "msg": "Hello from database!"
}

PLAY RECAP
10.0.0.30                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Установка нашей базы данных

Получение задач от документации MongoDB и перевод на Ansible

Итак, теперь, когда у нас работает система, мы можем начать с внесения изменений в нашу книгу. Я решил пойти с MongoDB, потому что да. Первое, что я обычно делаю, это изучить процесс установки, в нашем случае он здесь, в Документация MongoDB . Есть список команд, которые мы должны запустить для установки MongoDB:

$ sudo apt-get install gnupg
$ wget -qO - https://www.mongodb.org/static/pgp/server-4.2.asc | sudo apt-key add -
$ echo "deb [ arch=amd64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.2.list
$ sudo apt-get update
$ sudo apt-get install -y mongodb-org

Теперь мы должны «перевести» эти команды на задачи Ansible. Ansible module index Содержит все модули, поэтому вы можете быстро их искать в своем браузере. Пока вы их не узнаете, вероятно, лучше искать в вашей поисковой системе, используя «Ansible» и команда, которую вы хотите запустить, например, «Ansible apt-get» И это укажет вам на модуль, который выполняет эту операцию. Первый apt-get соответствует Ansible Apt модуль Анкет

Как только мы выполнили этот процесс всех команд, соответствие между командами и модулями является следующим:

install gnupg - apt module
add mongodb asc key - apt_key module
add deb repository to apt sources - apt_repository module
update package lists - apt module
install mongodb-org - apt module

И затем те, кто преобразован в задачи внутри пьесы, будут выглядеть так:

---
- name: install MongoDB
  hosts: database

  vars:
    ansible_user: vagrant
    ansible_private_key_file: .vagrant/machines/database/virtualbox/private_key

  tasks:
    - name: install gnupg
      become: yes
      apt:
        name: gnupg
        update_cache: yes

    - name: add apt key
      become: yes
      apt_key:
        url: https://www.mongodb.org/static/pgp/server-4.2.asc

    - name: add apt repository
      become: yes
      apt_repository:
        repo: deb [ arch=amd64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.2 multiverse
        filename: mongodb-org-4.2.list

    - name: install
      become: yes
      apt:
        name: mongodb-org

Запуск и настройка базы данных

Эти шаги не запускают процесс базы данных, поэтому мы должны это сами. В Документация MongoDB Они используют SystemCtl Команда, которая соответствует Сервис модуль Анкет Добавьте следующую задачу внизу пейзатора:

- name: start service
  service:
    name: mongod
    state: started

Запустите Playbook еще раз и убедитесь, что база данных работает. Для этого вы можете проверить, открыт ли порт MongoDB с помощью NetCat через NC командование Это не доказательство того, что база данных работает OK, но, по крайней мере, этот порт слушает запросы:

nc -v -z 10.0.0.30 27017

Извините, это должно терпеть неудачу с ... не удалось: соединение отказано Анкет Не волнуйтесь, мы должны настроить базу данных, чтобы принять входящие запросы из происхождения, кроме Localhost Анкет Тем не менее, вы можете войти в виртуальную машину, запустить одну и ту же команду, но против Localhost (что должно быть):

$ vagrant ssh database
$ nc -v -z localhost 27017
Connection to localhost 27017 port [tcp/*] succeeded!
$ exit

MongoDB по умолчанию Переплет к 127.0.0.1 , IP для Localhost , поэтому принимайте только запросы от Localhost . С тех пор, как наш первый тест прошел из -за пределов виртуальной машины, он потерпел неудачу. Такое поведение может быть настроено в /etc/mongod.conf конфигурационный файл. Должен быть следующий блок Yaml:

# [...other content...]

net:
  port: 27017
  bindIp: 127.0.0.1

# [...other content...]

Заменим это 127.0.0.1 с Ansible, используя заменить модуль Анкет Добавьте следующую задачу перед Начать обслуживание задача:

# [...previous tasks...]

- name: configure bindIp
  become: yes
  replace:
    path: /etc/mongod.conf
    regexp: 127.0.0.1
    replace: 0.0.0.0

Это заменит строку 127.0.0.1 , IP для Localhost , для 0.0.0.0 , IP для Все IPS , поэтому сервис примет соединения от всех происхождений.

Если вы снова запустите Playbook и проверьте, открыт ли порт из -за пределов виртуальной машины, он снова потерпит неудачу. Вы должны перезапустить услугу Mongod. Пока сделайте это изнутри виртуальной машины:

$ vagrant ssh database
$ sudo systemctl restart mongod
$ exit
$ nc -z -v 10.0.0.30 27017
Connection to 10.0.0.30 27017 port [tcp/*] succeeded!

Большой! Теперь у вас есть полностью функциональная база данных. Теперь давайте извлеките переменные из этой книги в group_vars/all.yml Файл (на уровне Playbook).

Извлечение переменных

Первое, что приходит мне в голову, это версия MongoDB, которую будет легко извлечь. Создать group_vars/all.yaml Файл на уровне Playbook и добавьте туда mongodb_version переменная:

# group_vars/all.yml
---
mongodb_version: 4.2

С этим мы можем пойти в нашу книгу и заменить 4.2 для этой переменной. Здесь я перечислил только задачи, которые должны измениться, а не полная пьеса:

---
# [...previous content...]
    - name: add apt key
      become: yes
      apt_key:
        url: 'https://www.mongodb.org/static/pgp/server-{{ mongodb_version }}.asc'

    - name: add apt repository
      become: yes
      apt_repository:
        repo: 'deb [ arch=amd64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/{{ mongodb_version }} multiverse'
        filename: 'mongodb-org-{{ mongodb_version }}.list'

# [...following content...]

Вы должны использовать '{{mongodb_version}}' Чтобы заменить значение внутри струн. Этот синтаксис исходит от Джинджа2 шаблонный двигатель который Ansible использует под капюшоном. Обратите внимание, что когда мы обращаемся к переменной внутри строки, как мы делаем в нашем примере, вы должны процитировать полную строку (мы добавили отдельные кавычки ' Во всех строках, которые используют переменную).

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

# group_vars/all.yml
---
mongodb_version: 4.2
mongodb_apt_key_url: 'https://www.mongodb.org/static/pgp/server-{{ mongodb_version }}.asc'
mongodb_apt_repository_repo: 'deb [ arch=amd64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/{{ mongodb_version }} multiverse'
mongodb_apt_repository_filename: 'mongodb-org-{{ mongodb_version }}.list'

И в пьесе будет похоже на:

---
# [...previous content...]
    - name: add apt key
      become: yes
      apt_key:
        url: '{{ mongodb_apt_key_url }}'

    - name: add apt repository
      become: yes
      apt_repository:
        repo: '{{ mongodb_apt_repository_repo }}'
        filename: '{{ mongodb_apt_repository_filename }}'

# [...following content...]

Может быть, этот пример не так уж и хорош, может быть, мы слишком много движемся к переменным. Однако вы тот, кто это сказал, поэтому будьте осторожны с извлечением слишком много (или слишком меньше) в переменные.

Теперь давайте перейдем к фактам!

Факты

Ансибл вызовите факты информации о чем -то. Есть несколько модулей, которые собирают эти факты и заполняют некоторые переменные под капюшоном. Например ec2_metadata_facts которые «собирает факты (метаданные экземпляра) о удаленных хостах в EC2», или [Lister_ports_facts], которые «собирают факты на процессах, слушающих на портах TCP и UDP». Если вы ищете Список всех модулей Вы найдете их много.

Здесь я хочу поговорить о настройка модуль и Gather_facts Playbook «запись». По умолчанию Ansible знает определенные вещи о хостах, которые он должен настроить. Тем не менее, мы можем сделать это явным (потому что это включено по умолчанию) или заставляя его прекратить это делать. Это контролируется на уровне Playbook по Gather_facts вход:

# random-playbook.yml
---
- name: my random playbook
  hosts: all

  gather_facts: no  # yes by default

  vars:
    ...

  tasks:
    ...

Но какая информация собирается? Мы можем проверить это, используя настройка модуль через командную строку. Для нашего случая:

ansible database -i inventory -m setup -e "ansible_user=vagrant ansible_private_key_file=.vagrant/machines/database/virtualbox/private_key" > setup_information.json

После этого у меня есть файл 766 строк, полный переменных, которые будут изучены. Я выбрал несколько интересных:

{
    "ansible_architecture": "x86_64",
    "ansible_distribution": "Ubuntu",
    "ansible_distribution_release": "bionic",
    "ansible_distribution_version": "18.04",
    "ansible_lsb": {
        "codename": "bionic",
        "description": "Ubuntu 18.04.4 LTS",
        "id": "Ubuntu",
        "major_release": "18",
        "release": "18.04"
    },
    "ansible_os_family": "Debian",
    "ansible_processor_cores": 2,
    "ansible_processor_count": 1,
    "ansible_processor_threads_per_core": 1,
    "ansible_processor_vcpus": 2,
    "ansible_python": {
        "executable": "/usr/bin/python3",
        "has_sslcontext": true,
        "type": "cpython",
        "version": {
            "major": 3,
            "micro": 9,
            "minor": 6,
            "releaselevel": "final",
            "serial": 0
        },
        "version_info": [
            3,
            6,
            9,
            "final",
            0
        ]
    },
}

И многое еще. Мне очень нравятся те, которые дают информацию об архитектуре процессора и распространении. Я их часто использую. Мы также можем использовать их в нашем примере:

# group_vars/all.yml
---
mongodb_version: 4.2
mongodb_apt_key_url: 'https://www.mongodb.org/static/pgp/server-{{ mongodb_version }}.asc'
mongodb_apt_repository_repo: 'deb [ arch=amd64 ] https://repo.mongodb.org/apt/ubuntu {{ ansible_distribution_release }}/mongodb-org/{{ mongodb_version }} multiverse'
mongodb_apt_repository_filename: 'mongodb-org-{{ mongodb_version }}.list'

Здесь мы использовали ansible_distribution_release для mongodb_apt_repository_repo .

Факты действительно очень полезны, в этом случае, если вы планируете запустить пейзаторы в разных выпусках Ubuntu, вам не нужно беспокоиться об изменении URL -адреса каждый раз.

Закрытие

Эти посты заняли больше времени, чем я ожидал, и это было больше, чем я ожидал. Я много откладывал, делая это, так что для завершения потребовались месяцы. Я надеюсь, что это будет полезно. Я пытался сбалансировать прямую информацию с объяснением кусочек, так что это полезно для тех, у кого есть небольшой опыт работы с Ansible и теми, у кого ее нет. Все (на самом деле «большинство») отзывов приветствуются! Оставьте некоторые комментарии, если у вас есть какие -либо проблемы с контентом!

продолжить чтение

Оригинал: «https://dev.to/hmartinezdev/ansible-iv-managing-variables-and-facts-22k5»