【问题标题】:bootstrapping ansible prerequisites with the script module. python required?使用脚本模块引导 ansible 先决条件。需要蟒蛇吗?
【发布时间】:2014-05-10 06:58:41
【问题描述】:

目标:给定一个没有安装 python 的 Debian 服务器(以及一些其他缺失的 ansible 先决条件),使用 ansible 来安装它们,这样我就可以使用普通的 ansible 模块(几乎所有这些模块都需要 python)来配置服务器。

根据the ansible documentation for the "script" module,“这个模块不需要远程系统上的python,就像原始模块一样。”。但是,根据我的测试,似乎脚本模块实际上确实尝试在远程系统上运行 python,至少在 sudo 选项为 true 的情况下。我相信只要我不启用 ansible 的 sudo 选项,我就可以让它与脚本模块一起使用,但是我需要我的远程用户在没有密码提示的情况下获得 sudo 权限,否则我的脚本只会挂起等待用于交互式输入 sudo 密码。

所以我的问题是:A)“脚本”模块是怎么回事。是否需要远程系统上的python?

和 B) 是否有更好的方法来实现我的更大目标,即在使用 ansible 之前无需任何手动步骤即可完全自动化部署?

这是我的ansible-playbook -vvv 输出,它清楚地表明它正在远程系统上运行/usr/bin/python,并且那里没有文件,因为尚未安装python。

TASK: [install ansible prerequisites]
*****************************************  <10.9.8.31> ESTABLISH
CONNECTION FOR USER: plyons <10.9.8.31> EXEC ['ssh', '-C', '-tt',
'-q', '-o', 'ControlMaster=auto', '-o', 'ControlPersist=60s',
'-o', 'ControlPath=/Users/plyons/.ansible/cp/ansible-
ssh-%h-%p-%r', '-o', 'StrictHostKeyChecking=no', '-o',
'KbdInteractiveAuthentication=no', '-o', 'PreferredAuthentications
=gssapi-with-mic,gssapi-keyex,hostbased,publickey', '-o',
'PasswordAuthentication=no', '-o', 'ConnectTimeout=10',
'10.9.8.31', "/bin/sh -c 'mkdir -p $HOME/.ansible/tmp/ansible-
tmp-1396233547.35-182235573044157 && chmod a+rx $HOME/.ansible/tmp
/ansible-tmp-1396233547.35-182235573044157 && echo
$HOME/.ansible/tmp/ansible-tmp-1396233547.35-182235573044157'"]
<10.9.8.31> PUT
/var/folders/n4/8skjkv9s5hbc4t5r0tr0xrk80000gn/T/tmpT1Vh6e TO
/home/plyons/.ansible/tmp/ansible-
tmp-1396233547.35-182235573044157/stat <10.9.8.31> EXEC ['ssh',
'-C', '-tt', '-q', '-o', 'ControlMaster=auto', '-o',
'ControlPersist=60s', '-o', 'ControlPath=/Users/plyons/.ansible/cp
/ansible-ssh-%h-%p-%r', '-o', 'StrictHostKeyChecking=no', '-o',
'KbdInteractiveAuthentication=no', '-o', 'PreferredAuthentications
=gssapi-with-mic,gssapi-keyex,hostbased,publickey', '-o',
'PasswordAuthentication=no', '-o', 'ConnectTimeout=10',
'10.9.8.31', '/bin/sh -c \'sudo -k && sudo -H -S -p "[sudo via
ansible, key=hyplatqjmvybpfqtukjegkibbuyrnoqj] password: " -u root
/bin/sh -c \'"\'"\'echo SUDO-SUCCESS-
hyplatqjmvybpfqtukjegkibbuyrnoqj; /usr/bin/python
/home/plyons/.ansible/tmp/ansible-
tmp-1396233547.35-182235573044157/stat\'"\'"\'\'']

这是我的剧本任务:

tasks:
  -
    name: install ansible prerequisites
    script: ansible_prereqs.sh creates=/root/.ansible_prereqs_installed

还有那个 ansible_prereqs.sh 脚本:

#!/bin/sh
#install ansible prereqs manually or all apt-based ansible commands will fail
# http://euphonious-intuition.com/2013/01/bootstrapping-a-cluster-with-ansible-debian-6-and-oracle-java-7/
apt-get update
apt-get install -y python python-apt python-pycurl sshpass
touch /root/.ansible_prereqs_installed

