The deal is pending a physical, the sources said.
Dyson was with Arizona last season, hitting .230 with seven home runs and 27 RBIs in 130 games. He also stole 30 bases and was caught just four times.
The Pittsburgh Post-Gazette first reported the news of Dyson's agreement.
ESPN's Jeff Passan contributed to this report.