2017-10-25 1 views
-2

Ich habe eine einfache Mariadb-Rolle, die Master/Slave-Replikation auf zwei Servern einrichten kann. Um dies zu tun, habe ich in meinem Inventar meine 2 Knoten wie folgt zu definieren:Dynamisch Master/Slave-Variablen in Ansible-Rolle zuweisen

node1 master=true 
node2 slave=true 

Auf diese Weise kann ich Setup eine Rolle Setup Master/Slave-Replikation mit ansible wenn Anweisung mit dem Spielen dieser Vars.

- name: Setup master conf 
    template: >- 
    src="templates/master.conf.j2" 
    dest="{{ master_config_file }}" 
    when: 
    - master is defined 

Nun würde Ich mag etwas mehr automatische bekommen, die dynamisch und zufällig ein Master-Variable zu einem Knoten, und Slave-Variable an alle anderen Knoten zuweisen könnten.

Ich habe einige Ansible Doc über Variablen und Filter gesehen, aber keiner von ihnen scheint daran angepasst zu sein. Ich denke, dass ich mein eigenes Ansible-Variablen-Plugin entwickeln muss, um das zu tun.

+1

"Random" ist ein Feind der Automatisierung. Definieren Sie eine vorhersagbare idempotente Regel und folgen Sie ihr (ich bin mir fast sicher, dass dies mit Standardfiltern/Operatoren möglich ist und keine Entwicklung erforderlich ist). –

+0

Nach dem Zufallsprinzip, ich meine zufällig einen Master-Server in der Liste der Knoten auswählen. Auf diese Weise, wenn ich meine VMs spawne, ist keiner von ihnen spezialisiert. Ich möchte, dass sie sich automatisch mit meinem ersten Ansible-Lauf spezialisieren. Danke für die Antwort, ich werde noch einmal auf vorhandene Ansible-Filter schauen und eine implementieren, wenn ich nicht finden kann, was ich will. – Quentin91360

+0

Und was ist auf playbook re-run? –

Antwort

0

Sie können facts.d verwenden. Etwas wie folgt aus:

- hosts: all 
    become: yes 
    tasks: 
    - file: 
     path: /etc/ansible/facts.d 
     state: directory 
    - shell: echo '{{ my_facts | to_json }}' > /etc/ansible/facts.d/role.fact 
     args: 
     creates: /etc/ansible/facts.d/role.fact 
     vars: 
     my_facts: 
      is_master: "{{ true if play_hosts.index(inventory_hostname) == 0 else false }}" 
     register: role_fact 
    # refresh facts if fact has been just added 
    - setup: 
     when: role_fact | changed 
    - set_fact: 
     is_master: "{{ ansible_local.role.is_master }}" 
    - debug: 
     var: is_master 

Dies wird role.fact auf Remote-Knoten erstellen, wenn sie nicht da ist und is_master Tatsache daraus verwenden. Während nachfolgender Läufe wird ansible_local.role.is_master automatisch abgerufen.

Verwandte Themen