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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用Ansible调用OpenStack API创建云主机的步骤: 1. 安装openstacksdk:在控制节点上安装openstacksdk,使用以下命令即可: ``` pip install openstacksdk ``` 2. 在Ansible主机上创建一个yml文件,包含以下任务: ``` - name: Create a new instance hosts: localhost gather_facts: no vars: auth: auth_url: "http://keystone.example.com:5000/v3" username: "admin" password: "password" project_name: "admin" project_domain_name: "default" user_domain_name: "default" server: name: "test-instance" image_name: "ubuntu-16.04" flavor_name: "m1.small" network_name: "private" key_name: "my-keypair" security_group: "default" tasks: - name: Authenticate to OpenStack os_auth: cloud: "{{ auth }}" cache_path: "/tmp/.openstack.cache" register: auth_result - name: Create a new instance os_server: state: present cloud: "{{ auth }}" name: "{{ server.name }}" image_name: "{{ server.image_name }}" flavor_name: "{{ server.flavor_name }}" network_name: "{{ server.network_name }}" key_name: "{{ server.key_name }}" security_groups: "{{ server.security_group }}" register: instance_result - name: Print instance details debug: var: instance_result ``` 在此文件中,我们首先定义了OpenStack的认证信息,包括认证URL、用户名、密码、项目名称和域名等信息。接着,我们定义了要创建的云主机的名称、镜像、规格、网络、密钥和安全组等信息。最后,我们使用os_server模块创建云主机,并注册输出结果。 3. 运行Ansible任务:运行以下命令来运行Ansible任务: ``` ansible-playbook create_instance.yml ``` 这将调用OpenStack API来创建一个新的云主机。创建完成后,你可以在OpenStack控制台中查看新创建的云主机。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值