django集成ansibe实现自动化

摘要:
动态生成主机列表和相关参数defcreate_admin_domain(admin_node):workpath=BASE_DIR+'/tools/ansible/script'hosts_file=BASE_DIR+'/ttools/ansible/host/'+createhostfile()yml_file=BASE_DIR+'/tools/anssible/yml/'+'create_admin

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

django集成ansibe实现自动化第1张django集成ansibe实现自动化第2张
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]
')
        domain_args = "%s-%s ansible_host=%s ansible_ssh_user=%s ansible_ssh_pass=%s domain_path=%s
" % (
         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("执行失败")
动态生成参数代码
django集成ansibe实现自动化第3张django集成ansibe实现自动化第4张
[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的主机文件的时候 要注意主机别名在不同的主机清单文件中不能重复 否则只会执行第一个主机清单   后面的清单文件不会被执行

django集成ansibe实现自动化第5张django集成ansibe实现自动化第6张
 with open(hosts_file, 'w+') as f:
        f.writelines('[app_jmsmodule_servernode]
')
        data_args="%s-jmsmodule-%s ansible_host=%s ansible_ssh_user=%s ansible_ssh_pass=%s" 
                  " ip=%s port=%s datafile=%s
" %(
            host_ip,generate_random_str(6),host_ip,ansible_ssh_user,ansible_ssh_pass,
            host_ip,port,jms.datafile
        )

#%s-jmsmodule-%s 代表别名字符串  生成的字符串在每个hosts文件中必须是唯一的
View Code

编写yml文件

django集成ansibe实现自动化第7张django集成ansibe实现自动化第8张
---
  - 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
View Code
django集成ansibe实现自动化第9张django集成ansibe实现自动化第10张
---
  - 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
View Code
django集成ansibe实现自动化第11张django集成ansibe实现自动化第12张
---
  - 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}}
View Code
django集成ansibe实现自动化第13张django集成ansibe实现自动化第14张
---
  - 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=0755
      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
django集成ansibe实现自动化第15张django集成ansibe实现自动化第16张
---
  - 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=0755
      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}}
View Code

调试

django集成ansibe实现自动化第17张django集成ansibe实现自动化第18张
(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 *********************************************************************
1 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.3/envs/jade/lib/python3.5/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=10 -o ControlPath=/root/.ansible/cp/471b94e774 ansible_host=10.199.137.5 '/bin/sh -c '"'"'echo ~ && sleep 0'"'"''
<ansible_host=10.199.137.5> (255, b'', b'ssh: Could not resolve hostname ansible_host=10.199.137.5: Name or service not known
')
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
",
    "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=0    changed=0    unreachable=1    failed=0   


(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

The error appears to have been in '/mnt/hgfs/jadehare/tools/ansible/yml/create_admin_domain.yml': line 6, column 7, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:

      file: path={{domain_path}}/ state=directory mode=0755
    - name: copy local war to admin path
      ^ here
"}
    to retry, use: --limit @/mnt/hgfs/jadehare/tools/ansible/yml/create_admin_domain.retry

PLAY RECAP **********************************************************************************************
10.199.137.5               : ok=2    changed=0    unreachable=0    failed=1   
View Code

问题

  1.you must install the sshpass program

django集成ansibe实现自动化第19张django集成ansibe实现自动化第20张
只需要安装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  
View Code

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地址 必须使用别名

django集成ansibe实现自动化第21张django集成ansibe实现自动化第22张
[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判断指定的目录或者文件是否存在

django集成ansibe实现自动化第23张django集成ansibe实现自动化第24张
---
  - 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=0755
      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语法
django集成ansibe实现自动化第25张django集成ansibe实现自动化第26张
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
View Code

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

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

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

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

django集成ansibe实现自动化第27张django集成ansibe实现自动化第28张
    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中被内容写入文件
django集成ansibe实现自动化第29张django集成ansibe实现自动化第30张
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 !> 
脚本读取文件内容
django集成ansibe实现自动化第31张django集成ansibe实现自动化第32张
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保存外键对象

 django集成ansibe实现自动化第33张

ansible查看详细命令执行情况

django集成ansibe实现自动化第34张django集成ansibe实现自动化第35张
(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": 0,
    "start": "2018-10-26 11:16:14.328420",
    "stderr": "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:没有那个文件或目录",
    "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=4    changed=2    unreachable=0    failed=0 
调试选项

免责声明:文章转载自《django集成ansibe实现自动化》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇MySQL中随机生成固定长度字符串的方法json与String的转化下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

初次体验Ubuntu之二

1.需要知道几个快捷键: 锁屏快捷键:Win+L 终端模拟器:Ctrl+Alt+T 打开应用列表:Win+A 显示所有已打开的窗口:Win+W 打开命令运行窗口:Alt+F2 进入tty字符界面:Ctrl+Alt+F1到F6,Ctrl+Alt+F7:切换回图形桌面 2.查询显卡型号 lspci | grep -i vga lspci | grep -...

搜索引擎指令Link和Domain的区别

在SEO中,Link和Domain是经常用到的搜索引擎指令,不同的搜索引擎,link和domain的含义也有所区别。这里详细列出link和 domain在Google、百度、Yahoo、Bing四大搜索引擎中的含义,供各位自行对比区别。   Google   link:查看反向链接,但是所得到的结果不准确   domain:一个关键字,不具备任何含义   ...

Rust 包管理器 Cargo 入门

此文转载自:https://my.oschina.net/u/4701816/blog/4705244 大咖揭秘Java人都栽在了哪?点击免费领取《大厂面试清单》,攻克面试难关~>>> Rust 包管理器 Cargo 入门   了解 Rust 的软件包管理器和构建工具。 -- Gaurav Kamathe(作者) Rust ...

tomcat环境搭建

一、Windows下安装步骤 1、Tomcat下载 (1)Tomcat官网:http://tomcat.apache.org/ (2)点击左侧Download下的对应版本。 注意有zip和exe两种格式的,zip是免安装版的,exe是安装版。同时观察自己的电脑是64位系统还是32位系统。 例如进入:Tomcat 9 版本下载页面,下滑,到core...

Monit:开源服务器监控工具

Monit是一个跨平台的用来监控Unix/linux系统(比如Linux、BSD、OSX、Solaris)的工具。Monit特别易于安装,而且非常轻量级(只有500KB大小),并且不依赖任何第三方程序、插件或者库。 Monit可以监控服务器进程状态、HTTP/TCP状态码、服务器资源变化、文件系统变动等等,根据这些变化,可以设定邮件报警、重启进程或服务。易...

关于linux免密登录的配置及ssh客户端基于私钥文件的登录

操作系统环境: CentOS Linux release 7.7.1908 (Core) 1、首先在linux服务器上,使用ssh-keygen命令生成密钥对文件(一直回车即可,默认使用rsa算法),如下所示       其中还支持的算法有dsa | ecdsa | ed25519 | rsa | rsa1,使用其他算法只需要使用-t选项指定即可    ...