一 調用ansible playbook api執行playbook
1 准備好hosts文件
root@ansible:~/ansible/playbooks# cat hosts [all:vars] ansible_ssh_pass=root1234 [webserver01] testserver01 ansible_ssh_host=172.20.6.121 [webserver02] testserver04 ansible_ssh_host=172.20.6.125 testserver03 ansible_ssh_host=172.20.6.124
2 准備好playbook劇本
這里准備2個把,當然可以准備多個
root@ansible:~/ansible/playbooks# cat mysql.yml --- - name: install and config mariadb for remote host hosts: webserver01 tasks: - name: install mariadb for remote host yum: args: name: mariadb,mariadb-server state: present - name: start mariadb for remote host service: args: name: mariadb state: started - name: create database for remote mariadb mysql_db: name=ansible_test state=present
root@ansible:~/ansible/playbooks# cat test_result.yml --- - name: test when hosts: webserver02 tasks: - command: /bin/true register: result ignore_errors: True - command: ls when: result| failed - command: df -h when: result| success - command: pwd when: result| skipped
3 開始調用api吧
root@ansible:~/ansible# cat test-task.py #!/usr/bin/env python # coding:utf-8 import json from collections import namedtuple from ansible.parsing.dataloader import DataLoader from ansible.vars import VariableManager from ansible.inventory import Inventory from ansible.playbook.play import Play from ansible.executor.task_queue_manager import TaskQueueManager from ansible.executor.task_result import TaskResult from ansible.plugins.callback import CallbackBase from ansible.executor.playbook_executor import PlaybookExecutor import os,sys # 在指定文件時,不能使用列表指定多個。 host_path = '/root/ansible/playbooks/hosts' if not os.path.exists(host_path): print '[INFO] The [%s] inventory does not exist' % host_path sys.exit() # 管理變量的類,包括主機,組,擴展等變量,之前版本是在 inventory中的 variable_manager = VariableManager() # 用來加載解析yaml文件或JSON內容,並且支持vault的解密 loader = DataLoader() # 初始化需要的對象 Options = namedtuple('Options', ['connection', 'remote_user', 'ask_sudo_pass', 'verbosity', 'ack_pass', 'module_path', 'forks', 'become', 'become_method', 'become_user', 'check', 'listhosts', 'listtasks', 'listtags', 'syntax', 'sudo_user', 'sudo', 'private_key_file', 'ssh_common_args', 'sftp_extra_args', 'scp_extra_args', 'ssh_extra_args']) # 定義連接遠端的額方式為smart options = Options(connection='smart', remote_user='root', ack_pass=None, sudo_user='root', forks=5, sudo='yes', ask_sudo_pass=False, verbosity=5, module_path=None, become=True, become_method='sudo', become_user='root', check=None, listhosts=None, listtasks=None, listtags=None, syntax=None, private_key_file=None, ssh_common_args=None, sftp_extra_args=None, scp_extra_args=None, ssh_extra_args=None) # 定義默認的密碼連接,主機未定義密碼的時候才生效,conn_pass指連接遠端的密碼,become_pass指提升權限的密碼 passwords = dict(conn_pass = 'root1234',become_pass = 'root1234') # create inventory and pass to var manager # 創建inventory、並帶進去參數 inventory = Inventory(loader=loader, variable_manager=variable_manager, host_list='/root/ansible/playbooks/hosts') # 把inventory傳遞給variable_manager管理 variable_manager.set_inventory(inventory) # 多個yaml文件則以列表形式 playbook_path = ['/root/ansible/playbooks/mysql.yml', '/root/ansible/playbooks/test_result.yml'] for playbook in playbook_path: if not os.path.exists(playbook): print '[INFO] The [%s] playbook does not exist' % playbook sys.exit() playbook = PlaybookExecutor(playbooks=playbook_path, inventory=inventory, variable_manager=variable_manager, loader=loader, options=options, passwords=passwords) # 執行playbook result = playbook.run() print '執行結果: %s' %(result)
4 開始執行吧
root@ansible:~/ansible# python test-task.py PLAY [install and config mariadb for remote host] ****************************** TASK [install mariadb for remote host] ***************************************** ok: [testserver01] TASK [start mariadb for remote host] ******************************************* ok: [testserver01] TASK [create database for remote mariadb] ************************************** ok: [testserver01] PLAY RECAP ********************************************************************* testserver01 : ok=3 changed=0 unreachable=0 failed=0 PLAY [test when] *************************************************************** TASK [command] ***************************************************************** changed: [testserver04] changed: [testserver03] TASK [command] ***************************************************************** skipping: [testserver03] skipping: [testserver04] TASK [command] ***************************************************************** changed: [testserver03] changed: [testserver04] TASK [command] ***************************************************************** skipping: [testserver04] skipping: [testserver03] PLAY RECAP ********************************************************************* testserver01 : ok=3 changed=0 unreachable=0 failed=0 testserver03 : ok=2 changed=2 unreachable=0 failed=0 testserver04 : ok=2 changed=2 unreachable=0 failed=0 執行結果: 0