<p><em>不推荐注意:这篇文章在ansibe2中不起作用。API已更改。</em></p>
<p>这在“Python API”下的<a href="http://docs.ansible.com/developing_api.html" rel="noreferrer">Ansible documentation</a>中介绍过</p>
<p>例如,<code>ansible -i hosts dbservers -m setup</code>通过以下方式实现:</p>
<pre><code>import ansible.runner
runner = ansible.runner.Runner(
module_name='setup',
module_args='',
pattern='dbservers',
)
dbservers_get_facts = runner.run()
</code></pre>
<p>Runner的<code>__init__</code>方法中有一堆未记录的参数(来自<code>ansible.runner</code>)。这里有<a href="https://github.com/ansible/ansible/blob/release1.8.4/lib/ansible/runner/__init__.py#L109-L162" rel="noreferrer">too many to list inline</a>,但我在这篇文章中包含了一些参数,以猜测您具体要找的是什么。</p>
<pre><code>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,
...
):
</code></pre>
<p>例如,上面指定sudo用户和pass的命令是:</p>
<pre><code>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'
)
</code></pre>
<p>对于playbooks,请查看<a href="https://github.com/ansible/ansible/blob/release1.8.4/lib/ansible/playbook/__init__.py#L42-L84" rel="noreferrer">playbook.PlayBook</a>,它采用了一组类似的初始化器:</p>
<pre><code>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,
....
</code></pre>
<p>可以用<code>.run()</code>方法执行。e、 g.:</p>
<pre><code>from ansible.playbook import PlayBook
pb = PlayBook(playbook='/path/to/book.yml, --other initializers--)
pb.run()
</code></pre>
<p>可以在<a href="https://github.com/ansible/ansible/blob/release1.8.4/bin/ansible-playbook" rel="noreferrer">^{<cd5>} file</a>中找到更可靠的用法。</p>
<p>据我所知,将playbooks转换为Python模块要复杂一些,但是上面列出的文档应该会让您了解,您可以重用Ansible中内置的YAML解析器,将playbooks转换为变量。</p>