zoukankan      html  css  js  c++  java
  • 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
    

     

  • 相关阅读:
    tomcat 支持https
    linux环境下jdk 安装以及maven私服搭建
    消息中间间初识
    HDU 5527 Too Rich
    HDU 5534 Partial Tree
    HDU 5543 Pick The Sticks
    HDU 5542 The Battle of Chibi dp+树状数组
    CodeForces 842D Vitya and Strange Lesson
    Codeforces 858D Polycarp's phone book
    HDU 5489 Removed Interval
  • 原文地址:https://www.cnblogs.com/wanstack/p/8820889.html
Copyright © 2011-2022 走看看