Running a script from cron -> nothing; running same script from command line => SUCCESS ???

As the subject line says, I can't get this script to run correctly from cron.

My cron entry (in a file in /etc/cron.d):

This isn’t really an Ansible problem per se unless it’s only ansible in a subshell that doesn’t run from cron? Have you tested basic cron functionality using something simple like this (or something even more basic):

#!/bin/sh
z4=date +%Y%m%d%H%M
touch /tmp/${z4}

And then check to see if that file is created every 30 minutes does work?

First questions that spring to mind are:

  • is there anything in the cron log, syslog or journal for the crond service?

  • is anything else running successfully out of /etc/cron.d / cron.daily etc?

  • is crond enabled in whatever init system you’re using? (You haven’t stated which distro?)

See below.

This isn’t really an Ansible problem per se unless it’s only ansible in a subshell that doesn’t run from cron? Have you tested basic cron functionality using something simple like this (or something even more basic):

#!/bin/sh
z4=date +%Y%m%d%H%M
touch /tmp/${z4}

And then check to see if that file is created every 30 minutes does work?

Yes, it does. I know the script is running, because it is much elaborate than this, creating files, logging, etc.
It’s run is annotated in /var/log/cron. If there was an obvious error, like no execute permission, I’d see something in a CMDOUT () message.

No errors.
I look at the /var/log/ansible.log, and I see the output I’d like to have, in the ansible.log. They are just not being returned
to the script. It’s as if it’s a “term” sort of problem. So, in the ansible.log, I see something like:

2023-08-29 17:38:18,067 p=84629 u=root n=ansible | mainmachine | CHANGED | rc=0 >>
10.10.11.0##255.255.255.0
101.133.145.94##255.255.255.255
.
.
.
and mayhaps a hundred or so more entries.

First questions that spring to mind are:

  • is there anything in the cron log, syslog or journal for the crond service?

yes. /var/log/cron records it run. ansible.log shows that ansible is called and generates the desired data. It’s not being echoed to the stdout of the ansible process, it appears.

  • is anything else running successfully out of /etc/cron.d / cron.daily etc?

Yep. All else seems well with the cron.d stuff.

  • is crond enabled in whatever init system you’re using? (You haven’t stated which distro?)

I’m running this cron on a AlmaLinux release 8.8 (Sapphire Caracal) OS.

OK, that’s some useful extra info. I’ve just had a very quick basic play (I haven’t touched cron in earnest for a long time).

Have you tried echo-ing $z4 and appended to a tmp file to see if there’s anything in it at run time?

I’ve tried a few variations in a standard user’s crontab:

root@DESKTOP-9HGJE25:~# crontab -u wmcdonald -l | grep -v ^#

          • ansible -m setup localhost
          • ~/ansible-test

root@DESKTOP-9HGJE25:~# cat /home/wmcdonald/ansible-test
#!/bin/sh

ansible -m setup localhost

BASIC_VAR=ansible -m setup localhost
echo $BASIC_VAR

VERBOSE_VAR=ansible -vvv -m ping localhost
echo $VERBOSE_VAR

FILE_OUTPUT=ansible -m ping localhost
echo $FILE_OUTPUT >> /tmp/ansible.out

The output from the last set of steps shows:

root@DESKTOP-9HGJE25:~# cat /tmp/ansible.out
localhost | SUCCESS => { “changed”: false, “ping”: “pong” }
localhost | SUCCESS => { “changed”: false, “ping”: “pong” }

I did notice from syslog that without an MTA, cron (on Ubuntu, at least) is throwing away output:

/var/log/syslog:Aug 31 20:09:02 DESKTOP-9HGJE25 CRON[2361]: (CRON) info (No MTA installed, discarding output)

See below for inline answers:

OK, that’s some useful extra info. I’ve just had a very quick basic play (I haven’t touched cron in earnest for a long time).

Have you tried echo-ing $z4 and appended to a tmp file to see if there’s anything in it at run time?

Yes, I have, and $z4 is indeed quite empty.

I’ve tried a few variations in a standard user’s crontab:

root@DESKTOP-9HGJE25:~# crontab -u wmcdonald -l | grep -v ^#

          • ansible -m setup localhost
          • ~/ansible-test

root@DESKTOP-9HGJE25:~# cat /home/wmcdonald/ansible-test
#!/bin/sh

ansible -m setup localhost

BASIC_VAR=ansible -m setup localhost
echo $BASIC_VAR

VERBOSE_VAR=ansible -vvv -m ping localhost
echo $VERBOSE_VAR

FILE_OUTPUT=ansible -m ping localhost
echo $FILE_OUTPUT >> /tmp/ansible.out

The output from the last set of steps shows:

root@DESKTOP-9HGJE25:~# cat /tmp/ansible.out
localhost | SUCCESS => { “changed”: false, “ping”: “pong” }
localhost | SUCCESS => { “changed”: false, “ping”: “pong” }

I did notice from syslog that without an MTA, cron (on Ubuntu, at least) is throwing away output:

/var/log/syslog:Aug 31 20:09:02 DESKTOP-9HGJE25 CRON[2361]: (CRON) info (No MTA installed, discarding output)

Not on this system. It seems clear that the ansible runs, the output is logged, but not sent to the “terminal” because, well,
I don’t know, but evidently, there’s no “terminal” with cron originating the execution of the shell, perhaps? Any options to ansible for this? Any options in crontab?

Ah-ha!!! Found it: I had to modify the script, and turn the z4=ansible ... 2>&1 | ... into:

/usr/local/bin/ansible mainmachine -m shell -a “psql …” | grep ‘^ [0-9]’ > /tmp/z4a
z4=cat /tmp/z4a

So, much to my surprise and dismay, the application of 2>&1 to ansible inside backticks is highly caustic. And, it didn’t really matter that I didn’t use the 2>&1, as no stderr messages were generated anyway. I am not proficient enough in ansible, nor in the finer points of bash, to render any judgment or condemnation here. So, if anyone else has the same problem, maybe 2 every 10 years, try to remove any filepointer redirections!

Thanks to Will McDonald, for his experiments and help! I really appreciate it!