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?)

  • @[email protected]
    link
    fedilink
    English
    26 months ago

    Not sure if i really get what you are trying to do but you can check for the pre_task keyword. It’s seems you are overengineering something. Try to think about idempotency

    • jaxxedOP
      link
      English
      26 months ago

      Let me try to reword it to make it clear.

      I have 3 machines in my group. 1 of those will be the “leader”. The others will be “joiners”. The leader could already be initialized, so I need to check all machines to see if there is a leader already. If no Leader exists then any of the machines will do (the first) All of the machines that will join will need some data from the leader, so there will be a role task that will be delegated to the leader (ansible needs to know which host is the leader so as to be able to delegate to it)

      This may sound complex but it is a very common pattern for distributed application setup.

      idempotency doesn’t play a role in this behaviour - the machines are all unique, but who knows what may have changed between ansible runs.

      • Matt The Horwood
        link
        fedilink
        English
        26 months 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?

    • Matt The Horwood
      link
      fedilink
      English
      16 months ago

      Me either, but we have a role to bootstrap galara mysql and we just use the first host in a group