获取正在执行的确切Ansible命令

获取正在执行的确切Ansible命令,ansible,ansible-2.x,Ansible,Ansible 2.x,是否可以确切地知道以下Ansible代码将在远程服务器上执行什么命令 - name: Ensure apache is running service: name=httpd state=started become: true 我相信用户应该拥有适当的sudo权限。但是,我一直得到sudo:password是必需的 更新#1 根据提供的评论,以下是我的完整Ansible命令: ANSIBLE_KEEP_REMOTE_FILES=1 sudo -u userA ansible-

是否可以确切地知道以下Ansible代码将在远程服务器上执行什么命令

- name: Ensure apache is running
    service: name=httpd state=started
    become: true
我相信用户应该拥有适当的sudo权限。但是,我一直得到
sudo:password是必需的

更新#1

根据提供的评论,以下是我的完整Ansible命令:

ANSIBLE_KEEP_REMOTE_FILES=1 sudo -u userA ansible-playbook ssl_playbook.yml -i inventories/staging --extra-vars "target=my_server_set" --private-key=/path/to/ssh.key --u userB  -vvv
  • userB是配置了指定SSH密钥的远程用户
  • userB拥有有限的sudo权限。我不能改变这个不幸的是,我不是服务器管理员
  • userB目前已经被配置为通过SSH/Key访问大量服务器,它似乎是Ansible的主要候选。我目前能够通过SSH(Apache、Tomcat、Jenkins等)手动管理所有中间件,并希望使用Ansible实现自动化

对于您的第一个问题(“是否有可能确切知道以下Ansible代码将在远程服务器上执行什么命令?”)的答案通常是“仅通过检查相应模块的源代码”。给定模块可以运行多个命令以完成其操作

您看到的错误消息(“
sudo:需要密码。
”)并不表示远程用户没有相应的
sudo
权限。它仅表明远程用户未配置为无密码的
sudo
。你的两个选择是:

  • 提供Ansible的密码:

    ansible-playbook -K secretpassword ...
    
  • 修改远程主机上的
    sudoers
    配置以允许无密码
    sudo

    remoteuser ALL=(ALL)    NOPASSWD:ALL
    

  • 涉及有限命令集的Sudo配置可能无法工作,因为Ansible正在使用
    Sudo
    运行脚本。例如,如果我针对以下剧本运行
    ansible playbook-vvv

    - hosts: localhost
      gather_facts: false
      tasks:
        - ping:
          become: true
    
    我将看到:

    <localhost> SSH: EXEC ssh -C -o ControlMaster=auto -o ControlPersist=60s -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o ConnectTimeout=10 -o ControlPath=/home/lars/.ansible/cp/8a5a4c6a60 -tt localhost '/bin/sh -c '"'"'sudo -H -S -n -u root /bin/sh -c '"'"'"'"'"'"'"'"'echo BECOME-SUCCESS-rebjujbhceobxvfuylirykxzgdonillt; /usr/bin/python /home/lars/.ansible/tmp/ansible-tmp-1505503292.11-47458712165303/ping.py; rm -rf "/home/lars/.ansible/tmp/ansible-tmp-1505503292.11-47458712165303/" > /dev/null 2>&1'"'"'"'"'"'"'"'"' && sleep 0'"'"''
    
    sudo
    看到的唯一命令是
    /bin/sh
    ,这意味着限制您仅使用某些命令的
    sudo
    配置注定会失败


    如果您无法修复远程
    sudo
    配置,您可能需要调查ansible的模块。

    ansible playbook-vvv
    将向您显示启动模块的确切命令。实际上,我一直在运行
    -vvv
    ,并注意到它正在使用
    sudo-H-s-n-u root…
    运行一个.tmp文件。我还启用了环境变量
    ANSIBLE\u KEEP\u REMOTE\u FILES
    ,以便查看这些文件。但是,打开.tmp文件后,我无法准确确定发生了什么。您可以在远程主机上手动运行
    sudo
    ,而无需密码吗?你能给我们看看你的
    sudoers
    配置吗?其他任务失败了吗,或者只是
    服务
    任务?是的,我经常在没有密码的情况下运行sudo。不过,我的命令集有限。例如sudo服务httpd启动|重启|状态。既然您提到了它,一些任务正在完成,而那些指定服务的任务也有问题。第二,如果我不能简单地发出原始命令,我会这样做吗?我宁愿使用更标准的Ansible代码。请参阅我答案的更新。我添加了更新#1。。。我瞥了一眼嵌入的脚本,无法立即破译任何内容。我假设它实际上运行的是sudo服务httpd status,情况可能并非如此。不,关键是
    sudo
    在脚本之外。因此,您不能使用仅限于特定命令的
    sudo
    配置。
    sudo
    看到的唯一命令是
    /bin/sh
    。我曾经考虑过原始命令。不过,我很好奇如何使用原始命令测试Apache状态。我相信服务的开始和停止是可行的。
    sudo -H -S -n -u root /bin/sh -c '...embedded script here...'