动态生成主机列表和相关参数

def create_admin_domain(admin_node):
workpath = BASE_DIR + '/tools/ansible/script'
hosts_file = BASE_DIR + '/tools/ansible/host/' + createhostfile()
yml_file = BASE_DIR + '/tools/ansible/yml/' + 'create_admin_domain.yml'
domain_path = admin_node.domainpath
app_server_name=admin_node.app_server_name
host_ip = admin_node.asset_ip
ansible_ssh_user = admin_node.username
ansible_ssh_pass = admin_node.password
with open(hosts_file, 'w+') as f:
f.writelines('[app_admin_domain]\n')
domain_args = "%s-%s ansible_host=%s ansible_ssh_user=%s ansible_ssh_pass=%s domain_path=%s\n" % (
host_ip,app_server_name,host_ip, ansible_ssh_user, ansible_ssh_pass, domain_path)
f.writelines(domain_args)
cmd = 'ansible-playbook -i %s %s --extra-vars "workpath=%s"' % (hosts_file, yml_file, workpath)
print(cmd) p = Popen(cmd, stderr=PIPE, stdout=PIPE, shell=True)
data = p.communicate()
if p.returncode == 0:
print("执行成功")
else:
print("执行失败")

动态生成参数代码

[app_admin_domain]
10.199.137.5-itsgl ansible_host=10.199.137.5 ansible_ssh_user=weblogic ansible_ssh_pass=weblogic domain_path=/its/weblogic/user_projects/domains/itsgl_domain

生成结果

动态生成ansible的主机文件的时候 要注意主机别名在不同的主机清单文件中不能重复 否则只会执行第一个主机清单   后面的清单文件不会被执行

 with open(hosts_file, 'w+') as f:
f.writelines('[app_jmsmodule_servernode]\n')
data_args="%s-jmsmodule-%s ansible_host=%s ansible_ssh_user=%s ansible_ssh_pass=%s" \
" ip=%s port=%s datafile=%s\n" %(
host_ip,generate_random_str(6),host_ip,ansible_ssh_user,ansible_ssh_pass,
host_ip,port,jms.datafile
) #%s-jmsmodule-%s 代表别名字符串 生成的字符串在每个hosts文件中必须是唯一的

编写yml文件

---
- hosts: app_admin_domain
tasks:
- name: mkdir app_admin_domain directory
file: path={{domain_path}}/ state=directory mode=0755
- name: copy local war to admin path
copy: src={{local_file}} dest={{domain_path}}/ backup=yes
---
- hosts: app_jmsmodule_servernode
tasks:
- name: copy data file to remote host
copy: src={{datafile}} dest=/its/weblogic/user_projects/domains/wlst/jmsmodule_data
- name: create jmsmodule
shell: sh /its/weblogic/wlserver_10.3/common/bin/wlst.sh /its/weblogic/user_projects/domains/wlst/jmsmodule.py {{ip}} {{port}} /its/weblogic/user_projects/domains/wlst/jmsmodule_data
---
- hosts: app_jms_servernode
tasks:
- name: create jms servers
shell: sh /its/weblogic/wlserver_10.3/common/bin/wlst.sh /its/weblogic/user_projects/domains/wlst/jmsserver.py {{ip}} {{port}} {{jmsname}} {{jmstarget}}
---
- hosts: app_server_domain
tasks:
- name: check {{domain_path}} is exits
shell: ls {{domain_path}}
ignore_errors: True
register: result
- name: mkdir {{domain_path}} directory
file: path={{domain_path}}/ state=directory mode=
when: result|failed
- name: copy mb file to {{domain_path}}
copy: src={{local_file}}/ dest={{domain_path}} backup=yes
- name: excute cpdomain shell
shell: cd {{domain_path}} && bash cpdomain.sh {{appname}} {{apport}}

yml一次执行多条shell

