LINUX.ORG.RU
ФорумAdmin

Ansible. Архитектурное решение для множества серверов.

 


0

2

Здравствуйте!

Подскажите как оптимально решить следующую задачу или в какую сторону копать: Есть список серверов с заранее заданными параметрами <имя сервера>, <внутренний адрес ip 4>, <внешний ip 4>, <маска подсети>, <шлюз>, <ansible_ssh_user>, <ansible_ssh_pass> и т.п. Необходимо быстро получать доступ к нужным полям по имени inventory_hostname = <имя сервера>. Сейчас пытаюсь организовать это через group_vars\all, описав сервера в списке примерно так:

---
cloud_servers:
  - name: Server1 
    ipv4: 192.168.1.10
    gateway_ip: 192.168.2.1
    proxy_ip: 
    app_name: 
    app_version: 
    ansible_ssh_user: user
    ansible_ssh_pass: 123456
    ...
  - name: Server2
    ipv4: 192.168.1.11
    gateway_ip: 192.168.2.1
    proxy_ip: 
    app_name: 
    app_version: 
    ansible_ssh_user: user
    ansible_ssh_pass: 123456
    ...

Спасибо за ответы.

Перемещено leave из general



Последнее исправление: dmvhomemail (всего исправлений: 4)

Форматирование поправь.

у тебя задача - задать эти переменные или запросить?

Задать - в inventory, только не в group_vars/all, а в host_vars/<имя_сервера> для каждого сервера отдельно.

Запросить с произвольного хоста:

hostvars[inventory_hostname]['ansible_all_ipv4_addresses']

Запросить параметры текущего:

{{ ansible_all_ipv4_addresses }}
alpha ★★★★★
()
Ответ на: комментарий от alpha

Задача задать эти параметры и в дальнейшем получать их по имени текущего inventory_hostname. Считаю, что удобнее было-бы хранить это вообще в табличном виде (это база данных в чистом виде), но не знаю как потому-что пока осваиваю ansible.

dmvhomemail
() автор топика
Ответ на: комментарий от dmvhomemail

Задать можно по-разному.

  1. Можно в статическом ini-файле:
[all]
localhost              ansible_connection=local
other1.example.com     ansible_connection=ssh        ansible_user=myuser
other2.example.com     ansible_connection=ssh        ansible_user=myotheruser

Это не group_vars а просто сам inventory-файл.

  1. В yaml-формате тоже можно:
hosts:
  jumper:
    ansible_port: 5555
    ansible_host: 192.0.2.50

Это не таблица, а дерево ключей и параметров. У одного хоста параметров может быть больше, чем у другого. Поэтому структурированный yaml-формат подходит лучше, чем табличный.

  1. Но вообще можно в любом удобном тебе формате, если сверху налепить скрипт, который будет по запросу по имени хоста выдавать его параметры. См. Dynamic Inventory. Хоть из MySQL доставать каждый раз.

Дока тут https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html# с примерами и приёмами.

alpha ★★★★★
()
Ответ на: комментарий от alpha

inventory файл не подходит из-за ключа ansible-playbook –limit <имя сервера>. Становятся недоступны параметры других серверов. Так, что для меня пока не ясно с помощью каких скриптов можно получать значения из выбранных полей.

dmvhomemail
() автор топика

Если только лепишь систему, то:

  1. Сделай сервисного юзера типа ansible_auto на всех хостах.
  2. Логин только по ключу, ключ можно зашифровать ansible-vault
  3. Пароль использовать только для become
  4. Если есть возможность использования ДНС-имени, то Ір адреса в конфігиах не нужні - смотри в сторону модуля setup и gathering facts - все данніе можно взять оттуда
  5. Если у тебя будет везде один юзер (смотри пункт 1), то будет возможность сделать группі хостов (например, по версии апликухи или по имени апликухи). Тогда ті сможеш использвать group_vars без костілей, описав параметрі аккуратно для каждой группі.
