I was setting up the Microsoft ODBC driver for SQL Server 18 packages to be installed via Puppet, but I ran into an error using Puppet’s standard package
library:
/var/tmp/rpm-tmp.AWH34t: line 17: /dev/tty: No such device or address
A quick peek at the rpm scripts showed me the problem - the rpm install script was trying to output the EULA to the terminal, but the Puppet agent doesn’t have one:
rpm -qlp --scripts msodbcsql18-18.3.2.1-1.x86_64.rpm
check_eula_acceptance()
{
if [ "$ACCEPT_EULA" != "y" ] && [ "$ACCEPT_EULA" != "Y" ]; then
exec 2&>/dev/tty 1>&2 </dev/tty
echo "The license terms for this product can be downloaded from"
You can automatically accept the EULA by setting the environment variable export ACCEPT_EULA=y
, but Puppet’s package
module doesn’t have a way to pass in environment variables.
Instead, I can install the rpms manually, using rpm
and the exec
module. The specific version is needed to prevent Puppet from running the install on each Puppet agent run - I use unless
to grep the output of rpm -qa
, and if it’s present, the exec
command doesn’t run. If it’s not, rpm -U [the_package.rpm]
is run, installing the rpm manually. The require
commands ensure the commands are run in the correct order.
# Definding the rpm versions and names
msodbc_ver: 'msodbcsql18-18.3.2.1-1.x86_64'
mssql_ver: 'mssql-tools18-18.2.1.1-1.x86_64'
# unixODBC is a dependency for msodbcsql18
package { 'unixODBC':
ensure => 'present',
name => 'unixODBC',
provider => 'dnf',
}
# Manually install the rpms
# The rpms require acceptance of an EULA, and there doesn't appear to be a way to pass
# an environment variable into the package module. Instead, we manually run the rpm
# command. The "unless" option is run prior to executing anything, and nothing will be
# executed if the unless returns successful (0). Unless is set to query rpm , and then
# we grep for package we're installing. Grep will return 1 if the package isn't installed.
exec { 'install msodbcsql18':
environment => ['ACCEPT_EULA=Y'],
unless => "/usr/bin/rpm -qa | /usr/bin/grep -q ${msodbc_ver}",
command => "/usr/bin/rpm -U http://myserver/${msodbc_ver}.rpm",
require => Package['unixODBC'],
}
exec { 'install mssql-tools':
environment => ['ACCEPT_EULA=Y'],
unless => "/usr/bin/rpm -qa | /usr/bin/grep -q ${mssql_ver}",
command => "/usr/bin/rpm -U http://myserver/${mssql_ver}.rpm",
require => Exec['install msodbcsql18'],
}