ansible 调用playbook api执行(一)

一 调用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

 

原文地址:https://www.cnblogs.com/wanstack/p/8820889.html