PunkoIvan ★★★★
()
Ответ на: комментарий от PunkoIvan

Уточнение: Сервера создаю через VMWare ESXI. Пользователи могут быть разными. DNS нет поэтому IP статические. Шлюзов несколько.

dmvhomemail
() автор топика
Ответ на: комментарий от dmvhomemail

Ты путаешься в показаниях.

Если тебе нужны параметры с других хостов при выполнении плейбука с --limit, то тебе нужно эти параметры(факты) собрать с этих хостов.

А по esxi-хостам кстати сказать есть готовый плагин https://docs.ansible.com/ansible/latest/scenario_guides/vmware_scenarios/vmware_inventory.html

alpha ★★★★★
()
Ответ на: комментарий от alpha

Не путаю. Мне нужно выполнить плейбук только для выбранного хоста, а не для всего перечня из inventory. Ограничение задаю через –limit.

dmvhomemail
() автор топика
Ответ на: комментарий от dmvhomemail

inventory файл не подходит из-за ключа ansible-playbook –limit <имя сервера>. Становятся недоступны параметры других серверов.

УМВР. Пример инвенторки и плейбука в студию.

MadMax
()
Ответ на: комментарий от MadMax

Примеры:

invetory

[cloudesxi]
server1
server2
server2
...

playbook

---
- hosts: all
  gather_facts: no
  serial: 1

    - name: Display all local servers      
      debug:
        msg: "Name server {{ item.name }} ip server {{ item.ipv4 }}" 
      # тут пытался написать условие получения параметров сервера из group_vars, и где-то допустил ошибку
      with_items: "{{ cloud_servers }}" 
      when: "{{ item.name }}"=="{{ inventory_hostname }}"
      # 
dmvhomemail
() автор топика
Ответ на: комментарий от dmvhomemail

Это не пример - это Г****. Хочешь чтобы тебе помогли - примени советы из первых двух ответов - сделай нормальную инверторку с параметрами. И тестовый плейбук, который можно позапускать и увидеть сообщения об ошибках из ансибла.

MadMax
()
Ответ на: комментарий от MadMax

Такой подход уже реализован и не работает если мне необходимо выполнить плейбук для определенного сервера. Фильтр я задаю с помощью параметра –limit при этом становятся не доступны для выполнения конструкции в плейбуки с обращением к определенному серверу например: –limit server1, а в playbook прописано {{ hostvars[‘server2’]['ipv4'] }}

dmvhomemail
() автор топика
Ответ на: комментарий от MadMax

Или вот такая конструкция не будет работать, если написать –limit server1:

    - name: Register snapshot repository
      uri:
        method: PUT
        url: "http://{{ hostvars['server2']['ipv4'] }}:9200/_snapshot/repository"
        body: "{{ body_title | to_json }}"
      register: _register_repository_status
      changed_when:
        - _register_repository_status.status == 200
        - _register_repository_status.json.acknowledged

ansible-playbook не увидит server2.

dmvhomemail
() автор топика
Ответ на: комментарий от alpha

Т.е. я должен добавить к коду:

delegate_facts : True

Я прав?

dmvhomemail
() автор топика
Ответ на: комментарий от dmvhomemail
[all]
aaa     ansible_connection=local param=aaa_value
bbb     ansible_connection=local param=bbb_value
---
- name: test
  hosts: all
  gather_facts: no
  tasks:
    - name: debug
      debug:
        msg: "{{hostvars['aaa']['param']}}"
ansible-playbook 1.yml --inventory 1.ini  --limit bbb

PLAY [test] ******************************************************************************************************************************************************************************************

TASK [debug] *****************************************************************************************************************************************************************************************
ok: [bbb] => {
    "msg": "aaa_value"
}

PLAY RECAP *******************************************************************************************************************************************************************************************
bbb                        : ok=1    changed=0    unreachable=0    failed=0
MadMax
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.