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

35 views
Skip to first unread message

Steve Murphy

unread,
Aug 31, 2023, 10:25:04 AM8/31/23
to ansible...@googlegroups.com
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):

======================================

# Run the 30-minly job

SHELL=/bin/bash

PATH=/sbin:/bin/:/usr/sbin:/usr/bin:/root

MAILTO=ROOT

*/30 * * * * root /root/getlist

======================================


/root/getlist   perms a+r, a+x, u+w:

=====================================

#!/bin/bash

z4=`ansible mainmachine -m shell -a "psql -t -Upiquah -c
\"subnet.ipaddress || '##' || subnet.netmask from subnet  order by
subnet.ipaddress asc;\"" 2>&1  | grep '^ [0-9]'`

echo $z4

=====================================

from which, if you run this "by hand", you'll get some output that looks
like this:

19.20.21.22##255.255.255.255 23.24.25.26##255.255.255.255
130.140.150.160##255.255.255.254

... and so forth.

BUT, if executed from cron, $z4 will be empty.


What do I need to do to in the cron.d file to make this work well?



Will McDonald

unread,
Aug 31, 2023, 10:59:57 AM8/31/23
to ansible...@googlegroups.com
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?



--
You received this message because you are subscribed to the Google Groups "Ansible Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email to ansible-proje...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/ansible-project/b11a6bc2-2938-2bdd-db40-b91ec77e7299%40parsetree.com.

mu...@parsetree.com

unread,
Aug 31, 2023, 1:57:47 PM8/31/23
to Ansible Project
See below.

On Thursday, August 31, 2023 at 8:59:57 AM UTC-6 Will McDonald wrote:
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.
I'm running this cron on a AlmaLinux release 8.8 (Sapphire Caracal) OS.

Will McDonald

unread,
Aug 31, 2023, 3:47:47 PM8/31/23
to ansible...@googlegroups.com
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)




--
You received this message because you are subscribed to the Google Groups "Ansible Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email to ansible-proje...@googlegroups.com.

mu...@parsetree.com

unread,
Aug 31, 2023, 9:18:10 PM8/31/23
to Ansible Project
See below for inline answers:

On Thursday, August 31, 2023 at 1:47:47 PM UTC-6 Will McDonald wrote:
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?

mu...@parsetree.com

unread,
Sep 1, 2023, 1:22:19 AM9/1/23
to Ansible Project
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!
Reply all
Reply to author
Forward
0 new messages