すべてのAnsibleプレイブック/ロールがgitリポジトリにチェックインされます。
ただし、Ansible Galaxyの役割の場合は、Ansibleを実行するすべてのマシンで常に明示的に1つずつダウンロードする必要があります。
実行時にAnsibleが役割の欠落について不平を言うまで、どのAnsible Galaxyの役割が必要であるかを正確に事前に知ることは困難です。
Ansible Galaxyロールの依存関係をどのように管理するのですか? Ansibleの残りのコードと一緒にgitリポジトリにチェックインするか、Ansibleを新しいマシンで実行するときに自動的に識別されてダウンロードされるようにします。
このユースケースには、requirements.yml
ファイルを使用する必要があります。さまざまなインストール方法のいずれかを使用して、必要な役割を説明します。
# Install a role from the Ansible Galaxy
- src: dfarrell07.opendaylight
# Install a role from GitHub
- name: opendaylight
src: https://github.com/dfarrell07/ansible-opendaylight
# Install a role from a specific git branch
- name: opendaylight
src: https://github.com/dfarrell07/ansible-opendaylight
version: Origin/master
# Install a role at a specific tag from GitHub
- name: opendaylight
src: https://github.com/dfarrell07/ansible-opendaylight
version: 1.0.0
# Install a role at a specific commit from GitHub
- name: opendaylight
src: https://github.com/dfarrell07/ansible-opendaylight
version: <commit hash>
次に、それらをインストールします。
ansible-galaxy install -r requirements.yml
作業例 (VagrantプロビジョニングツールとしてAnsibleを使用してOpenDaylightをインストール)です。詳細については、 関連するAnsibleドキュメント を参照してください。
提案されているように、この必要に応じてansible galaxyを使用できます。
Ansibleには、すべてのロールをリストしたrequirements.yml
ファイルを作成できる機能があります。これについては、こちらで確認できます: http://docs.ansible.com/ansible/latest/galaxy.html#installing-multiple-roles-from-a-file
例(requirements.yml):
- src: yatesr.timezone
次に、このファイルに対してansible-galaxy install -r requirements.yml
を実行して、そこにリストされているすべての役割をダウンロードします。
さらに自動化する場合は、2つのコマンドを実行する単純なシェルスクリプトを作成できます。
例(ansible.sh):
./ansible.sh
ansible-galaxy install -r requirements.yml
ansible-playbook playbook.yml -i inventory
私はJava JDKをインストールしてインストールすることがよくあります。ロールを使用すると、そのタッチが簡単になります。私はいくつかの異なる方法を試しました(多くの.gitmodulesおよびサブモジュールを含む...作業には複数のgitシステムを使用する必要があり、すべてがいです)。私の最大の要件は、プレイブックプロジェクトにロールコードをチェックインしないことです。ほとんどの場合、すべてを1か所に保持できます。
私の 'requirements.yml'ファイルの内容:
- src: https://github.com/staylorx/ansible-role-wls-prep.git
version: master
name: staylorx.wls-prep
- src: https://my-work-git-extravaganza.com
version: 2.x
name: coolplace.niftyrole
#From Ansible Galaxy
- src: staylorx.Oracle-jdk
別のプレイブックinstall-roles.ymlを実行します。
---
- hosts: localhost
tasks:
- file:
path: roles
state: absent
- local_action:
command ansible-galaxy install -r requirements.yml --roles-path roles
- lineinfile:
dest: .gitignore
regexp: '^\/roles$'
line: '/roles'
state: present
この最初のプレイブックを実行し、その後、通常のプレイブックで役割を実行します。私にとっての秘密は、gitによって無視されることを保証することです。そのため、誤ってロールをチェックインすることはありません。また、毎回フォルダーを消去するため、エラーを強制したり無視したりする必要がないことを確認します。
別の解決策は、gitサブモジュールを使用することです。結局のところ、Ansible Galaxyはgithubリポジトリのディレクトリにすぎません...
このコマンドを使用して、Galaxyロールをサブモジュールとして自動的に追加します。
ansible-galaxy info <package> | grep -A 1 github_repo | tr '\n' ' ' | sed -e "s/.*github_repo: \([^[:space:]]*\)[^\w]*github_user: \([^[:space:]]*\)[[:space:]]*/git submodule add git:\/\/github.com\/\2\/\1.git roles\/\2.\1/g" | sh
変更をgitリポジトリにコミットします。将来リポジトリを複製する場合は、サブモジュールを使用して複製するようにしてください。 git clone ... --recursive
これの利点は、gitサブモジュールが常に特定のバージョンを参照していることです(git commit-hash)。これにより、実稼働環境で未テストの更新を実行できなくなります。 Galaxyロールの新しいバージョンにはバグがあったり、以前とはまったく異なる動作をする可能性があります。 gitサブモジュールを使用して、ロールを新しいバージョンに更新するかどうか、いつ更新するかを決定します。
また、コードをリポジトリにコミットすることを防ぐために、.gitignore
のギャラクシーロールをブラックリストに追加で追加する必要はありません。
この時点では、私が知る限り、実行時にロールを自動的にダウンロードする方法はありません。最善の方法は、それらを自分のリポジトリにコミットするか、すべての要件をリストした適切なドキュメントを用意することです。ロールをインストールするプリフライトプレイブックを作成することもできます。 :)
Ansibleロールを使用して、 command module を使用して他の必要なロールをインストールできます。
ansible-galaxy install
を実行する非常に基本的な例を次に示します。
- name: Install roles from Ansible Galaxy
command: ansible-galaxy install {{ item.item }}
with_items:
- "{{ ansible_roles_list }}"
ansible_roles_list
は、変数またはロールパラメーターとして指定できます。
このロールを実装したため、Ansibleを使用して制御マシン(の一部)をセットアップすることもできます: https://galaxy.ansible.com/ferrarimarco/install-roles/ 。
このロールを適用する必要がありますbefore別のプレイブックで、それを使用してインストールする他のロール。これは、Ansibleが参照するプレイブックを実行する前に、すべてのロールが利用可能かどうかをチェックするためです。