ansible 和playbook api
ansible给咱们提供2个python api,一个简单的版本低的api,只能执行单个命令操作的,对于复杂的逻辑的操作需要借助playbook来实现,但是playbook的api目前没有研究出命令返回结果的,再研究下callback插件。
ansible api
1 import ansible.runner 2 import json 3 runner = ansible.runner.Runner( 4 module_name='shell',#调用shell模块 5 module_args='uptime',#模块参数。 6 pattern='test',#匹配的执行的host 7 forks=10,#并发数。 8 remote_user='root',#远程ssh登录用户。。 9 remote_pass='123',#远程登录密码。 10 ) 11 datastructure = runner.run()#接受run函数返回的执行结果。 12 data = json.dumps(datastructure,indent=4) 13 for i,j in datastructure['contacted'].items():#处理执行结果。 14 print i,j['stdout']
输出结果:
1 127.0.0.1 01:12:15 up 6 days, 12:58, 42 users, load average: 0.03, 0.04, 0.03
原始输出结果:其中记录了命令执行结果,以及调用模块的名字和模块参数。返回值。成功返回值为0、标准输出、标准错误输出等信息!
1 { 2 "dark": {}, 3 "contacted": { 4 "127.0.0.1": { 5 "cmd": "uptime", 6 "end": "2016-11-10 01:32:59.781879", 7 "stdout": " 01:32:59 up 6 days, 13:19, 34 users, load average: 0.00, 0.01, 0.00", 8 "changed": true, 9 "start": "2016-11-10 01:32:59.771125", 10 "delta": "0:00:00.010754", 11 "stderr": "", 12 "rc": 0, 13 "invocation": { 14 "module_name": "shell", 15 "module_args": "uptime" 16 }, 17 "warnings": [] 18 } 19 } 20 }
其中在Runner函数可以使用的字段为:
1 host_list=C.DEFAULT_HOST_LIST, # ex: /etc/ansible/hosts, legacy usage #执行host清单,如果不指定文件,会读取ansible.cfg文件的inventory = xx字段。 2 module_path=None, # ex: /usr/share/ansible#模块路径,比如:/usr/share/ansible ex==example。 3 module_name=C.DEFAULT_MODULE_NAME, # ex: copy#模块的名字。 4 module_args=C.DEFAULT_MODULE_ARGS, # ex: "src=/tmp/a dest=/tmp/b"#模块的参数。 5 forks=C.DEFAULT_FORKS, # parallelism level并发进程数。 6 timeout=C.DEFAULT_TIMEOUT, # SSH timeout#ssh 连接超时。 7 pattern=C.DEFAULT_PATTERN, # which hosts? ex: 'all', 'acme.example.org'#host清单里,匹配的组 host清单。 8 remote_user=C.DEFAULT_REMOTE_USER, # ex: 'username'#远程登录用户和执行用户。 9 remote_pass=C.DEFAULT_REMOTE_PASS, # ex: 'password123' or None if using key#远程登录用户密码。 10 remote_port=None, # if SSH on different ports#ssh连接端口。 11 private_key_file=C.DEFAULT_PRIVATE_KEY_FILE, # if not using keys/passwords#私钥位置,如果不是ssh 连接话。 12 background=0, # async poll every X seconds, else 0 for non-async#异步参数。 13 basedir=None, # directory of playbook, if applicable#playbook 路径。 14 setup_cache=None, # used to share fact data w/ other tasks#搜集远程节点的信息。 15 vars_cache=None, # used to store variables about hosts#host清单变量。 16 transport=C.DEFAULT_TRANSPORT, # 'ssh', 'paramiko', 'local'#连接远程主机的方式,是ssh还是paramiko.... 17 conditional='True', # run only if this fact expression evals to true #未知 18 callbacks=None, # used for output#用于结果输出。 19 module_vars=None, # a playbooks internals thing##模块变量。 20 play_vars=None, # 21 play_file_vars=None, # 22 role_vars=None, # 23 role_params=None, # 24 default_vars=None, # 25 extra_vars=None, # extra vars specified with he playbook(s)#其他额外一些参数。 26 is_playbook=False, # running from playbook or not? 27 inventory=None, # reference to Inventory object 28 subset=None, # subset pattern 29 check=False, # don't make any changes, just try to probe for potential changes#测试play,看看对hostlist产生哪些变化。 30 diff=False, # whether to show diffs for template files that change 31 environment=None, # environment variables (as dict) to use inside the command 32 complex_args=None, # structured data in addition to module_args, must be a dict 33 error_on_undefined_vars=C.DEFAULT_UNDEFINED_VAR_BEHAVIOR, # ex. False 34 accelerate=False, # use accelerated connection 35 accelerate_ipv6=False, # accelerated connection w/ IPv6 36 accelerate_port=None, # port to use with accelerated connection 37 vault_pass=None, 38 run_hosts=None, # an optional list of pre-calculated hosts to run on 39 no_log=False, # option to enable/disable logging for a given task 40 run_once=False, # option to enable/disable host bypass loop for a given task 41 become=False, # whether to run privelege escalation or not 42 become_method=C.DEFAULT_BECOME_METHOD, 43 become_user=C.DEFAULT_BECOME_USER, # ex: 'root' 44 become_pass=C.DEFAULT_BECOME_PASS, # ex: 'password123' or None 45 become_exe=C.DEFAULT_BECOME_EXE, # ex: /usr/local/bin/sudo 46 ): 47 48 # used to lock multiprocess inputs and outputs at various levels 49 self.output_lockfile = OUTPUT_LOCKFILE 50 self.process_lockfile = PROCESS_LOCKFILE
ansible playbook api:
playbook的优势:可以自定义yml文件,定义play,列出我们想要执行的任务清单。符合更复杂的逻辑处理。
1 import sys 2 import ansible.playbook 3 from ansible import callbacks 4 from ansible import utils 5 stats = callbacks.AggregateStats()#holds stats about per-host activity during playbook runs,储存每个host在执行任务的时候状态信息。 6 playbook_cb = callbacks.PlaybookCallbacks(verbose=utils.VERBOSITY) 7 runner_cb = callbacks.PlaybookRunnerCallbacks(stats, verbose=utils.VERBOSITY) 8 def execute(play,params): 9 pb = ansible.playbook.PlayBook( 10 playbook=play, 11 stats=stats, 12 forks=20, 13 callbacks=playbook_cb, 14 remote_pass=123, 15 runner_callbacks=runner_cb, 16 check=False, 17 # timeout=2, 18 extra_vars=eval(params) 19 ) 20 return pb.run() 21 if __name__=='__main__': 22 res=execute(sys.argv[1],sys.argv[2]) 23 print res
其中:支持字段如下:
1 """ 2 playbook: path to a playbook file#yml文件位置。 3 host_list: path to a file like /etc/ansible/hosts#host清单。 4 module_path: path to ansible modules, like /usr/share/ansible/#模路径。 5 forks: desired level of parallelism#并发进程数,parallelism并发的意思。 6 timeout: connection timeout#类似于ssh连接超时 7 remote_user: run as this user if not specified in a particular play#远程执行和登录用户。 8 remote_pass: use this remote password (for all plays) vs using SSH keys#远程登录的ssh密码。 9 remote_port: default remote port to use if not specified with the host or play#ssh端口。 10 transport: how to connect to hosts that don't specify a transport (local, paramiko, etc)#连接类型, 11 callbacks output callbacks for the playbook#执行结果输出。 12 runner_callbacks: more callbacks, this time for the runner API#执行回调函数api。 13 stats: holds aggregrate data about events occurring to each host#每个host执行过程中信息。 14 inventory: can be specified instead of host_list to use a pre-existing inventory object#host执行清单。 15 check: don't change anything, just try to detect some potential changes#检测 执行yml文件的对主机产生哪些变化。 16 any_errors_fatal: terminate the entire execution immediately when one of the hosts has failed#当主机执行过程中出现错误,终止执行过程。 17 force_handlers: continue to notify and run handlers even if a task fails#强制执行handlers 及时主机执行错误。 18 """
如果不填写参数,参数默认列表:
1 playbook = None, 2 host_list = C.DEFAULT_HOST_LIST, 3 module_path = None, 4 forks = C.DEFAULT_FORKS, 5 timeout = C.DEFAULT_TIMEOUT, 6 remote_user = C.DEFAULT_REMOTE_USER, 7 remote_pass = C.DEFAULT_REMOTE_PASS, 8 remote_port = None, 9 transport = C.DEFAULT_TRANSPORT, 10 private_key_file = C.DEFAULT_PRIVATE_KEY_FILE, 11 callbacks = None, 12 runner_callbacks = None, 13 stats = None, 14 extra_vars = None, 15 only_tags = None, 16 skip_tags = None, 17 subset = C.DEFAULT_SUBSET, 18 inventory = None, 19 check = False, 20 diff = False, 21 any_errors_fatal = False, 22 vault_password = False, 23 force_handlers = False, 24 # privelege escalation 25 become = C.DEFAULT_BECOME, 26 become_method = C.DEFAULT_BECOME_METHOD, 27 become_user = C.DEFAULT_BECOME_USER, 28 become_pass = None,
其中必须参数:
1 arguments = [] 2 if playbook is None: 3 arguments.append('playbook') 4 if callbacks is None: 5 arguments.append('callbacks') 6 if runner_callbacks is None: 7 arguments.append('runner_callbacks') 8 if stats is None: 9 arguments.append('stats') 10 if arguments: 11 raise Exception('PlayBook missing required arguments: %s' % ', '.join(arguments))
playbook、callbacks、runner_callbacks、stats必须不为空,否则会主动抛错!!
学习是一种态度,坚持是质变的利器!

浙公网安备 33010602011771号