Looks like you need to target your linux hosts and your windows ca machine like this:
hosts: linux:windows-ca
Then either delegate_to: linux or delegate_to: windows-ca
From the above you might also need to set
become: false
on the tasks you are delegating to windows
It might make sense to break stuff up in to separate plays (within a single playbook) targeting the windows and linux hosts.
Also you can use pre_tasks and post_tasks in your playbooks which might make sense for you, although I prefer to have playbooks only consist of lists of roles where possible.
Hope this helps,
Jon