Domanda Sovrascrive la variabile host di Ansible Playbook dalla riga di comando


Questo è un frammento di un playbook che sto usando (server.yml):

- name: Determine Remote User
  hosts: web
  gather_facts: false
  roles:
    - { role: remote-user, tags: [remote-user, always] }

Il mio file hosts ha diversi gruppi di server, ad es.

[web]
x.x.x.x

[droplets]
x.x.x.x

Ora voglio eseguire ansible-playbook -i hosts/<env> server.yml e override hosts: web a partire dal server.yml per eseguire questo libro di gioco per [droplets].

Posso semplicemente eseguire l'override come una cosa singola, senza modifiche server.yml direttamente?

Grazie.


44
2017-10-19 19:45


origine


risposte:


Non credo che Ansible fornisca questa funzione, che dovrebbe. Ecco qualcosa che puoi fare:

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

e tu puoi passare variable_host da una riga di comando o da un file di vars, ad esempio:

ansible-playbook server.yml --extra-vars "variable_host=newtarget(s)"

59
2017-10-20 10:23



Per chiunque possa venire a cercare la soluzione.
Play Book

- hosts: '{{ host }}'
  tasks:
  - debug: msg="Host is {{ ansible_fqdn }}"

Inventario

[web]
x.x.x.x

[droplets]
x.x.x.x

Comando:  ansible-playbook deplyment.yml -i hosts --extra-vars "host=droplets" Quindi puoi specificare il nome del gruppo nelle extra-vars


33
2017-11-29 13:17



Questo è un po 'tardi, ma penso che potresti usare il --limit or -l comando per limitare il pattern a host più specifici. (versione 2.3.2.0)

Potresti avere - hosts: all (or group) tasks: - some_task

e poi ansible-playbook playbook.yml -l some_more_strict_host_or_pattern e usa il --list-hosts flag per vedere su quali host verrà applicata questa configurazione.


5
2017-08-29 14:52



Se vuoi eseguire un'attività associata a un host, ma su un host diverso, dovresti provare delegate_to.

Nel tuo caso, dovresti delegare al tuo localhost (ansible master) e chiamare ansible-playbook comando


2
2017-10-20 08:39



Sto usando un altro approccio che non ha bisogno di inventario e funziona con questo semplice comando:

ansible-playbook site.yml -e working_host=myhost

Per farlo, hai bisogno di un playbook con due giochi:

  • la prima riproduzione viene eseguita su localhost e aggiunge un host (dalla variabile data) in un gruppo noto nell'inventario in memoria
  • il secondo gioco corre su questo gruppo conosciuto

Un esempio funzionante (copialo e lo esegue con il comando precedente):

- 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 }}"

Sto usando ansible 2.4.3 e 2.3.3


2
2018-04-12 07:14



Sto usando ansible 2.5 (2.5.3 esattamente), e sembra che il file vars viene caricato prima dell'esecuzione del parametro hosts. Quindi puoi impostare l'host in a vars.yml file e basta scrivere hosts: {{ host_var }} nel tuo libro di esercizi

Ad esempio, nel mio playbook.yml:

---
- hosts: "{{ host_name }}"
  become: yes
  vars_files:
    - vars/project.yml
  tasks:
    ... 

E all'interno di vars / project.yml:

---

# general
host_name: your-fancy-host-name

0
2018-05-31 09:03



Ho appena trovato questo google per una soluzione. In realtà, ce n'è uno in Ansible 2.5. Puoi specificare il tuo file di inventario con --inventory, come questo: ansible --inventory configs/hosts --list-hosts all


-1
2018-05-09 09:39