inventivo dinamico e ricaricabile di AWS

Vedere anche: https://stackoverflow.com/questions/29003420/reload-ansibles-dynamic-inventory .

La mia domanda: c'è un modo migliore di fare ciò che è sotto?

  • Copia di una chiave pubblica di keypair idonea alle istanze AWS esistenti
  • L'EC2 eventuale ospita l'istanza mancante dello script
  • Ho un ruolo significativo che prevede le macchine AWS e funziona correttamente (nota la tag di provision ):

     - name: AWS provision hosts: localhost gather_facts: no vars_files: - vars/dev.yml user: ec2-user roles: - provision tags: - provision 

    Ho quindi un ruolo base , che voglio essere in grado di eseguire in modo indipendente (ad esempio durante lo sviluppo, quindi non devo aspettare la ritriggerszione (nota il tag di base ). e memorizza gli host nel gruppo started :

     - name: find running instances hosts: localhost vars_files: - vars/dev.yml gather_facts: no tags: - base tasks: - name: gather remote facts ec2_remote_facts: region: "{{ target_aws_region }}" filters: instance-state-name: running "tag:Name": "{{ instance_name }}" register: ec2_facts - debug: var=ec2_facts - name: add hosts to groups add_host: name: "{{ item.id }}" ansible_ssh_host: "{{ item.public_dns_name }}" groups: started changed_when: false with_items: ec2_facts.instances - name: base setup hosts: started gather_facts: no vars_files: - vars/dev.yml user: ec2-user roles: - base tags: - base 

    La mia domanda: i giochi stanno lavorando, ma c'è un modo migliore per farlo? Per esempio ho fatti gather_facts: no seguiti da ec2_remote_facts e dai filters – sembra tutto piuttosto complicato.

    Un chiarimento: grazie per il commento su ec2.py – lo sto usando già nel mio primo gioco (quando chiamo il ruolo di provision ).

    Ma per scopi di prova voglio saltare in giochi successivi senza ripetere il provisioning (lento). Quindi, come faccio a ritriggersre i dati dei miei host? ec2_remote_facts è seguito da add_host nel modo giusto? Oppure posso usare in qualche modo gather_facts: yes ?

  • Copia di una chiave pubblica di keypair idonea alle istanze AWS esistenti
  • L'EC2 eventuale ospita l'istanza mancante dello script
  • 3 Solutions collect form web for “inventivo dinamico e ricaricabile di AWS”

    Probabilmente avrei usato lo script di inventario dynamic EC2, che puoi utilizzare configurando ec2.ini e passando -i ec2.py a ansible-playbook .

    Vedi http://docs.ansible.com/ansible/intro_dynamic_inventory.html#example-aws-ec2-external-inventory-script per ulteriori informazioni.

    Si noti che ci sono molte opzioni in ec2.ini . Assicuratevi di dare un'occhiata a quelli, ad es. cache_max_age . È inoltre ansible rendere più veloce la generazione dell'inventario filtrando risorse inutili (ad esempio, impostare rds = False se si è interessati solo alle istanze EC2).

    AGGIORNAMENTO: Con il formato 2.x + potete anche usare - meta: refresh_inventory mid-play.

    Mentre meta: refresh_inventory è il "metodo preferito", mi piace la proposta di OP di utilizzare ec2_remote_facts in combinazione con add_host . Ho installato un tale playbook e ha la forza di essere dynamic al 100% senza la memorizzazione di errori.

    Assumendo che il tuo ASG abbia lanciato istanze con il tag env: cool_asg_instance , basta aggiungere quanto segue sotto la chiamata ec2_asg playbook:

     - ec2_remote_facts:
         filtri:
           "tag: env": "cool_asg_instance"
       registrare: instance_facts
    

    Successivamente raccogliere un set di dati completo JSON contenente tutte le informazioni necessarie, da qui è ansible utilizzare le funzionalità Jinja2 all'interno della playbook per estrarre gli indirizzi IP appena creati, vale a dire:

     - nome: host di gruppo
       add_host: hostname = {{item}} gruppi = lanciato
       with_items: "{{instance_facts.instances | selectattr ('state', 'equalto', 'esecuzione') | map (attribute = 'private_ip_address') | list}}"
    

    Il filter è a favore di questo post di blog non valido: https://bonovoxly.github.io/2016-02-11-ansible-stuffs-ec2_remote_facts_instead_of_ec2_py

    Da ora in poi è ansible utilizzare il gruppo launched sul tuo file di distribuzione YAML di genitore come questo:

     - host: lanciato
       collezionisti: no
    
       compiti: 
         - nome: attendere per SSH
           wait_for: port = 22 host = "{{inventory_hostname}}" ricerca_regex = OpenSSH ritardo = 5
    

    Alcuni potrebbero chiedere perché la cefalea, ben immaginate che invece di avere una userdata orribile che sia git clone sia di Ansible che di un playbook da Internet, è ansible triggersre l'installazione di istanza dal proprio centro di distribuzione creando un semplice argomento SNS che pubblicherà a una coda SQS , visualizzata da un codice a forfait a 10 righe ( https://github.com/alexandregama/python-sqs-consumer/blob/master/sqs-message-consumer-polling.py ) che innescherà il messaggio quando un nuovo l'istanza esce.

    Ho scoperto che era più facile di quanto mi aspettassi. Il seguente codice consente di eseguire playbook nei confronti dell'inventario AWS esistente, che è quello che in origine desidero fare. Basato su [1] e [2].

    (la mia soluzione è un po 'più flessibile, ad esempio custom ansible.cfg & ssh_config )

    Impostare il file configurabile e utilizzarlo:

     % cat ./ansible.cfg.foo [defaults] hostfile = inventory host_key_checking = false private_key_file = bar.pem remote_user = ec2-user ssh_args = -F ./ssh_config export ANSIBLE_CONFIG=ansible.cfg.foo 

    Facoltativamente configurare la configuration personalizzata ssh, in modo che le impostazioni del tuo computer porttile non interferiscano. La configuration di ssh potrebbe anche essere fatta in ansible.cfg.foo , ma mi piace essere separata in modo che un ~/.ssh/config esistente possa essere utilizzato da terzi.

     % cat ./ssh_config StrictHostKeyChecking no ... 

    Esegui la tua playbook:

     ansible-playbook config.yml --tags base 

    Dove il playbook potrebbe sembrare il seguente. i tag aws (es. tag_env_test ) vengono utilizzati per select gli host.

     % cat config.yml - name: base setup hosts: - tag_env_test become: true vars_files: - vars/qux.yml roles: - base tags: - base - name: java setup hosts: ... 

    Utilizzo ./ec2.py --list > ../ec2_output.txt per indagare gli host che mi interessa di select.

    Ho scritto la risposta di Jukka come soluzione, per ringraziarlo per aiutare 🙂

    [1] http://www.slideshare.net/bfschott/using-ansible-dynamic-inventory-with-amazon-ec2

    [2] https://aws.amazon.com/blogs/apn/getting-started-with-ansible-and-dynamic-amazon-ec2-inventory-management/

    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.