2015-07-29 4 views
0

Здравствуйте,Выполнение анзибль пьес AttributeError: 'ул' объект не имеет атрибута 'set_playbook_basedir'

У меня есть две части вопроса.

Первая часть: Я пытаюсь выполнить пьесы из сценария питона, который скачивает пьесы и выполняет его. Я знаю, что пьеса работает, потому что я ее протестировал. Однако, когда я пытаюсь выполнить playbook с кодом python, я получаю без атрибута error 'set_playbook_basedir' не совсем уверен, откуда это происходит. Вот полный вывод ошибки.

[[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=(',', ': ')) 

Вторая проблема:

Этот сценарий фактически передается в кодировке Base64 AWS данных пользователя и его выполнения, но это, кажется, не признают, что это питон. Вот облако-INIT-output.log

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

Вы нашел ответьте на свою проблему? –

ответ

0

Я не могу воспроизвести ваши вопросы, но моя догадка, что:

1) Вы должны инициализировать Playbook с инвентаризации объекта, а строка:

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) Ваш питон скрипт должен начинаться с префикса указанием колотить, что она должна быть выполнена питона. Просто поместите следующий shebang в верхней части вашего питона сценария:

#! /usr/bin/env python 

В качестве альтернативы, вы можете запустить скрипт с:

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

вместо просто:

/var/lib/cloud/instance/scripts/part-001 
Смежные вопросы