2015-07-29 2 views
0

Bonjour,exécution ansible PlayBook AttributeError: objet 'str' n'a pas d'attribut 'set_playbook_basedir'

J'ai une question en deux parties.

Première partie: Je suis en train d'exécuter un PlayBook à partir d'un script python qui télécharge un livre de jeu et l'exécute. Je sais que le playbook fonctionne parce que je l'ai testé. Cependant, quand j'essaie d'exécuter le playbook avec du code python, j'obtiens un sans erreur d'attribut 'set_playbook_basedir' pas très sûr d'où cela vient. Voici la sortie d'erreur complète.

[[email protected] scripts]$ sudo python /var/lib/cloud/instance/scripts/part-001 
/usr/lib64/python2.7/dist-packages/Crypto/Util/number.py:57: PowmInsecureWarning: Not using mpz_powm_sec. You should rebuild using libgmp >= 5 to avoid timing attack vulnerability. 
    _warn("Not using mpz_powm_sec. You should rebuild using libgmp >= 5 to avoid timing attack vulnerability.", PowmInsecureWarning) 
/bin/bash: line 0: export: `=': not a valid identifier 
/bin/bash: line 0: export: `3': not a valid identifier 
~/vision_provis/storm.yml 
Traceback (most recent call last): 
    File "/var/lib/cloud/instance/scripts/part-001", line 71, in <module> 
    fatal: destination path 'vision_provis' already exists and is not an empty directory. 
check=True) 
    File "/usr/local/lib/python2.7/site-packages/ansible/playbook/__init__.py", line 169, in __init__ 
    self.inventory.set_playbook_basedir(self.basedir) 
AttributeError: 'str' object has no attribute 'set_playbook_basedir' 


#!/usr/bin/python 
import ansible.runner 
from ansible.playbook import PlayBook 
from ansible import inventory 
from ansible import callbacks 
import json 
import subprocess 
import os 
from ansible import utils 
import time 

def shell_command_execute(cmd): 
    try: 
     subprocess.Popen(['/bin/bash', '-c', cmd]) 
    except: 
     print 'There seems to be an error' 
repo = "https://github.com/zukeru/vision_provis.git" 
playbook = "storm.yml" 


echo_bash_profile = "export CLOUD_ENVIRONMENT=integration|export CLOUD_MONITOR_BUCKET=0|export CLOUD_APP=ES-test-storm-deploy-DEV--_yV_cyE-|export CLOUD_STACK=infra|export CLOUD_CLUSTER=0|export CLOUD_AUTO_SCALE_GROUP=0|export CLOUD_LAUNCH_CONFIG=0|export EC2_REGION=us-west-2|export CLOUD_DEV_PHASE=0|export CLOUD_REVISION=0|export CLOUD_DOMAIN=0|export SG_GROUP=ES-test-storm-deploy-DEV--qtv6a_Uj" 

for commands in echo_bash_profile.split('|'): 
    command_to_send = 'echo "' + commands + '" >> /home/ec2-user/.bash_profile' 
    shell_command_execute(commands) 
    shell_command_execute(command_to_send) 

var_user_data = "export SHARDS = 3" 

for commands in var_user_data.split('|'): 
    echo_bash_profile_passed = 'echo "' + commands + '" >> /home/ec2-user/.bash_profile' 
    shell_command_execute(commands) 
    shell_command_execute(echo_bash_profile_passed) 

command_remove = 'rm -rf /home/ec2-user/'+repo 
shell_command_execute(command_remove) 

command = 'cd /home/ec2-user/; git clone ' + repo 
shell_command_execute(command) 

folder = repo.split('/')[4].replace('.git','') 
full_path = '/home/ec2-user/' + folder + '/' + playbook 

time.sleep(6) 

# setting callbacks 
stats = callbacks.AggregateStats() 
playbook_cb = callbacks.PlaybookCallbacks(verbose=utils.VERBOSITY) 
runner_cb = callbacks.PlaybookRunnerCallbacks(stats, verbose=utils.VERBOSITY) 

print full_path 
# creating the playbook instance to run, based on "test.yml" file 
pb = PlayBook(playbook = full_path, 
           stats = stats, 
           callbacks = playbook_cb, 
           runner_callbacks = runner_cb, 
           inventory = "localhost", 
           check=True) 
# running the playbook 
pr = pb.run() 

# print the summary of results for each host 
#print json.dumps(pr, sort_keys=True, indent=4, separators=(',', ': ')) 

Le deuxième problème est:

Ce script est réellement passé comme les SSFE codé en base64 données utilisateur et son exécution, mais il ne semble pas reconnaître qu'il est python. Voici la-init-output.log nuage

Complete! 
Cloud-init v. 0.7.6 running 'modules:final' at Wed, 29 Jul 2015 00:17:16 +0000. Up 103.79 seconds. 
/var/lib/cloud/instance/scripts/part-001: line 3: import: command not found 
/var/lib/cloud/instance/scripts/part-001: line 4: import: command not found 
/var/lib/cloud/instance/scripts/part-001: line 5: import: command not found 
/var/lib/cloud/instance/scripts/part-001: line 6: import: command not found 
/var/lib/cloud/instance/scripts/part-001: line 7: import: command not found 
/var/lib/cloud/instance/scripts/part-001: line 8: import: command not found 
/var/lib/cloud/instance/scripts/part-001: line 10: syntax error near unexpected token `(' 
/var/lib/cloud/instance/scripts/part-001: line 10: `def shell_command_execute(cmd):' 
Jul 29 00:17:16 cloud-init[1958]: util.py[WARNING]: Failed running /var/lib/cloud/instance/scripts/part-001 [2] 
Jul 29 00:17:16 cloud-init[1958]: cc_scripts_user.py[WARNING]: Failed to run module scripts-user (scripts in /var/lib/cloud/instance/scripts) 
Jul 29 00:17:16 cloud-init[1958]: util.py[WARNING]: Running module scripts-user (<module 'cloudinit.config.cc_scripts_user' from '/usr/lib/python2.7/dist-packages/cloudinit/config/cc_scripts_user.pyc'>) failed 
Jul 29 00:17:16 cloud-init[1958]: templater.py[WARNING]: Cheetah not available as the default renderer for unknown template, reverting to the basic renderer. 
Cloud-init v. 0.7.6 finished at Wed, 29 Jul 2015 00:17:16 +0000. Datasource DataSourceEc2. Up 103.97 seconds 
+0

Avez-vous trouvé répondre à votre problème? –

Répondre

0

Je ne peux pas reproduire vos problèmes, mais ma meilleure estimation est que:

1) Vous devez initialiser votre PlayBook avec un objet d'inventaire au lieu de une chaîne:

from ansible.inventory import Inventory 
pb = PlayBook(playbook = full_path, 
       stats = stats, 
       callbacks = playbook_cb, 
       runner_callbacks = runner_cb, 
       inventory = Inventory(["localhost"]), 
       check=True) 

2) Votre script python doit être préfixé avec indication bash qu'il doit être exécuté par python. Il suffit de mettre le shebang suivant en haut de votre script python:

#! /usr/bin/env python 

Vous pouvez également exécuter votre script avec:

python /var/lib/cloud/instance/scripts/part-001 

au lieu de simplement:

/var/lib/cloud/instance/scripts/part-001