---
- hosts: app_server_domain
tasks:
- name: upload itsmb_domain
copy: src={{local_file}} dest={{domain_parent}}
- name: check {{domain_path}} is exits
shell: ls {{domain_path}}
ignore_errors: True
register: result
- name: mkdir {{domain_path}} directory
file: path={{domain_path}}/ state=directory mode=
when: result|failed
- name: copy mbmodain file to {{domain_path}}
shell: cp -r {{domain_parent}}/itsmb_domain/* {{domain_path}}
- name: excute cpdomain shell
shell: cd {{domain_path}} && bash cpdomain.sh {{appname}} {{apport}}

调试

(jade) [root@node3 jadehare]# ansible-playbook -i /mnt/hgfs/jadehare/tools/ansible/host/host_2018102310040032 /mnt/hgfs/jadehare/tools/ansible/yml/create_admin_domain.yml --extra-vars "workpath=/mnt/hgfs/jadehare/tools/ansible/script" -vvv
No config file found; using defaults PLAYBOOK: create_admin_domain.yml *********************************************************************
plays in /mnt/hgfs/jadehare/tools/ansible/yml/create_admin_domain.yml PLAY [app_admin_domain] ******************************************************************************* TASK [Gathering Facts] ********************************************************************************
Using module file /root/.pyenv/versions/3.5./envs/jade/lib/python3./site-packages/ansible/modules/system/setup.py
<ansible_host=10.199.137.5> ESTABLISH SSH CONNECTION FOR USER: weblogic
<ansible_host=10.199.137.5> SSH: EXEC sshpass -d12 ssh -C -o ControlMaster=auto -o ControlPersist=60s -o User=weblogic -o ConnectTimeout= -o ControlPath=/root/.ansible/cp/471b94e774 ansible_host=10.199.137.5 '/bin/sh -c '"'"'echo ~ && sleep 0'"'"''
<ansible_host=10.199.137.5> (, b'', b'ssh: Could not resolve hostname ansible_host=10.199.137.5: Name or service not known\r\n')
fatal: [ansible_host=10.199.137.5]: UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: ssh: Could not resolve hostname ansible_host=10.199.137.5: Name or service not known\r\n",
"unreachable": true
}
to retry, use: --limit @/mnt/hgfs/jadehare/tools/ansible/yml/create_admin_domain.retry PLAY RECAP ********************************************************************************************
ansible_host=10.199.137.5 : ok= changed= unreachable= failed= (jade) [root@node3 jadehare]# ansible-playbook -i /mnt/hgfs/jadehare/tools/ansible/host/host_2018102310310691 /mnt/hgfs/jadehare/tools/ansible/yml/create_admin_domain.yml --extra-vars "workpath=/mnt/hgfs/jadehare/tools/ansible/script" PLAY [app_admin_domain] ********************************************************************************* TASK [Gathering Facts] **********************************************************************************
ok: [10.199.137.5] TASK [mkdir app_admin_domain directory] *****************************************************************
ok: [10.199.137.5] TASK [copy local war to admin path] *********************************************************************
fatal: [10.199.137.5]: FAILED! => {"failed": true, "msg": "the field 'args' has an invalid value, which appears to include a variable that is undefined. The error was: 'local_file' is undefined\n\nThe error appears to have been in '/mnt/hgfs/jadehare/tools/ansible/yml/create_admin_domain.yml': line 6, column 7, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n file: path={{domain_path}}/ state=directory mode=0755\n - name: copy local war to admin path\n ^ here\n"}
to retry, use: --limit @/mnt/hgfs/jadehare/tools/ansible/yml/create_admin_domain.retry PLAY RECAP **********************************************************************************************
10.199.137.5 : ok= changed= unreachable= failed=

问题

1.you must install the sshpass program

只需要安装sshpass即可,CentOS系统的默认yum源里面并没有这个软件
在ansible主机上安装好即可 $ wget http://sourceforge.net/projects/sshpass/files/latest/download -O sshpass.tar.gz
$ tar -xvf sshpass.tar.gz
$ cd sshpass-1.06
$ ./configure
$ sudo make install

2.Failed to connect to the host via ssh: ssh: Could not resolve hostname ansible_host=10.199.137.5: Name or service not known

在执行ansible或者ansible-playbook命令的时候 不能直接指定IP地址 必须使用别名

[beijing]
1.1.1.1-aa ansible_host=1.1.1.1
1.1.1.2-bb ansible_host=1.1.1.2
1.1.1.3-cc ansible_host=1.1.1.3 [root]# ansible beijing -m ping
1.1.1.1-aa | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
1.1.1.3-bb | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
1.1.1.2-cc | SUCCESS => {
    "changed": false,
    "ping": "pong" 单独使用host里1.1.1.1这个IP会显示没有符合
[root@ansible ansible]# ansible 1.1.1.1 -m ping
 [WARNING]: Could not match supplied host pattern, ignoring: 1.1.1.1 需要使用别名才能正常运行
[root@ansible ansible]# ansible 1.1.1.1-aa -m ping
1.1.1.1-aa | SUCCESS => {
"changed": false,
"ping": "pong"
} 这就要求我们在动态生成主机清单文件的时候必须生成一个别名 否则会出现异常
格式如下 10.199.137.5-itsgl就是一个别名字符串
10.199.137.5-itsgl ansible_host=10.199.137.5

别名解决方案

3.ansible playbook判断指定的目录或者文件是否存在

---
- hosts: app_server_domain
tasks:
- name: check {{domain_path}} is exits
shell: ls {{domain_path}}
ignore_errors: True
register: result
- name: mkdir {{domain_path}} directory
file: path={{domain_path}}/ state=directory mode=
when: result|failed
- name: copy mb file to {{domain_path}}
copy: src={{local_file}}/ dest={{domain_path}} backup=yes
when: result|failed
- name: excute cpdomain shell
shell: sh {{domain_path}}/cpdomain.sh
when: result|failed

yml语法

ansible 的常用模块中没有判定当文件存在或者不存在时执行某个命令

---

- name: judge a file or dir is exits
shell: ls /home/sfy
ignore_errors: True
register: result - shell: echo "file exit"
when: result|succeeded - shell: echo "file not exit"
when: result|failed

django把复杂数据结构参数传递给后台脚本

1.由django把数据内容写入指定的文件

2.调用脚本的时候把文件路径传递给脚本

3.脚本读取指定路径的文件内容

    with open(jms.datafile,'w+') as f:
dict={}
dict["name"]=jms.jmsmodule_name
dict["resources"]=[]
resourcelist=JmsModuleSet.objects.all().filter(jmsmodule=jms.id)
for res in resourcelist:
dict["resources"].append({"resourcename":res.resource_name,"type":res.jmsmoduleset_type})
dict["targets"]=[]
taglist=jms.server_list.all()
for tag in taglist:
dict["targets"].append(tag.app_server_name)
f.write(str(dict))
writelogfile(jms.deploylogfile,"%s 写内容入完毕" %jms.datafile)

views中被内容写入文件

import os

def create_jmsmodule(ip,port,filename):
f = open(filename, "r")
re = f.read()
jsmodule = eval(re)
f.close() wls:/itsgl_domain/edit !> f=open("/wlst/jmsmodule_data","r")
wls:/itsgl_domain/edit !> re=f.read()
wls:/itsgl_domain/edit !> print re
{'resources': [{'resourcename': 'aa1111', 'type': 'queue'}, {'resourcename': 'aaa2', 'type': 'connectFactory'}], 'targets': ['wtjscxnw', 'wtmhnw'], 'name': 'aaaa'}
wls:/itsgl_domain/edit !> obj=eval(re)
wls:/itsgl_domain/edit !> print obj
{'targets': ['wtjscxnw', 'wtmhnw'], 'name': 'aaaa', 'resources': [{'type': 'queue', 'resourcename': 'aa1111'}, {'type': 'connectFactory', 'resourcename': 'aaa2'}]}
wls:/itsgl_domain/edit !>

脚本读取文件内容

def jms_add(request):
apps_id = request.GET.get('mid', '')
jmsobj= JmsModule.objects.filter(id=apps_id)[0]
if request.POST:
apps_form = JmsModuleSetForm(request.POST)
apps_form.instance.jmsmodule=jmsobj

django保存外键对象

ansible查看详细命令执行情况

(jade) [root@node3 jadehare]# ansible-playbook -i /mnt/hgfs/jadehare/tools/ansible/host/host_2018102611079748 /mnt/hgfs/jadehare/tools/ansible/yml/create_server_domain.yml --extra-vars "workpath=/mnt/hgfs/jadehare/tools/ansible/script" -vvv

详细信息如下:
changed: [10.199.137.5-createserver-6FUGa1] => {
"changed": true,
"cmd": "bash /its/weblogic/user_projects/domains/wtdsrwnw_domain/cpdomain.sh wtdsrwnw 8111",
"delta": "0:00:00.038308",
"end": "2018-10-26 11:16:14.366728",
"invocation": {
"module_args": {
"_raw_params": "bash /its/weblogic/user_projects/domains/wtdsrwnw_domain/cpdomain.sh wtdsrwnw 8111",
"_uses_shell": true,
"chdir": null,
"creates": null,
"executable": null,
"removes": null,
"warn": true
}
},
"rc": ,
"start": "2018-10-26 11:16:14.328420",
"stderr": "sed:无法读取 startWebLogic.sh:没有那个文件或目录\nsed:无法读取 bin/startWebLogic.sh:没有那个文件或目录\nsed:无法读取 bin/setDomainEnv.sh:没有那个文件或目录\nsed:无法读取 bin/stopWebLogic.sh:没有那个文件或目录\nsed:无法读取 bin/startManagedWebLogic.sh:没有那个文件或目录\nsed:无法读取 bin/stopManagedWebLogic.sh:没有那个文件或目录\nsed:无法读取 init-info/startscript.xml:没有那个文件或目录\nsed:无法读取 init-info/tokenValue.properties:没有那个文件或目录\nsed:无法读取 config/config.xml:没有那个文件或目录\nsed:无法读取 config/config.xml:没有那个文件或目录\nsed:无法读取 bin/setDomainEnv.sh:没有那个文件或目录",
"stderr_lines": [
"sed:无法读取 startWebLogic.sh:没有那个文件或目录",
"sed:无法读取 bin/startWebLogic.sh:没有那个文件或目录",
"sed:无法读取 bin/setDomainEnv.sh:没有那个文件或目录",
"sed:无法读取 bin/stopWebLogic.sh:没有那个文件或目录",
"sed:无法读取 bin/startManagedWebLogic.sh:没有那个文件或目录",
"sed:无法读取 bin/stopManagedWebLogic.sh:没有那个文件或目录",
"sed:无法读取 init-info/startscript.xml:没有那个文件或目录",
"sed:无法读取 init-info/tokenValue.properties:没有那个文件或目录",
"sed:无法读取 config/config.xml:没有那个文件或目录",
"sed:无法读取 config/config.xml:没有那个文件或目录",
"sed:无法读取 bin/setDomainEnv.sh:没有那个文件或目录"
],
"stdout": "",
"stdout_lines": []
}
META: ran handlers
META: ran handlers PLAY RECAP **********************************************************************************************
10.199.137.5-createserver-6FUGa1 : ok= changed= unreachable= failed=

调试选项

django集成ansibe实现自动化的更多相关文章

  1. Django集成百度富文本编辑器uEditor

    UEditor是由百度web前端研发部开发所见即所得富文本web编辑器,具有轻量,可定制,注重用户体验等特点,开源基于MIT协议,允许自由使用和修改代码. 首先从ueEditor官网下载最新版本的包, ...

  2. django集成celery之callback方式link_error和on_failure

    在使用django集成celery进行了异步调度任务之后,如果想对失败的任务进行跟踪或者告警,怎么做? 这里提供一个亲测的方法. 1.任务callback 假如你想在任务执行失败的时候,打印错误信息并 ...

  3. Django集成OpenLDAP认证

    本文详细介绍了django-auth-ldap的使用方法,参数含义,并提供了示例代码 版本说明 Django==2.2 django-auth-ldap==1.7.0 集成过程 Django集成LDA ...

  4. 接口自动化平台搭建(二),搭建django项目与接口自动化平台的由来与功能特征

    1.创建django项目 a.使用命令创建,安装完django之后就有django-admin命令了,执行命令创建即可,命令如下: django-admin startproject my_djang ...

  5. Django 1.6 最佳实践: django项目的服务器自动化部署(转)

    原文:http://www.weiguda.com/blog/41/ 当我们设置服务器时, 不应该每次都使用ssh登录服务器, 再按照记忆一步一步的配置. 因为这样实在是太容易忘记某些步骤了. 服务器 ...

  6. Django集成celery实战小项目

    上一篇已经介绍了celery的基本知识,本篇以一个小项目为例,详细说明django框架如何集成celery进行开发. 本系列文章的开发环境: window 7 + python2.7 + pychar ...

  7. 使用Docker搭建Jenkins+Docker持续集成环境(自动化构建发布部署)

    本文介绍如何通过Jenkins的docker镜像从零开始构建一个基于docker镜像的持续集成环境,包含自动化构建.发布到仓库\并部署上线. 0. 前置条件 服务器安装docker,并启动docker ...

  8. Django集成Markdown编辑器【附源码】

    专注内容写作的你一定不要错过markdown 简单介绍 markdown是一种标记语言,通过简单的标记语法可以使普通的文本内容具有一定的格式,使用非常简单,学习成本极低 目前各大Blog平台都已支持m ...

  9. Jmeter(二十七)Jmeter Question 之“集成Ant+Jenkins自动化”

    首先介绍一下Ant.Apache Ant,是一个将软件编译.测试.部署等步骤联系在一起加以自动化的一个工具,大多用于Java环境中的软件开发.由Apache软件基金会所提供. 是的.还是Apache家 ...

随机推荐

  1. JavaScript入门学习笔记(一)

    W3cJavaScript教程 JS是JavaScript的缩写,而JSP是Java Server Page的缩写,后者是用于服务器的语言. JavaScript代码写在标签<script> ...

  2. 导出excel 文件

    ---恢复内容开始--- 安装  pip install xlwt ---恢复内容结束---

  3. YII 自封装的批量修改的mysql操作类

    <?php /** * Created by PhpStorm. * User: yufen * Date: 2018/8/31 * Time: 9:54 */ namespace app\ba ...

  4. java图片缩放与裁剪

    import java.awt.Graphics; import java.awt.Image; import java.awt.image.BufferedImage; import java.io ...

  5. Spring Boot+CXF搭建WebService(转)

    概述 最近项目用到在Spring boot下搭建WebService服务,对Java语言下的WebService了解甚少,而今抽个时间查阅资料整理下Spring Boot结合CXF打架WebServi ...

  6. Cordova IOT Lesson003

    bot index.html <!DOCTYPE html> <html> <head> <title>Arduino蓝牙机械昆虫控制器</tit ...

  7. BZOJ-10-1176: [Balkan2007]Mokia-CDQ第二类应用

    思路 :按照操作的时间进行分治,这样转化成了 时间t ,x坐标,y坐标 经典的三维偏序. 最初时间就是递增顺序,无需排序直接进行第二维的分治,类似归并排序处理x坐标,在保证 x有序的情况下进行更新y坐 ...

  8. webpack打包样式代码去重

    一.问题描述 控制台审查样式,同一个样式被导入很多遍,每调用一次@import "common.less";打包时都会多出一份类似的样式代码. 二.问题分析 补上... 三.解决方 ...

  9. BigDecimal 准确的 double , float 计算

    public class ArithUtil { private static final int DEF_DIV_SCALE = 10; private ArithUtil() { } /** * ...

  10. 重温TCP

    先放张TCP头图片 一.TCP三次握手目的: 1.保证源主机确定目的主机在线,并可进行通信 2.让源主机检查它是否正在监听试图去连接的端口 3.允许源主机向接收者发送他的起始序列号,使得两主机可以将数 ...