プレイブックをpythonスクリプトで実行するにはどうすればよいですか?pythonでansibleモジュールを使用する次のものと同等のものは何ですか?
ansible -i hosts dbservers -m setup
ansible-playbook -i hosts -vvvv -k site.yml
http://docs.ansible.com/developing_api.html で彼らの文書を見ていましたが、例は非常に限られていました。
廃止予定通知:この投稿はansible 2では機能しません。APIが変更されました。
これは、「Python API」の下の Ansible documentation で説明されています。
たとえば、_ansible -i hosts dbservers -m setup
_は次の方法で実装されます。
_import ansible.runner
runner = ansible.runner.Runner(
module_name='setup',
module_args='',
pattern='dbservers',
)
dbservers_get_facts = runner.run()
_
Runnerの___init__
_メソッドには(_ansible.runner
_から)文書化されていないパラメーターがたくさんあります。 インラインをリストするには多すぎます がありますが、具体的に探しているものの推測として、この投稿にいくつかのパラメーターを含めました。
_class Runner(object):
''' core API interface to ansible '''
# see bin/ansible for how this is used...
def __init__(self,
Host_list=C.DEFAULT_Host_LIST, # ex: /etc/ansible/hosts, legacy usage
module_path=None, # ex: /usr/share/ansible
module_name=C.DEFAULT_MODULE_NAME, # ex: copy
module_args=C.DEFAULT_MODULE_ARGS, # ex: "src=/tmp/a dest=/tmp/b"
...
pattern=C.DEFAULT_PATTERN, # which hosts? ex: 'all', 'acme.example.org'
remote_user=C.DEFAULT_REMOTE_USER, # ex: 'username'
remote_pass=C.DEFAULT_REMOTE_PASS, # ex: 'password123' or None if using key
remote_port=None, # if SSH on different ports
private_key_file=C.DEFAULT_PRIVATE_KEY_FILE, # if not using keys/passwords
Sudo_pass=C.DEFAULT_Sudo_PASS, # ex: 'password123' or None
...
Sudo=False, # whether to run Sudo or not
Sudo_user=C.DEFAULT_Sudo_USER, # ex: 'root'
module_vars=None, # a playbooks internals thing
play_vars=None, #
play_file_vars=None, #
role_vars=None, #
role_params=None, #
default_vars=None, #
extra_vars=None, # extra vars specified with he playbook(s)
is_playbook=False, # running from playbook or not?
inventory=None, # reference to Inventory object
...
su=False, # Are we running our command via su?
su_user=None, # User to su to when running command, ex: 'root'
su_pass=C.DEFAULT_SU_PASS,
vault_pass=None,
...
):
_
たとえば、Sudoユーザーとパスを指定する上記のコマンドは次のようになります。
_runner = ansible.runner.Runner(
module_name='setup',
module_args='',
pattern='dbservers',
remote_user='some_user'
remote_pass='some_pass_or_python_expression_that_returns_a_string'
)
_
プレイブックについては、 playbook.PlayBook を調べてください。これは、同様のイニシャライザーのセットを取ります。
_class PlayBook(object):
'''
runs an ansible playbook, given as a datastructure or YAML filename.
...
'''
# *****************************************************
def __init__(self,
playbook = None,
Host_list = C.DEFAULT_Host_LIST,
module_path = None,
....
_
.run()
メソッドで実行できます。例えば。:
_from ansible.playbook import PlayBook
pb = PlayBook(playbook='/path/to/book.yml, --other initializers--)
pb.run()
_
より堅牢な使用法は _ansible-playbook
_ファイル にあります。
私の知る限り、プレイブックをPythonモジュールに変換するのはもう少し複雑ですが、上記のドキュメントを参照すると、Ansibleに組み込まれたYAMLパーサーを再利用してプレイブックを変数に変換できます。
私は質問に回答しました here ここに投稿すると、投稿リンクがコミュニティで推奨されません。それが役に立てば幸い。
ドキュメントは驚くほど不足しているので、始める必要があります here
そうは言っても、ここに私が一緒にハックして脚本を実行する簡単なスクリプトを示します。
#!/usr/bin/env python
import os
import sys
from collections import namedtuple
from ansible.parsing.dataloader import DataLoader
from ansible.vars.manager import VariableManager
from ansible.inventory.manager import Inventory
from ansible.executor.playbook_executor import PlaybookExecutor
loader = DataLoader()
inventory = Inventory(loader=loader, sources='/home/slotlocker/hosts2')
variable_manager = VariableManager(loader=loader, inventory=inventory)
playbook_path = '/home/slotlocker/ls.yml'
if not os.path.exists(playbook_path):
print '[INFO] The playbook does not exist'
sys.exit()
Options = namedtuple('Options', ['listtags', 'listtasks', 'listhosts', 'syntax', 'connection','module_path', 'forks', 'remote_user', 'private_key_file', 'ssh_common_args', 'ssh_extra_args', 'sftp_extra_args', 'scp_extra_args', 'become', 'become_method', 'become_user', 'verbosity', 'check','diff'])
options = Options(listtags=False, listtasks=False, listhosts=False, syntax=False, connection='ssh', module_path=None, forks=100, remote_user='slotlocker', private_key_file=None, ssh_common_args=None, ssh_extra_args=None, sftp_extra_args=None, scp_extra_args=None, become=True, become_method='Sudo', become_user='root', verbosity=None, check=False, diff=False)
variable_manager.extra_vars = {'hosts': 'mywebserver'} # This can accomodate various other command line arguments.`
passwords = {}
pbex = PlaybookExecutor(playbooks=[playbook_path], inventory=inventory, variable_manager=variable_manager, loader=loader, options=options, passwords=passwords)
results = pbex.run()
2.8.3で動作する簡単なコードの更新、
from ansible import context
from ansible.cli import CLI
from ansible.module_utils.common.collections import ImmutableDict
from ansible.executor.playbook_executor import PlaybookExecutor
from ansible.parsing.dataloader import DataLoader
from ansible.inventory.manager import InventoryManager
from ansible.vars.manager import VariableManager
loader = DataLoader()
context.CLIARGS = ImmutableDict(tags={}, listtags=False, listtasks=False, listhosts=False, syntax=False, connection='ssh',
module_path=None, forks=100, remote_user='xxx', private_key_file=None,
ssh_common_args=None, ssh_extra_args=None, sftp_extra_args=None, scp_extra_args=None, become=True,
become_method='Sudo', become_user='root', verbosity=True, check=False, start_at_task=None)
inventory = InventoryManager(loader=loader, sources=('/xxx/inventory_file',))
variable_manager = VariableManager(loader=loader, inventory=inventory, version_info=CLI.version_info(gitinfo=False))
pbex = PlaybookExecutor(playbooks=['/xxx/playbook.yml'], inventory=inventory, variable_manager=variable_manager, loader=loader, passwords={})
results = pbex.run()