The agreement came Monday at the winter meetings.
Ross went a combined 8-9 with a 4.15 ERA for San Diego and St. Louis last season. He made 22 starts for the Padres, was claimed off waivers by the Cardinals in early August and pitched nine times for St. Louis, eight of them in relief.
The 31-year-old Ross held righty hitters to a .176 batting average.
Ross is 43-65 with a 3.95 ERA in nine seasons. He made his debut with Oakland in 2010 and was an All-Star with San Diego in 2014.
Ross' contract includes $250,000 in roster bonuses for being with the major league team on opening day ($50,000), May 1 ($100,000) and June 1 ($100,000).