Я пытаюсь найти простой и элегантный способ указать марионетке, с каким узлом она работает в 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