@cxres You can use tags within the .gitlab-ci.yml pipeline definition to match jobs to a runner with that particular tag. So you can create a runner with a windows tag and target that runner by specifying the windows tag in your Windows related GitLab CI jobs.
ansible as such is free, but requires some setup - you could write a playbook, that runs your whole job and run it from your runner, but the target machines need to be pre-prepared. say - necessary libraries and so on. i think though that gitlab ci has a built in cmd and powershell executor. I think you should mess around with this: https://docs.gitlab.com/runner/configuration/advanced-configuration.html