ansible-runner的用法

虽然ansible是Python项目,但在Python里调用ansible并没有想象中那么简单,很繁杂。ansible-runner是个不错的项目,提供了调用ansible的快捷方式。但文档异常缺乏,下面举两个例子,分别是调用module和调用ansible-playbook。

调用module非常简单,比如ansible all -m shell -a 'cat /proc/cpuinfo | grep processor | wc -l'直接写成

r = ansible_runner.run(inventory=inventory, host_pattern="default", module='shell', module_args="cat /proc/cpuinfo | grep processor | wc -l")

inventory就是个字符串,可以使用ini格式,比如:

"""[default] 
host_name ansible_host=1.2.3.4 ansible_port=22 ansible_user=root ansible_password=123456"""

inventory也可以通过跳板机,注意要安装sshpass

"""[default]
host_name ansible_host={ip} ansible_port={port} ansible_user={user} ansible_password={passwd} ansible_ssh_common_args='-o ProxyCommand="sshpass -p {jump_server_passwd} ssh -W %h:%p  {jump_server_user}@{jump_server_ip} -p {jump_server_port} """

调用ansible-playbook

r = ansible_runner.run(
                private_data_dir=tmpdir,
                inventory=inventory,
                playbook=playbook_path,
                host_pattern="default",
                # quiet=True,
                extravars={"timeout": 300, 
                           "lock_timeout": 120,
                           "service": 'test'
                           },
                envvars={"ANSIBLE_HOST_KEY_CHECKING": False}
            )

private_data_dir指向一个临时目录,可以用tempfile.TemporaryDirectory。

playbook_path是ansible-playbook的文件路径。host_pattern跟inventory保持一致为’default’即可。

quiet设为True可以屏蔽详细的日志信息。

extravars用来指定ansible-playbook内部的变量。

envvars就是附加的环境变量。

这两个例子已经覆盖了大部分使用场景,更详细的参数比如ssh private key登录可以看官方文档

Python引用计数

Python里object都会有一个属性:被引用次数,垃圾回收的时候会用到,最简单的情形是引用计数=0,直接回收掉即可。其他复杂些的情形,如循环引用,则需要通过标记-清除和分代回收机制来进行。
sys.getrefcount(obj)可以查看一个object被引用的次数。有趣的是它给出的结果总是比实际数目多1,原因是调用函数时也增加了一次引用。
其文档https://docs.python.org/3.7/library/sys.html#sys.getrefcount是如此描述的:

sys.getrefcount(object)
Return the reference count of the object. The count returned is generally one higher than you might expect, because it includes the (temporary) reference as an argument to getrefcount().

“generally one higher”,是说一般情况下会多一,但特殊情况不会多?否则直接减一然后返回实际值就行了?
值得研究一下。