From my experience, Ansible is a lot easier to use. There is not much complexity in it, which makes it really pleasant (e.g. compared to Puppet or Saltstack).
However, playbook execution is really slow, even if no state needs to change, it easily gets into minutes with just a few services configured through Ansible. Due to that, people start to tag steps and only run specific tags. In the end, that leads to the system state and the Ansible configuration to diverge.
NixOS on the other hand is really complex at first (I needed a few weeks to get my basic system running) and painful at times if you try to run software that is not yet packaged. But, with determination to live with the constant effort when getting new things to run, it ends up with a much more enjoyable system than Ansible, Salt or Puppet could ever achieve.
I agree to @jonringer that a strong point of nix is that it forces you to do things declaratively from the start.