web-dev-qa-db-ja.com

コマンドラインからAnsible Playbookのホスト変数をオーバーライドする

これは私が使用しているプレイブックの断片です(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: webserver.ymlをオーバーライドして、[droplets]のこのプレイブックを実行します。

server.ymlを直接編集せずに、一度だけ無効にすることはできますか?

ありがとう。

74
luqo33

Ansibleがこの機能を提供するとは思わないが、そうすべきだ。できることは次のとおりです。

hosts: "{{ variable_Host | default('web') }}"

コマンドラインまたはvarsファイルからvariable_Hostを渡すことができます。例:

ansible-playbook server.yml --extra-vars "variable_Host=newtarget(s)"
91
wallydrag

ソリューションを探しに来るかもしれない人のために。
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でグループ名を指定できます

48
Mrunal Gosar

これは少し遅いですが、パターンをより特定のホストに制限するために--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フラグを使用して、この構成が適用されるホストを確認します。

11
Jonathan Hamel

私はインベントリを必要とせず、この単純なコマンドで動作する別のアプローチを使用しています:

ansible-playbook site.yml -e working_Host=myhost

それを実行するには、2つのプレイを含むプレイブックが必要です。

  • 最初の再生はlocalhostで実行され、インメモリインベントリの既知のグループに(指定された変数から)ホストを追加します
  • セカンドプレイはこの既知のグループで実行されます

動作例(コピーして前のコマンドで実行します):

- 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を使用しています

6
Nelson G.

私はデフォルトをホストなしに変更し、それをキャッチするためのチェックを行いました。そうすれば、ユーザーまたはcronは単一のホストまたはグループなどを提供するように強制されます。@ wallydragからのコメントのロジックが好きです。 empty_groupには、インベントリにホストが含まれていません。

-hosts: "{{variable_Host | default( 'empty_group')}}" 

次に、チェックインタスクを追加します。

タスク:
-名前:必要なvariable_Hostパラメーターが欠落している場合、スクリプトを失敗します
 fail:
 msg: "--extra-vars = 'を追加する必要がありますvariable_Host = '"
 when:(variable_Hostが定義されていない)または(variable_Host ==" ")
5
Tony-Caffe

私は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
2
LightMan

ホストに関連付けられているタスクを別のホストで実行する場合は、 delegate_to を試してください。

あなたの場合、あなたのローカルホスト(可能なマスター)に委任し、ansible-playbookコマンドを呼び出す必要があります

2
nghnam

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
1
TmTron

このグーグルで解決策を見つけました。実際、Ansible 2.5には1つあります。次のように、--inventoryでインベントリファイルを指定できます:ansible --inventory configs/hosts --list-hosts all

1
Bebef

--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}}"
0
sudo soul