We have a few machines sitting around, some are cpu only machines, while other have nvidia or AMD gpus. Can I get all these machines hooked up and use the fastest rendering method on each machine for Cycles? Basically, it will use gpus (either Cuda or OpenCL) and if there isn't a gpu, it will default to cpu? Thanks.
You should be able to configure the compute device on each machine, submit the render job, and have it "just work". In fact, this is the main reason why the compute device settings are in user preferences instead of scene settings: to allow them to be set per-machine, rather than per-scene. Two things to be mindful of:
The scene needs to be saved with "GPU compute" selected under render settings. This will set GPU-capable machines to use CUDA or OpenCL as set in user preferences, while CPU-only machines will fallback to CPU mode. However, if your workstation is a CPU-only machine, you will not be able to simply select this option. I could've sworn there was a question on Blender StackExchange somewhere about how to work around this particular issue, but I can't for the life of me find it, apologies.
Not all features/shaders are supported in OpenCL mode. There is no easy or automatic way to prevent your OpenCL-GPU machines from running a scene that needs these features. You will have to do it by hand. See this table for the current feature status: https://docs.blender.org/manual/en/dev/render/cycles/features.html
One way to handle this: if your render farm software supports machine groups, you may want to consider creating a "cycles safe features" group that contains all machines, then a second "cycles all features" group that only contains CPU/CUDA machines, and use the "all features" group for a job that needs features that aren't supported in OpenCL.