剧本
---
- name: Transfer and execute a script.
hosts: all
tasks:
- name: Transfer the script
copy: src=test1.sh dest=/home/bhreddy mode=0777
- name: Execute the script
command: sh /home/bhreddy/test1.sh
register: validate1
- name: run cmd
shell: echo "{{ inventory_hostname }}"
register: validate
- name: Write results to logfile
blockinfile:
create: yes
path: "/var/log/ansible/log"
insertafter: BOF
block: "{{ validate.stdout }} | {{ validate.stderr }}"
block: "{{ validate1.stdout }} | {{ validate1.stderr }}"
marker: "# {{ inventory_hostname }} {mark}"
delegate_to: localhost
脚本
root@bhreddy-VirtualBox:/home/bhreddy# cat test1.sh
#!/bin/bash
pass="password"
echo $pass | sudo -S su -c "fdisk -l"
如果我运行上述剧本,则输出如下:
root@bhreddy-VirtualBox:~# cat /var/log/ansible/log
# 192.168.56.102 BEGIN
Disk /dev/sda: 10 GiB, 10737418240 bytes, 20971520 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x37eaf900
Device Boot Start End Sectors Size Id Type
/dev/sda1 * 2048 20969471 20967424 10G 83 Linux | [sudo] password for bhreddy:
# 192.168.56.102 ENDroot@bhreddy-VirtualBox:~#
如果我直接运行Shell脚本,则输出如下:
root@bhreddy-VirtualBox:/home/bhreddy# ./test1.sh
Disk /dev/sda: 10 GiB, 10737418240 bytes, 20971520 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x37eaf900
Device Boot Start End Sectors Size Id Type
/dev/sda1 * 2048 20969471 20967424 10G 83 Linux
我不确定为什么在执行剧本时会添加这些多余的单词。 “ | bhreddy的[sudo]密码:”
请建议如何像我直接执行脚本时一样具有相同的输出。
答案 0 :(得分:1)
您看到| [sudo] password for bhreddy:
是因为您指示Ansible在以下行中先打印管道字符,再打印stderr
任务的Execute the script
:
block: "{{ validate1.stdout }} | {{ validate1.stderr }}"
stderr包含来自sudo
命令的密码提示,因为您以用户bhreddy
的身份执行脚本(这就是为什么它要求输入bhreddy
的密码)。
但是,在您的shell示例中,您以sudo
的身份执行root
(如发布的shell提示root@bhreddy-VirtualBox
中所示),并且不需要输入密码。
在两种情况下输出都是完全相同的,您只需要使用stdout即可。
block: "{{ validate1.stdout }}"
答案 1 :(得分:-1)
bhreddy的[sudo]密码:
来自脚本的stderr。
我建议您采用另一种完全不同的方法,因为您不需要执行打包此脚本的任务即可以root身份进行fdisk。
您将
替换为“ 传输脚本”和“ 执行脚本”- name: list the partition
command: /usr/sbin/fdisk
become: true # to become root
register: validate1