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必须不为空,否则会主动抛错!!

 

posted @ 2016-11-09 14:39  evil_liu  阅读(655)  评论(0)    收藏  举报