ansible剧本的脚本输出不同于常规脚本输出

时间:2018-09-03 15:20:50

标签: ansible

剧本

---
- 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]密码:”

请建议如何像我直接执行脚本时一样具有相同的输出。

2 个答案:

答案 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