The DISINCT keyword applies to all the columns in your SELECT statement, not just the first column. The parentheses that you have added around e.equipmentid do not change this. Using DISTINCT when you are already using a GROUP BY clause does not work the way you seem to be expecting.
You are using the GROUP BY clause with e.equipmentid and ex.contract_id. This tells the query to return one row for each unique pair of e.equipmentid and ex.contract_id values.
If you want a single row result for each e.equipmentid, but the same equipmentid may be associated with multiple ex.contract_id values, then you need to specify which ex.contract_id to display, such as the MIN or MAX value for ex.contract_id.
For example, you could do something like this with your query, though you would lose the information about multiple ex.contract_id values:
SELECT e.equipmentid, e.dcid, e.type, e.capacity, e.manufacturer,
e.model, e.sysid, e.location, e.serial_no, e.contracted,
am.project_manager, am.contract_sales, am.scheduler,
MAX(ex.contract_id) AS contract_id, MAX(ex.billable) AS billable
FROM equipment_ext AS e
INNER JOIN datacenters AS d ON d.dcid = e.dcid
INNER JOIN account_managers AS am ON am.companyid = d.companyid
INNER JOIN equipment_extra AS ex ON ex.equipmentid = e.equipmentid
WHERE companyid = $companyid AND ex.contract_status='1'
GROUP BY e.equipmentid, e.dcid, e.type, e.capacity, e.manufacturer,
e.model, e.sysid, e.location, e.serial_no, e.contracted,
am.project_manager, am.contract_sales, am.scheduler
ORDER BY e.equipmentid
Edited to add more information. If you want to SELECT the row with the maximum value for ex.contract_id for each e.equipmentid, that requires a more complicated WHERE clause. An example:
SELECT e.equipmentid, e.dcid, e.type, e.capacity, e.manufacturer,
e.model, e.sysid, e.location, e.serial_no, e.contracted,
am.project_manager, am.contract_sales, am.scheduler,
ex.contract_id, ex.billable
FROM equipment_ext AS e
INNER JOIN datacenters AS d ON d.dcid = e.dcid
INNER JOIN account_managers AS am ON am.companyid = d.companyid
INNER JOIN equipment_extra AS ex ON ex.equipmentid = e.equipmentid
WHERE companyid = $companyid AND ex.contract_status='1'
AND ex.contract_id =
(SELECT MAX(ex2.contract_id) FROM equipment_extra AS ex2
WHERE e.equipmentid = ex2.equipmentid)
ORDER BY e.equipmentid
Note that this second query eliminates the need for using either DISTINCT or GROUP BY.