There are a myriad of ways to do this, with Chef and USB keys being way down on the list. Chef requires a LOT of work (including the elusive IP you mentioned) before it is usable. The USB route is not feasible (for automating the bring up) because all you can do is load the Junos image from it. Unlike the SRX, which can boot, load config and even run scripts from the USB, you can't do that with the EX.
If you have terminal/console access, you can use PyEZ or Ansible to push a base config to get it up and running on the network and then PyEZ, Ansible, Space, <insert config pusher of choice here> to configure and upgrade the device once it is online.
If you don't have a terminal server, you can always use the ZTP process with DHCP, the appropriate options and scripts to at least get it online and then use Space, JEAP, a PyEZ script or even Ansible to upgrade the OS.
And these are only two suggestions. There are other ways as well. A lot of it depends on the process you have. Do you drop ship to the site, or do you have access to these before they go to site? Do you have control over the DHCP server or have the ability to have someone configure the DHCP server for you? If you could lay out a typical workflow process of how you get the switch, who touches it when, what types of tools do you have to access it (term server, scripting knowledge, etc.) that would help too.