Icinga2ノードをセットアップするためにAnsibleプレイブックを作成しようとしていますが、各ホストは認証のためにIcinga2マスターからの一意のチケットを必要とします。今、私はチケットを取得するためにノードからマスターにSSH接続することを考えていますが、それは良い考えではないようです。また、Ansibleのプロンプトを使用してみましたが、Ansible Towerからプレイブックを実行しています。これは、明らかにそれをサポートしていません(stdinを待っているだけです)。
Ansibleでは、delegate_to
パラメーターを使用して他のホストからファクトを取得できます。
Icinga2サーバーからチケットを取得するには、次のようなものが必要になります。
- name: Get ticket.
command: icinga2 pki ticket --cn 'your cn'
register: ticket
delegate_to: icinga2_server
このタスクは、icinga2 pki ticket
コマンドの出力をticket
変数に格納します。チケットIDのみを取得するには、少しフィルタリングする必要がある場合があります。詳細については、 Ansibleの例のリポジトリ を参照してください。また、委任のためにinventory
にicinga2_serverが必要です。
Knowhyの回答に加えて、PKDF2と呼ばれる暗号化/ハッシュアルゴリズムを使用して、Ansibleシステムでチケットを生成することもできます。
Puppetモジュールで同様のことを行いました。FQDNのチケットを計算するには、「TicketSalt」値を知っているだけで済みます。 (その場合、パスワードはFQDNです)
https://github.com/Icinga/puppet-icinga2/blob/master/lib/puppet/parser/functions/icinga2_ticket_id.rbhttps://github.com/Icinga/ puppet-icinga2/blob/development/lib/puppet/icinga2/pbkdf2.rb
Pythonも同様に: https://pypi.python.org/pypi/pbkdf2 のモジュールがあるようです
このフィルターを作成することになったので、共有する必要があります。 https://Gist.github.com/byoungb/35c8bbed924bb34f557023992b9b67d
from ansible.errors import AnsibleError
def icinga_ticket(value, salt):
try:
from pbkdf2 import PBKDF2
except ImportError:
raise AnsibleError('pbkdf2 library is required for `icinga_ticket` filter "pip install pbkdf2"')
return PBKDF2(str(value), str(salt), iterations=50000).hexread(20)
class FilterModule(object):
def filters(self):
return dict(
icinga_ticket=icinga_ticket,
)
これをansibleのプラグインフィルターの場所plugins/filter /icinga.pyに保存します
このように使用します
- name: setup icinga node
command: icinga2 node setup --ticket {{ 'web1.domain'|icinga_ticket('salt') }} --cn web1.domain --endpoint master.domain --zone web1.domain --master_Host master.domain --trustedcert /var/lib/icinga2/certs/master.domain.crt --accept-commands --accept-config
notify: restart icinga