Hi Todd,
Thank you so much as always.
Actually to run the ansible we switch from normal user to root user and run
the ansible.
In my case when I m running "who am i" from Putty it is working but when I
am executing it from visual studio code using remote ssh login plugin there
it is not working.
Basically I want to send the mail from the user who logged in ex:
[email protected]. Even though we logged in as root when we give "who am i" it
returns the logged in user even though you su to another user. I will try
to use your code. Incase still my approach is bad please let me know.
Ex:
ubuntu /home/gara% who am i
gara pts/0 2008-06-20 11:36 (192.168.0.1)
ubuntu /home/gara% whoami
gara
ubuntu /home/gara% su -
Password:
root@ubuntu:~# who am i
gara pts/0 Jun 20 11:36 (192.168.0.1)
root@ubuntu:~# whoami
root
root@ubuntu:~#
Regarding the mailing function I am using the below. But it takes 10 min to
send the mail.
class Send_Mail:
def __init__(self, to_addrs, workbook_path):
self.to_addrs = to_addrs
self.workbook_path = workbook_path
d = self.workbook_path.rsplit("/", 3)
self.workbook_filename = d[3]
def send_mail(self):
import smtplib
from email.mime.text import MIMEText
from email import encoders
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
msg = MIMEMultipart()
msg['Subject'] = "Validation Result"
msg["From"] = "[email protected]"
msg["To"] = self.to_addrs
msg.preamble = 'excel test'
try:
file = open(self.workbook_path, 'rb')
attachment = MIMEBase('application', 'vnd.ms-excel')
attachment.set_payload(file.read())
file.close()
encoders.encode_base64(attachment)
attachment.add_header("Content-Disposition", 'attachment',
filename=self.workbook_filename)
msg.attach(MIMEText('Attached is your validation
result.\n\n\n', 'plain'))
msg.attach(attachment)
smtp = smtplib.SMTP('localhost')
smtp.send_message(msg)
smtp.close()
except IOError as e:
print('IOE Exception!!\n{0}'.format(e))
except:
raise RuntimeError("Sorry,email could not be sent successfully."
"Please scp the validation result yourself, "
"there might be something wrong with the
email address or something\n ")
else:
print('Validation result is now being sent as an Excel file to
{0}.'.format(self.to_addrs))
finally:
smtp.close()
file.close()
----
sendmail = Send_Mail(to_addrs, workbook_path)
sendmail.send_mail()
------
Kind regards
On Fri, Jul 28, 2023 at 21:43, Todd Lewis <[email protected]> wrote:
> On my controller, `who am i` produces no output. In your python script
> running on my system, because there is no output, `output[0]` correctly
> produces the "IndexError: list index out of range" message.
>
> Having your python script go to all that trouble to run an external
> program to get the user name seems a bit much. I'd suggest doing this
> instead:
>
> import os
> import pwd
> userid = pwd.getpwuid(os.getuid())[0]
>
> Then there's the question of whether you want to roll your own email
> sending program rather than using the `community.general.notification.mail`
> module. There may be good reasons either way.
>
> Good luck,
> --
> Todd
>
>
> On 7/28/23 2:12 AM, Prady A wrote:
>
> Hi Experts,
>
> Need your suggestion pls.
>
> The below one is ansible file which calls an python file in the control
> node(localhost) and process an excel file which is also present in control
> node based on hostnames. There is no issue in processing the excel and now
> I am facing challenges while sending the file in mail.I am trying to
> extract the current logged in user in control node and send mail to that
> logged in user. But both my below command incoporated in python script are
> not working.
> #cmd = 'echo $USER
> #cmd = 'who am i | cut -d" " -f 1'
> output, errors, return_code = serverside_execute_command(cmd)
>
> it seems my *serverside_execute_command(cmd):*
> I executed the python program standalone it is working as expected in the
> control node.But when it is called from Ansible code it is throwing the
> below error. Any insight would be greatly helpful.
>
> *Error:*
> fatal: [jp1ld100 -> localhost]: FAILED! => {"changed": true, "msg":
> "non-zero return code", "rc": 1, "stderr": "Traceback (most recent call
> last):\n File
> \"/root/.ansible/tmp/ansible-tmp-1690520194.14-32141-129555701534658/process_hostnames_v3.py\",
> line 213, in <module>\n mail(filename)\n File
> \"/root/.ansible/tmp/ansible-tmp-1690520194.14-32141-129555701534658/process_hostnames_v3.py\",
> line 168, in mail\n if not re.match('x', output[0]):\nIndexError: list
> index out of range\n", "stderr_lines": ["Traceback (most recent call
> last):", " File
> \"/root/.ansible/tmp/ansible-tmp-1690520194.14-32141-129555701534658/process_hostnames_v3.py\",
> line 213, in <module>", " mail(dest_filename)", " File
> \"/root/.ansible/tmp/ansible-tmp-1690520194.14-32141-129555701534658/process_hostnames_v3.py\",
> line 168, in mail", " if not re.match('x', output[0]):", "IndexError:
> list index out of range"], "stdout": "Test.xltm\nFile [Test.xltm] has been
> updated and sent to mail\nDEBUG cmd: who am i | cut -d\" \" -f 1\nDEBUG
> return_code: 0\n", "stdout_lines": ["Test.xltm", "File [Test.xltm] has been
> updated and sent to mail", "DEBUG cmd: who am i | cut -d\" \" -f 1",
> "DEBUG return_code: 0"]}
>
>
> *Process.yml:*
> name: Collect host
> hosts: all
> tasks:
> - block:
> - name: python
> script: "process_hostnames.py '{{ arg }}'"
> args:
> executable: python3
> delegate_to: localhost
> register: out
> vars:
> arg: "{{ ansible_play_hosts_all | join(' ') }}"
> - debug:
> var: out.stdout_lines
> run_once: true
>
>
> *process_hostnames.py*
>
> def *serverside_execute_command(cmd):*
> import subprocess
> try:
> result = subprocess.run(cmd, stdout=subprocess.PIPE,
> stderr=subprocess.PIPE,
> check=True, shell=True,
> universal_newlines=True)
> except subprocess.CalledProcessError:
> print('{0}'.format(result.stdout))
> sys.exit(1)
>
> output = []
> errors = []
> stdout = result.stdout.splitlines()
> try:
> for line in stdout:
> if line.strip() == "":
> pass
> else:
> output.append(line.strip())
> except UnicodeDecodeError:
> output = [ "OUTPUT UNREADABLE" ]
> try:
> errors.append(result.stderr.strip())
> except UnicodeDecodeError:
> errors = [" ERRORS UNREADABLE" ]
> return_code = result.returncode
>
> print("DEBUG cmd: {0}".format(cmd))
> print("DEBUG return_code: {0}".format(str(return_code)))
>
> return (output, errors, return_code)
>
> def mail(dest_filename):
> #cmd = 'echo $USER'
> cmd = 'who am i | cut -d" " -f 1'
> output, errors, return_code = *serverside_execute_command(cmd)*
> if not re.match('x', output[0]):
> raise RuntimeError("You are {0}.Please login as xID. Then try
> again.".format(result.stdout))
> sys.exit(1)
> xid = output[0].rstrip('\n')
>
>
> if __name__ == "__main__":
> file_name= "Template.xltm"
> mail(file_name)
>
>
> --
> 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 [email protected].
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/ansible-project/d3d38e2c-9984-89df-eb86-e3795162c9d6%40gmail.com
> <https://groups.google.com/d/msgid/ansible-project/d3d38e2c-9984-89df-eb86-e3795162c9d6%40gmail.com?utm_medium=email&utm_source=footer>
> .
>
--
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 [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/ansible-project/CAEuB3Ap0_idXR%2B5H-U3J%2B1apfcX%3DPu4x6SvPUo5b8UUQ6qO%3Dkw%40mail.gmail.com.