【问题讨论】:

    标签: ansible


    【解决方案1】:

    原始和脚本不需要 python。我认为创建需要python。为了验证你可以运行

    ansible -m script -a "ansible_prereqs.sh" 10.9.8.31 -vvvv
    

    您可以做的是将创建函数转移到您的脚本中

    #!/bin/sh
    #install ansible prereqs manually or all apt-based ansible commands will fail
    # http://euphonious-intuition.com/2013/01/bootstrapping-a-cluster-with-ansible-debian-6-and-oracle-java-7/
    if [ ! -f /root/.ansible_prereqs_installed ]; then
            apt-get update
            apt-get install -y python python-apt python-pycurl sshpass
            touch /root/.ansible_prereqs_installed
            echo "CHANGE"
    fi
    

    你的剧本可以是这样的

    tasks:
      -
        name: install ansible prerequisites
        script: ansible_prereqs.sh creates=/root/.ansible_prereqs_installed
        register: ans_preq
        changed_when: "'CHANGE' in ans_preq.stdout"
    

    希望对你有帮助

    【讨论】:

    • 这有帮助。 changed_when 行似乎是无效的 YAML,并且 ansible 显示有关引号的语法错误。
    • Register 缺少一个冒号,这使得 changed_when 看起来像问题 - 现在已修复。
    【解决方案2】:

    好的,进一步的测试让我明白@DomaNitro 是正确的,因为不是script 模块本身需要python,而是creates 选项尤其是,因为它使用stat python脚本。

    但是,一切似乎仍然正常,因为在初始检查 creates 标记文件时,ansible 会执行:/usr/bin/python /home/plyons/.ansible/tmp/ansible-tmp-1396271950.37-134911276396535/stat,这将失败,因为 /usr/bin/python 不存在,但这很好,因为我们想要脚本无论如何都要运行。

    一旦我的ansible_prereqs.sh 脚​​本运行,ansible 的stat 模块将开始工作,因为现在已安装/usr/bin/python,因此后续重新运行将看到标记文件存在并绕过脚本。

    所以我不需要在我的 shell 脚本代码中实现 creates 逻辑。这是我最后的工作手册:

    ---
    -
      hosts: all
      gather_facts: no
      sudo: yes
      tasks:
        -
          name: install ansible prerequisites
          script: ansible_prereqs.sh creates=/root/.ansible_prereqs_installed
    

    这是它运行的脚本ansible_prereqs.sh

    #!/bin/bash
    set -e
    apt-get -qq update
    apt-get -qq --yes install python python-apt python-pycurl sshpass
    touch /root/.ansible_prereqs_installed
    

    这是一些 ansible-playbook -vvv 输出,添加了解释性 cmets。

    <10.9.8.31> ESTABLISH CONNECTION FOR USER: plyons
    
    #Not sure exactly what this does, but presumably some basic
    #bootstrap sanity checking
    <10.9.8.31> EXEC ['ssh', '-C', '-tt',
    '-q', '-o', 'ControlMaster=auto', '-o', 'ControlPersist=60s', '-o',
    'ControlPath=/Users/plyons/.ansible/cp/ansible-ssh-%h-%p-%r', '-o',
    'StrictHostKeyChecking=no', '-o', 'KbdInteractiveAuthentication=no',
    '-o', 'PreferredAuthentications=gssapi-with-mic,gssapi-
    keyex,hostbased,publickey', '-o', 'PasswordAuthentication=no', '-o',
    'ConnectTimeout=10', '10.9.8.31', "/bin/sh -c 'mkdir -p
    $HOME/.ansible/tmp/ansible-tmp-1396273094.39-170062058638174 && chmod
    a+rx $HOME/.ansible/tmp/ansible-tmp-1396273094.39-170062058638174 &&
    echo $HOME/.ansible/tmp/ansible-tmp-1396273094.39-170062058638174'"]
    
    #OK the "creates" option causes ansible to upload the "stat"
    #python program
    <10.9.8.31> PUT
    /var/folders/n4/8skjkv9s5hbc4t5r0tr0xrk80000gn/T/tmp5CVz6i TO
    /home/plyons/.ansible/tmp/ansible-
    tmp-1396273094.39-170062058638174/stat
    
    #Then ansible attempts to run it with /usr/bin/python
    #This fails but ansible seems to proceed anyway, which is OK
    <10.9.8.31> EXEC ['ssh', '-C', '-tt', '-q', '-o', 'ControlMaster=auto', '-o',
    'ControlPersist=60s', '-o', 'ControlPath=/Users/plyons/.ansible/cp
    /ansible-ssh-%h-%p-%r', '-o', 'StrictHostKeyChecking=no', '-o',
    'KbdInteractiveAuthentication=no', '-o', 'PreferredAuthentications
    =gssapi-with-mic,gssapi-keyex,hostbased,publickey', '-o',
    'PasswordAuthentication=no', '-o', 'ConnectTimeout=10', '10.9.8.31',
    '/bin/sh -c \'sudo -k && sudo -H -S -p "[sudo via ansible,
    key=llljvkxiztigvqonzohgzwwekusxtprk] password: " -u root /bin/sh -c
    \'"\'"\'echo SUDO-SUCCESS-llljvkxiztigvqonzohgzwwekusxtprk;
    /usr/bin/python /home/plyons/.ansible/tmp/ansible-
    tmp-1396273094.39-170062058638174/stat\'"\'"\'\'']
    
    #Now ansible uploads my script
    <10.9.8.31> PUT
    /Users/plyons/projects/redacted/deploy/ansible_prereqs.sh
    TO /home/plyons/.ansible/tmp/ansible-tmp-1396273094.39-170062058638174/ansible_prereqs.sh
    
    #Then it marks it executable
    <10.9.8.31> EXEC ['ssh', '-C',
    '-tt', '-q', '-o', 'ControlMaster=auto', '-o', 'ControlPersist=60s',
    '-o', 'ControlPath=/Users/plyons/.ansible/cp/ansible-ssh-%h-%p-%r',
    '-o', 'StrictHostKeyChecking=no', '-o',
    'KbdInteractiveAuthentication=no', '-o', 'PreferredAuthentications
    =gssapi-with-mic,gssapi-keyex,hostbased,publickey', '-o',
    'PasswordAuthentication=no', '-o', 'ConnectTimeout=10', '10.9.8.31',
    u'/bin/sh -c \'sudo -k && sudo -H -S -p "[sudo via ansible,
    key=cgmwlvtjoxuighdqujwmmpvioiumveac] password: " -u root /bin/sh -c
    \'"\'"\'echo SUDO-SUCCESS-cgmwlvtjoxuighdqujwmmpvioiumveac; chmod +rx
    /home/plyons/.ansible/tmp/ansible-
    tmp-1396273094.39-170062058638174/ansible_prereqs.sh\'"\'"\'\'']
    
    #Then it runs it
    <10.9.8.31> EXEC ['ssh', '-C', '-tt', '-q', '-o',
    'ControlMaster=auto', '-o', 'ControlPersist=60s', '-o',
    'ControlPath=/Users/plyons/.ansible/cp/ansible-ssh-%h-%p-%r', '-o',
    'StrictHostKeyChecking=no', '-o', 'KbdInteractiveAuthentication=no',
    '-o', 'PreferredAuthentications=gssapi-with-mic,gssapi-
    keyex,hostbased,publickey', '-o', 'PasswordAuthentication=no', '-o',
    'ConnectTimeout=10', '10.9.8.31', u'/bin/sh -c \'sudo -k && sudo -H -S
    -p "[sudo via ansible, key=cqqswbszbeabpclraxsxwzzatbolgmgf] password:
    " -u root $SHELL -c \'"\'"\'echo SUDO-SUCCESS-
    cqqswbszbeabpclraxsxwzzatbolgmgf; /home/plyons/.ansible/tmp/ansible-
    tmp-1396273094.39-170062058638174/ansible_prereqs.sh \'"\'"\'\'']
    
    #Then it deletes it
    <10.9.8.31> EXEC ['ssh', '-C', '-tt',
    '-q', '-o', 'ControlMaster=auto', '-o', 'ControlPersist=60s', '-o',
    'ControlPath=/Users/plyons/.ansible/cp/ansible-ssh-%h-%p-%r', '-o',
    'StrictHostKeyChecking=no', '-o', 'KbdInteractiveAuthentication=no',
    '-o', 'PreferredAuthentications=gssapi-with-mic,gssapi-
    keyex,hostbased,publickey', '-o', 'PasswordAuthentication=no', '-o',
    'ConnectTimeout=10', '10.9.8.31', "/bin/sh -c 'rm -rf
    /home/plyons/.ansible/tmp/ansible-tmp-1396273094.39-170062058638174/
    >/dev/null 2>&1'"]
    

    【讨论】:

    • 感谢上一篇文章。现在我知道明天该做什么了;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多