これは私が使用しているプレイブックの断片です(server.yml
):
- name: Determine Remote User
hosts: web
gather_facts: false
roles:
- { role: remote-user, tags: [remote-user, always] }
私のホストファイルには、サーバーのさまざまなグループがあります。
[web]
x.x.x.x
[droplets]
x.x.x.x
ここで、ansible-playbook -i hosts/<env> server.yml
を実行し、hosts: web
のserver.yml
をオーバーライドして、[droplets]
のこのプレイブックを実行します。
server.yml
を直接編集せずに、一度だけ無効にすることはできますか?
ありがとう。
Ansibleがこの機能を提供するとは思わないが、そうすべきだ。できることは次のとおりです。
hosts: "{{ variable_Host | default('web') }}"
コマンドラインまたはvarsファイルからvariable_Host
を渡すことができます。例:
ansible-playbook server.yml --extra-vars "variable_Host=newtarget(s)"
ソリューションを探しに来るかもしれない人のために。
Play Book
- hosts: '{{ Host }}'
tasks:
- debug: msg="Host is {{ ansible_fqdn }}"
在庫
[web]
x.x.x.x
[droplets]
x.x.x.x
コマンド:ansible-playbook deplyment.yml -i hosts --extra-vars "Host=droplets"
したがって、extra-varsでグループ名を指定できます
これは少し遅いですが、パターンをより特定のホストに制限するために--limit or -l
コマンドを使用できると思います。 (バージョン2.3.2.0)
あなたは- hosts: all (or group) tasks: - some_task
を持つことができます
そして、ansible-playbook playbook.yml -l some_more_strict_Host_or_pattern
を使用し、--list-hosts
フラグを使用して、この構成が適用されるホストを確認します。
私はインベントリを必要とせず、この単純なコマンドで動作する別のアプローチを使用しています:
ansible-playbook site.yml -e working_Host=myhost
それを実行するには、2つのプレイを含むプレイブックが必要です。
動作例(コピーして前のコマンドで実行します):
- hosts: localhost
connection: local
tasks:
- add_Host:
name: "{{ working_Host }}"
groups: working_group
changed_when: false
- hosts: working_group
gather_facts: false
tasks:
- debug:
msg: "I'm on {{ ansible_Host }}"
私はansible 2.4.3と2.3.3を使用しています
私はデフォルトをホストなしに変更し、それをキャッチするためのチェックを行いました。そうすれば、ユーザーまたはcronは単一のホストまたはグループなどを提供するように強制されます。@ wallydragからのコメントのロジックが好きです。 empty_group
には、インベントリにホストが含まれていません。
-hosts: "{{variable_Host | default( 'empty_group')}}"
次に、チェックインタスクを追加します。
タスク: -名前:必要なvariable_Hostパラメーターが欠落している場合、スクリプトを失敗します fail: msg: "--extra-vars = 'を追加する必要がありますvariable_Host = '" when:(variable_Hostが定義されていない)または(variable_Host ==" ")
私はansible 2.5(正確には2.5.3)を使用していますが、hosts paramが実行される前にvars fileがロードされているようです。そのため、ホストをvars.ymlファイルに設定し、プレイブックにhosts: {{ Host_var }}
と書くだけです。
たとえば、私のplaybook.ymlで:
---
- hosts: "{{ Host_name }}"
become: yes
vars_files:
- vars/project.yml
tasks:
...
そしてvars/project.yml内:
---
# general
Host_name: your-fancy-Host-name
ホストに関連付けられているタスクを別のホストで実行する場合は、 delegate_to を試してください。
あなたの場合、あなたのローカルホスト(可能なマスター)に委任し、ansible-playbook
コマンドを呼び出す必要があります
Limit argはすでに素晴らしいと思います-誤ってすべてのホストで実行されないように、ユーザーに制限を指定するように強制したいだけです。
私が見つけた最も簡単な方法はこれです:
---
- name: Force limit
# all is okay, because we must anyway specify a limit
hosts: 'all'
tasks:
- name: checking limit arg
fail:
msg: "you must use -l or --limit - when you really want to use all hosts, use -l 'all'"
when: ansible_limit is not defined
run_once: true
このグーグルで解決策を見つけました。実際、Ansible 2.5には1つあります。次のように、--inventory
でインベントリファイルを指定できます:ansible --inventory configs/hosts --list-hosts all
--limit
オプションを使用してホストを安全に指定するために思いついたクールなソリューションを次に示します。この例では、--limit
オプションでホストを指定せずにプレイブックを実行した場合、プレイは終了します。
これは、Ansibleバージョン2.7.10でテストされました
---
- name: Playbook will fail if hosts not specified via --limit option.
# Hosts must be set via limit.
hosts: "{{ play_hosts }}"
connection: local
gather_facts: false
tasks:
- set_fact:
inventory_hosts: []
- set_fact:
inventory_hosts: "{{inventory_hosts + [item]}}"
with_items: "{{hostvars.keys()|list}}"
- meta: end_play
when: "(play_hosts|length) == (inventory_hosts|length)"
- debug:
msg: "About to execute tasks/roles for {{inventory_hostname}}"