Born in Long Beach, California, Ashby attended San Pedro High School in Los Angeles where he was selected by the Cleveland Indians in the third round of the 1969 Major League Baseball Draft. After spending four seasons in the minor leagues, he made his major league debut with the Indians on July 3, 1973. In his first game, Ashby was a defensive replacement in the ninth inning, as he caught Jerry Johnson for a scoreless inning as the Indians lost 5-4 against the Detroit Tigers. The next day, on July 4, Ashby was in the starting lineup, going 1 for 4 with an RBI in Cleveland's 5-2 win over the Tigers. Ashby collected his first career hit off of Tigers pitcher Mike Strahler in his first career at-bat. On September 29, Ashby hit his first career home run, hitting a two-run home run off of Baltimore Orioles pitcher Mike Cuellar. Ashby finished the 1973 season appearing in 11 games with Cleveland, batting .172 with 1 HR and 2 RBI.
Ashby would play in only 10 games with the Indians in 1974, hitting .143 with no home runs or RBI, however, in 1975, Ashby would share the Indians catching duties with John Ellis, appearing in 90 games, hitting .224 with 5 HR and 32 RBI. In 1976, Ashby shared playing time with Ray Fosse, and in 89 games, improved his batting average to .239 with 4 HR and 32 RBI. On November 5, 1976, the Indians traded Ashby and Doug Howard to the Toronto Blue Jays in exchange for Al Fitzmorris.
Ashby saw the majority of time catching the Toronto Blue Jays during the 1977 season, as he appeared in 124 games, batting .210 with 2 HR and 29 RBI. Ashby was second in the American League catching 59 base stealers, and his caught stealing percentage of 48% ranked fourth in the league.
Despite seeing his playing time dip to 81 games in 1978, Ashby improved his offensive numbers, hitting .261 with 9 HR and 29 RBI, as Ashby shared the Blue Jays catching duties with Rick Cerone. On November 27, the Blue Jays traded Ashby to the Houston Astros for J.J. Cannon, Pedro Hernandez, and Mark Lemongello. In 2007, sports columnist Bob Elliott referred to it as the worst trade in Toronto Blue Jays history.
Ashby joined the Houston Astros for the 1979 season, and in his second game with the team on April 7, he caught his first career no-hitter, as Astros pitcher Ken Forsch held the Atlanta Braves to no hits in a 6-0 Astros victory. In his first season with the team, Ashby appeared in 108 games, hitting .202 with 2 home runs and 35 RBI.
In 1980, Ashby saw his offensive numbers improve, as he batted .256 with 3 HR and 48 RBI in 116 games. He appeared in his first playoff series, as Ashby played in two games in the 1980 National League Championship Series, hitting .125 with 0 home runs and 1 RBI, as Houston lost to the Philadelphia Phillies.
During the 1981 season, Ashby caught his second career no-hitter, as Nolan Ryan kept the Los Angeles Dodgers hitless on September 26, pitching the fifth no-hitter of his career. Ashby continued to see his offensive numbers improve: in 83 games he hit .271 with 4 HR and 33 RBI. In the postseason, Ashby appeared in three games, hitting .111 with 1 HR and 2 RBI as the Astros lost to the Los Angeles Dodgers in the 1981 National League Division Series.
In 1982, Ashby became the first Astros player to hit two home runs in a game from both sides of the plate in the same game on September 27, hitting the home runs against John Montefusco and Chris Welsh in a 7-3 victory over the San Diego Padres. Ashby played in 100 games during the season, hitting .257 with 12 home runs and 49 RBI. His 12 home runs were the second highest total on the team, one fewer than Phil Garner.
During the 1983 season, Ashby saw his batting average dip to .229, while hitting 8 HR and 34 RBI in 87 games. In 1984, Ashby became the Astros backup catcher, as Mark Bailey played the majority of games. In 66 games, Ashby hit .262 with 4 HR and 27 RBI. In 1985, Ashby played in only 65 games, his lowest total since 1974, however, he played well in his limited playing time, batting .280 with 8 home runs and 25 RBI.
Ashby recaptured the Astros starting catching job in 1986, and helped guide the team's pitching staff to lead the National League in strikeouts and finish the season with the league's second best team earned run average. On September 25, he tied a National League record when he caught his third career no-hitter, as Mike Scott pitched a no-hitter against the San Francisco Giants to clinch the National League West division title for Houston. In the 1986 National League Championship Series, Ashby hit .130 with 1 HR and 2 RBI as the Astros lost to the New York Mets in six games.
Ashby had the best season of his career in 1987, as he appeared in a career high 125 games, batting .288 with 14 HR and 63 RBI, all the best totals of his career in a season when he turned 36 years old. He also led the league's catchers with a .993 fielding percentage.
Ashby saw his production, and playing time, decrease in 1988, as in 73 games, he hit .238 with 7 HR and 33 RBI. The trend continued into the 1989 season, as Ashby appeared in 22 games, hitting .164 with 0 HR and 3 RBI. He played in his final major league game on May 9, 1989 at the age of 37. On May 11, 1989, the Astros released Ashby.
In a seventeen-year major league career, Ashby played in 1,370 games, accumulating 1,010 hits in 4,123 at bats for a .245 career batting average along with 90 home runs, 513 runs batted in and a .320 on-base percentage. He ended his career with a .986 fielding percentage. Ashby led National League catchers three times in range factor, and once in fielding percentage. He caught 107 shutouts during his career, ranking him 23rd all-time among major league catchers.
Following his playing career, he moved into broadcasting as he telecast HSE Southwestern Conference Baseball in 1990 and served as Sports Director and Anchor for KHTV Channel 39 Houston from 1990 to 1992. He was the host of the Houston Rockets Show and the Houston Cougars Football's John Jenkins Show. He then served as the co-host of Inside Houston, a televised business magazine in 1994 & 1995.
Along with his broadcasting career, he returned to baseball as a minor league manager for the Rio Grande Valley WhiteWings in the Texas-Louisiana League in 1994 and 1995. He served as manager of the Houston Astros' Florida State League (A) affiliate, the Kissimmee Cobras in 1996. He went on to join the Major League coaching staff for the Astros in 1997 as bullpen coach. In 1998 began working as the color commentator for Astros' radio broadcasts. He served in that capacity until the 2006 season when the Astros let him go. He was inducted into the Texas Sports Hall of Fame in 2000.
In 2007, Ashby signed a three-year contract to become the color commentator and secondary play-by-play man on the Toronto Blue Jays radio broadcasts, and subsequently signed for another five-year term. He was teamed up with incumbent play-by-play man Jerry Howarth. From 2011, Ashby also served on occasion as the Blue Jays' play-by-play and color commentator on their Sportsnet telecasts.
During the Astros 50th anniversary season in 2012, Ashby was selected as the starting catcher on the team's All-Time 25-Man Roster. In the same year, Ashby was voted through to Round 2 of the 2013 Ford C. Frick Award ballot, becoming one of the top 41 candidates for the Baseball Hall of Fame baseball broadcaster award.
On January 4, 2013, Ashby resigned from his position at Sportsnet The Fan-590 to join Houston's television broadcast team alongside Bill Brown in the Houston Astros' TV broadcasting department, replacing Jim Deshaies. Astros games began to be televised this same year on CSN Houston, the team's new regional sports network partnership with the NBA's Houston Rockets. After CSN Houston filed for bankruptcy in 2014, Ashby, along with other prominent CSN Houston on-air staff, moved to the newly formed regional sports network Root Sports Southwest, where he served as the color commentator and occasionally play-by-play announcer for the Houston Astros, working alongside Bill Brown and Geoff Blum. Following the news of Bill Brown's decision to retire after the 2016 season, the Astros decided to part ways with Ashby. Todd Kalas from the Tampa Bay Rays was hired to join Geoff Blum for Astros television broadcasts doing play by play in 2017.