I have an inventory of hosts, and from them, one of the tasks should choose a leader by running a command on each until one of the machines produces an expected output (json value.)

I want some code to run on that leader to initialize it, and then I want some of the other roles to delegate some tasks to that leader.

Not sure how to do this?

Should I use dynamic inventory to analyze a group of hosts, and create a new group (can you run built_in.command in dynamic inventory? Should I write a role task that runs the identifying command on each host, capturing the result globally if it returns what I want (but then running on each host even if I have found my leader?)

  • Matt The Horwood
    link
    fedilink
    English
    arrow-up
    2
    ·
    19 days ago

    what you need is a pre_task to query all nodes and get the leader magic bit in a var using register, like below.

    - name: Is docker manager
      shell: docker info | grep 'Is Manager'
      register: leader
    
    - name: Get join string
      shell: docker swarm join-token worker
      when: "true in leader.stdout"
      register: token
    
    - name: Join a docker swarm as a worker
      shell: "{{ token.stdout }}"
      when: "true not in leader.stdout"
    

    that is how I would go about getting a docker swarm setup, that any help?