Назад | Перейти на главную страницу

Элегантный способ категоризации марионеточных узлов в EC2 в Ubuntu Precise?

Я пытаюсь найти простой и элегантный способ указать марионетке, с каким узлом она работает в EC2. Для простоты предположим, что у меня есть 3 типа узлов: web, api и db.

Теперь самый простой способ - сделать так, чтобы имена узлов в манифесте марионетки были равны случайному имени хоста, которое им дает Amazon, например:

node 'domU-12-12-12-12-12-AB' inherits 'common' {
  #you're a web instance
}
node 'domU-13-13-13-13-13-AC' inherits 'common' {
  #you're an api instance
}
node 'domU-14-14-14-14-14-AD' inherits 'common' {
  #you're a db instance
}

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

Один из предлагаемых способов - это отредактировать / etc / hosts и / etc / hostname на что-то вроде «web1», а затем использовать регулярное выражение в операторе узла марионетки. Проблема в том, что частный IP-адрес снова меняется, и поэтому вам нужно обновить / etc / hosts, так что это большая головная боль. Теперь вам также нужно сопоставить реальное имя хоста, данное Amazon, с тем, которое вы только что дали экземпляру, что является дополнительной головной болью. Я читал, что cloud-init - решение этой проблемы, но я мало с ним играл.

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

Что бы вы порекомендовали?

Рекомендуемый способ сделать это - классифицировать ваши узлы с использованием настраиваемого факта.

Вы можете использовать nodes.pp как это:

node default {
  hiera_include('classes')
}

node /.*some.domain.com$/ inherits default {
}

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

---
:backends:
  - yaml
:hierarchy:
  - "%{::hostname}"
  - common
:yaml:
  :datadir: "/etc/puppet/hieradata/%{::domain}/%{::location}"

Где location факт определяется в /etc/facter/facts.d/datacenter.yaml файл, который также может содержать больше фактов, если необходимо:

---
location: rohan

Результирующая структура каталогов для ваших hieradata может выглядеть так:


$ tree
.
├── hiera.yaml
└── some.domain.com
    ├── rohan
    │   ├── common.yaml
    │   ├── host.specific.yaml
    │   └── other.host.yaml
    └── mordor
        ├── common.yaml
        ├── some.host.yaml
        └── other.host.yaml

Еще несколько идей относительно использования hiera для классификации узлов можно найти Вот.

Не использовать node классифицировать машины. Напишите "ролевой" факт в /etc/facter/facts.d/role.txt. Используйте идентификатор экземпляра ec2 в качестве имени сертификата марионетки. Используйте hiera's hiera_include назначать модули на основе role факт ваших узлов.

Вот слайд-колода презентации, которую я сделал в прошлом году по этой теме. https://speakerdeck.com/robbyt/puppetcamp-nyc-2012-puppet-in-the-cloud