Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用脚本模块引导ansible先决条件。需要python吗?_Ansible - Fatal编程技术网

使用脚本模块引导ansible先决条件。需要python吗?

使用脚本模块引导ansible先决条件。需要python吗?,ansible,Ansible,目标:给定一个没有安装python的Debian服务器(以及其他一些缺少的ansible先决条件),使用ansible安装它们,这样我就可以使用普通的ansible模块(几乎所有模块都需要python)来配置服务器 根据“这个模块不需要远程系统上的python,就像原始模块一样。”。但是,根据我的测试,脚本模块似乎确实尝试在远程系统上运行python,至少在sudo选项为true的情况下是这样。我相信,只要我不启用ansible的sudo选项,我就可以使用脚本模块实现这一点,但我需要我的远程用户

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

根据“这个模块不需要远程系统上的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\'"\'"\'\'']
还有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

原始脚本和脚本不需要python。我认为这需要python。要验证您是否可以运行

ansible -m script -a "ansible_prereqs.sh" 10.9.8.31 -vvvv
您可以做的是将creates函数转移到脚本中

#!/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"

希望这有助于

好的,进一步的测试让我明白@DomaNitro是正确的,因为它不是每个say都需要python的
脚本
模块本身,而是
特别创建了
选项,因为它使用了
stat
python脚本

然而,事情似乎仍然很顺利,因为在对
创建标记文件的初始检查中,ansible将执行以下操作:
/usr/bin/python/home/plyons/.ansible/tmp/ansible-tmp-1396271950.37-134911276396535/stat
,该操作将失败,因为
/usr/bin/python
,但这很好,因为我们希望脚本无论如何都能运行

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

因此,我不需要在shell脚本代码中实现
创建
逻辑。这是我最后的工作手册:

---
-
  hosts: all
  gather_facts: no
  sudo: yes
  tasks:
    -
      name: install ansible prerequisites
      script: ansible_prereqs.sh creates=/root/.ansible_prereqs_installed
下面是它运行的脚本
ansible\u 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
输出,添加了解释性注释

<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'"]
为用户建立连接:plyons
#不确定这到底是做什么的,但可能是一些基本的
#引导健全性检查
EXEC['ssh','-C','-tt',
'-q'、'-o'、'ControlMaster=auto'、'-o'、'ControlPersist=60s'、'-o',
'ControlPath=/Users/plyons/.ansible/cp/ansible ssh-%h-%p-%r','-o',
'StricHostKeyChecking=no'、'-o'、'KbdInteractiveAuthentication=no',
'-o','PreferredAuthentications=gssapi带麦克风,gssapi-
keyex,基于主机,公钥','-o',PasswordAuthentication=no','-o',
'ConnectTimeout=10','10.9.8.31',“/bin/sh-c'mkdir-p
$HOME/.ansible/tmp/ansible-tmp-1396273094.39-17006205838174&&chmod
a+rx$HOME/.ansible/tmp/ansible-tmp-1396273094.39-17006205838174&&
echo$HOME/.ansible/tmp/ansible-tmp-1396273094.39-17006205838174']
#确定“创建”选项导致ansible上载“stat”
#python程序
放
/var/folders/n4/8skjkv9s5hbc4t5r0tr0xrk8000gn/T/tmp5CVz6i至
/home/plyons/.ansible/tmp/ansible-
tmp-1396273094.39-17006205838174/stat
#然后ansible尝试使用/usr/bin/python运行它
#这失败了,但ansible似乎仍在继续,这是正常的
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”,“首选身份验证”
=带麦克风的gssapi、gssapi keyex、基于主机、公钥'、'-o',
'PasswordAuthentication=no'、'-o'、'ConnectTimeout=10'、'10.9.8.31',
“/bin/sh-c”“sudo-k&&sudo-H-S-p”[sudo via ansible,
key=llljvkxiztigvqonzohgzwkekusxtprk]密码:“-u root/bin/sh-c
\“echo SUDO SUDO SUCCESS LLLJVKXIZTIGVQONZHOGZWWEKUSXTPRK;
/usr/bin/python/home/plyons/.ansible/tmp/ansible-
tmp-1396273094.39-170062058638174/stat\'''''''''''''''''''''']
#现在ansible上传我的脚本
放
/用户/plyons/projects/redact/deploy/ansible_prereqs.sh
TO/home/plyons/.ansible/tmp/ansible-tmp-1396273094.39-17006205838174/ansible_prereqs.sh
#然后它将其标记为可执行
EXEC['ssh','-C',
'-tt'、'-q'、'-o'、'ControlMaster=auto'、'-o'、'ControlPersist=60s',
“-o”,“ControlPath=/Users/plyons/.ansible/cp/ansible ssh-%h-%p-%r”,
'-o','StrichostKeyChecking=no','-o',',
“KbdInteractiveAuthentication=no”,“-o”,“首选身份验证”
=带麦克风的gssapi、gssapi keyex、基于主机、公钥'、'-o',
'PasswordAuthentication=no'、'-o'、'ConnectTimeout=10'、'10.9.8.31',
u'/bin/sh-c“sudo-k和sudo-H-S-p”[sudo通过ansible,
key=cgmwlvtjoxuighdqujwmmpvioiumveac]密码:“-u root/bin/sh-c
\“\”\“echo SUDO成功cgmwlvtjoxuighdqujwmmpvioiumveac;chmod+rx
/home/plyons/.ansible/tmp/ansible-
tmp-1396273094.39-17006205838174/ansible\U PREREQUES.sh\''''''''''''''
#然后它运行它
EXEC['ssh'、'-C'、'-tt'、'-q'、'-o',
'ControlMaster=auto'、'-o'、'ControlPersist=60s'、'-o',
'ControlPath=/Users/plyons/.ansible/cp/ansible ssh-%h-%p-%r','-o',
'StricHostKeyChecking=no'、'-o'、'KbdInteractiveAuthentication=no',
'-o','PreferredAuthentications=gssapi带麦克风,gssapi-
keyex,基于主机,公钥','-o',PasswordAuthentication=no','-o',
'ConnectTimeout=10','10.9.8.31',u'/bin/sh-c'sudo-k&&sudo-H-S
-p“[sudo via ansible,钥匙
<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'"]