今日大綱:css
1.用戶建立html
2.前端優化前端
3.用戶編輯python
4.用戶刪除linux
5.ansible api介紹web
新建一個user_create.html的頁面sql
<form class="form-horizontal" id="createForm" action="" method="post">{% csrf_token %} <div class="box-body"> {% for field in form %} <div class="form-group{% if field.errors %} has-error{% endif %}"> <label class="col-sm-2 control-label">{{ field.label }} {% if field.field.required %} <span class="text-red">*</span> {% endif %} </label> <div class="col-sm-9"> {{ field }} </div> <span class="help-block"> {% for error in field.errors %} {{ error }} {% endfor %} {{ field.help_text }} </span> </div> {% endfor %} <div class="box-footer text-center"> <button type="reset" class="btn btn-warning">清空</button> <button id="createBtn" type="button" class="btn btn-info">提交</button> <p class="text-center"><i id='iconWait'></i></p> </div> </div> </form> {% block js %} <script> $("#createBtn").on("click",function () { if ("{{ pk }}" == "0") { url="{% url 'createuser' %}" } else { url="{% url 'edituser' pk %}" } Net.post({ url:url, data:$("#createForm").serialize(), go:{% url 'userlist' %} }) }) </script> {% endblock %}
裏邊有一個"清空"按鈕和"提交按鈕",下邊的id="iconWait"表明轉圈的那個.shell
添加一個add-btn屬性在userlist.html裏邊django
下面,咱們再建立一個py文件user_form.pybootstrap
點表明當前文件夾下,兩個點表明上層文件夾
下面,咱們須要在web文件夾下面新建一個user.py文件
咱們先導入上邊的文件以及文件的類.
須要繼續導入views.py中的render
下面,再寫一個url在urls.py裏邊.
運行:
修改獲得上邊的內容.運行,依然是下圖的樣式的內容.
如今出現一個問題,點擊"添加用戶",彈不出來窗口.
將user_edit放到圖示的位置.
將utils放到如圖表示的位置.
下面是變化的一些文件內容.
urls.py
"""issue URL Configuration The `urlpatterns` list routes URLs to views. For more information please see: https://docs.djangoproject.com/en/1.11/topics/http/urls/ Examples: Function views 1. Add an import: from my_app import views 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') Class-based views 1. Add an import: from other_app.views import Home 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') Including another URLconf 1. Import the include() function: from django.conf.urls import url, include 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) """ from django.conf.urls import url from django.contrib import admin from web.views import * #*表明web中的views全部的 from web.user import * #*表明web中的user全部的 urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^home/', home,name='home'), url(r'^home2/', home2,name='home2'), url(r'^createuser/', create_user,name='createuser'), url(r'^edituser/(\d+)', create_user, name='edituser'), url(r'^login/', login, name='login'), url(r'^logout/', logout_view, name='logout'), url(r'^userlist/', userlist, name='userlist'), ]
home.html
{% extends 'master/base.html' %} {% block body %} <h1>da</h1> <div class="btn btn-sm btn-success create_btn" >建立</div> {% endblock %} {% block js %} <script> {#$("#user").addClass("active")#} {#$("#init").addClass("active")#} $("#menu_issue").addClass("active") $("#update").addClass("active") {#點擊這個按鈕執行下面的函數#} $(".create_btn").on("click",function () { ui.box({ remote:{% url 'home2' %} }) }) </script> {% endblock %}
home2.html
{#<h1>da</h1>#} <form action=""> </form> <div class="btn btn-sm btn-success create-btn" >建立home2</div> {#{% endblock %}#} <div><i class="wait"></i></div> {% block js %} <script> $("#user").addClass("active") $(".create-btn").on("click",function () { Net.post(//發送請求到後端 { "url":{% url 'home2' %}, "data":{"name":"alex","age":9000}, "go":{% url 'home' %}, } ) }) </script> {% endblock %}
login.html
{% load static %} <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>登陸 - 代碼發佈系統</title> <!-- Tell the browser to be responsive to screen width --> <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"> <!-- Bootstrap 3.3.7 --> <link rel="stylesheet" href="{% static 'plugins/bootstrap/css/bootstrap.min.css' %}"> <!-- Font Awesome --> <link rel="stylesheet" href="{% static 'plugins/font-awesome/css/font-awesome.min.css' %}"> <!-- Ionicons --> <link rel="stylesheet" href="{% static 'plugins/Ionicons/css/ionicons.min.css' %}"> <!-- Theme style --> <link rel="stylesheet" href="{% static 'AdminLTE/css/AdminLTE.min.css' %}"> </head> <body class="hold-transition login-page" style="background-image: url({% static 'img/login_bg2.jpg' %}); background-repeat: no-repeat; background-size: 100%; "> <div class="login-box"> <div class="login-logo"> <a href=""><b style="color: #fff;">代碼發佈系統</b></a> </div> <!-- /.login-logo --> <div class="login-box-body"> <p class="login-box-msg">Sign in to start your session</p> <div class="text-red" style="text-align: center;"> </div> <form action="" method="post">{% csrf_token %} <div class="form-group has-feedback"> <input name="domain" type="hidden" class="form-control" placeholder="Domain" value="default"> <input name="email" type="text" class="form-control" placeholder="Username"> <span class="glyphicon glyphicon-envelope form-control-feedback"></span> </div> <div class="form-group has-feedback"> <input name="password" type="password" class="form-control" placeholder="Password"> <span class="glyphicon glyphicon-lock form-control-feedback"></span> </div> <p style="color: red;text-align: center">{{ error_msg }}</p> <div class="form-group has-feedback"> <button type="submit" class="btn btn-primary btn-block btn-flat">Sign In</button> </div> </form> </div> <!-- /.login-box-body --> </div> <!-- /.login-box --> </body> </html>
user_create.html
<form class="form-horizontal" id="createForm" action="" method="post">{% csrf_token %} <div class="box-body"> {% for field in form %} <div class="form-group{% if field.errors %} has-error{% endif %}"> <label class="col-sm-2 control-label">{{ field.label }} {% if field.field.required %} <span class="text-red">*</span> {% endif %} </label> <div class="col-sm-9"> {{ field }} </div> <span class="help-block"> {% for error in field.errors %} {{ error }} {% endfor %} {{ field.help_text }} </span> </div> {% endfor %} <div class="box-footer text-center"> <button type="reset" class="btn btn-warning">清空</button> <button id="createBtn" type="button" class="btn btn-info">提交</button> <p class="text-center"><i id='iconWait'></i></p> </div> </div> </form> {% block js %} <script> {#$("#createBtn").on("click",function () {#} {# if ("{{ pk }}" == "0") {#} {# url="{% url 'createuser ' %}"#} {# } else {#} {# url="{% url 'edituser' pk %}"#} {# }#} Net.post({ url:url, data:$("#createForm").serialize(), go:{% url 'userlist' %} }) // }) </script> {% endblock %}
user_edit.html
<form class="form-horizontal" id="createForm" action="" method="post">{% csrf_token %} <div class="box-body"> {% for field in form %} <div class="form-group{% if field.errors %} has-error{% endif %}"> <label class="col-sm-2 control-label">{{ field.label }} {% if field.field.required %} <span class="text-red">*</span> {% endif %} </label> <div class="col-sm-9"> {{ field }} </div> <span class="help-block"> {% for error in field.errors %} {{ error }} {% endfor %} {{ field.help_text }} </span> </div> {% endfor %} <div class="box-footer text-center"> <button type="reset" class="btn btn-warning">清空</button> <button id="createBtn" type="button" class="btn btn-info">提交</button> <p class="text-center"><i id='iconWait'></i></p> </div> </div> </form> {% block js %} <script> $("#createBtn").on("click",function () { Net.post({ url:{% url 'edituser' pk %}, data:$("#createForm").serialize(), go:{% url 'userlist' %} }) }) </script> {% endblock %}
userlist.html
{% extends 'master/base.html' %} {% block body %} <div class="row"> <div class="col-xs-12"> <div class="box"> <div class="box-header"> {# <h3 class="box-title">Responsive Hover Table</h3>#} {# <button class="btn-sm btn-success create-btn">添加用戶</button>#} <div class="btn btn-sm btn-success add-btn">添加用戶</div> <div class="box-tools pull-right"> <form action="" method="get"> <div class="input-group input-group-sm" style="width: 150px;"> <input type="text" name="table_search" class="form-control pull-right" placeholder="Search"> <div class="input-group-btn"> <button type="submit" class="btn btn-default"><i class="fa fa-search"></i></button> </div> </div> </form> </div> </div> <!-- /.box-header --> <div class="box-body table-responsive no-padding"> <table class="table table-hover"> <tr> <th>序號</th> <th>用戶名</th> <th>用戶郵箱</th> <th>角色</th> <th>部門</th> <th>是否可用</th> <th>建立時間</th> <th>操做</th> </tr> {% for user in users %} <tr> <td>{{ forloop.counter }}</td> <td>{{ user.name }}</td> <td>{{ user.email }}</td> <td>{{ user.get_role_display }}</td> <td>{{ user.department|default:"" }}</td> <td>{{ user.get_is_unable_display }}</td> <td>{{ user.create_time|date:"Y-m-d H:i:s" }}</td> <td> <div class="btn btn-success btn-sm edit-btn" data-url="{% url 'edituser' user.pk %}">編輯 </div> <div class="btn btn-warning btn-sm del-btn" data-url="{% url 'deluser' user.pk %}"> 刪除 </div> </td> </tr> {% endfor %} </table> </div> <!-- /.box-body --> </div> <div> <ul class="pagination pagination-sm no-margin pull-right"> {{ page_html|safe }} </ul> <!-- /.box --> </div> </div> </div> {% endblock %} {% block js %} <script> {#$(".add-btn").on("click", function () {#} {# ui.box({#} {# title: "新增用戶", //上邊顯示的標題#} {# remote:{% url "createuser" %}#} {# })#} $("#user").addClass("active"); $(".add-btn").on("click", function () { ui.box({ title: "新增用戶", remote: {% url 'createuser' %} }) }) $(".edit-btn").on("click", function () { ui.box({ title: "編輯用戶", remote: $(this).attr("data-url") }) }) $(".del-btn").on("click", function () { var url=$(this).attr("data-url"); ui.confirm("你確認要刪除這條記錄嗎?",function () { Net.get({ url:url, reload:true, }) }) }) </script> {% endblock %}
上班通過很長的調試才調整好,如今在服務器上訪問
127.0.0.1:8000/home和
127.0.0.1:8000/userlist
緣由是上邊的views.py
運行:
點擊"添加用戶",獲得下邊的窗體內容.
咱們打開上邊的index.html文件.
獲得上面的form的內容.下面是查看源碼.
思考如何所有都加上form-control?
上邊是循環加上form-control屬性.
全部的input全部類屬性form-control.
咱們須要繼承這個新的NewModelform.
這個時候,再次點擊"添加用戶",出現下面的界面:
注意這個地方設置一下size.
上邊寫size的目的是調整大小,能夠直接寫在源碼中.
下面修改以後的內容.
修改源碼在這裏修改不過來,所以仍是寫在原來的位置,具體緣由未知???
這個時候,咱們再點擊"提交",出不來結果.怎麼處理?
首先在頁面中添加一個點擊事件.
再次刷新頁面,
下面咱們直接獲取,經過serialize方法
在後端打印下獲取到的POST.
運行,點擊上邊的"建立用戶",點擊提交,服務端獲得下面的結果.
獲得上邊的內容,須要都寫上serialize().
serialize() 方法經過序列化表單值,建立 URL 編碼文本字符串。
點擊提交,
服務端依然得不到數據.
由於上邊是id=
因此,下面須要加上#
點擊提交,獲得上邊csrf中間件.
上邊中包括不少值.下邊的後端也拿到了不少的值.
這個時候,咱們添加成功以後,跳轉到userlist頁面.
上邊須要導入的三個包
下面,咱們再寫一個在後端真正提交的一個操做,如何寫呢?
這個時候,再次測試可能會出現上邊的錯誤內容,須要加上userlist函數,進行處理.
咱們獲得上邊的內容,須要添加上路由userlist.
可能出現上邊的錯誤.上邊顯示"這個字段不能爲空"
最後這個地方,咱們須要return返回這個email的.
點擊"提交",
而後返回,首頁.
下面,咱們須要添加一個pull-right類屬性
經過上邊循環出內容
forloop.counter 老是一個表示當前循環的執行次數的整數計數器。 這個計數器是從1開始的,
因此在第一次循環時 forloop.counter 將會被設置爲1。
獲得上邊的內容.
能夠看一下models選擇內容.
下面須要分析上邊的循環出來的寫法?
修改一下userlist.html文件,如上圖所示
上邊的錯誤,是咱們須要加上userlist路徑,以下圖所示
上圖是修改以後的userlist函數.
打開上邊的文件,查看加的位置.
頁碼位置
上圖是傳遞過來的內容.
這個時候,右下角就有頁碼了.
看一下能不能用搜索,搜alex,能夠搜索到下面的內容.
增長和查找已經寫完了,下面開始寫編輯和刪除了.
添加上邊的active.
上邊就是修改模板,
將上邊的這個傳遞的參數.
這個時候,咱們就將上邊的內容成功修改爲了"用戶列表"這個內容.也就是說咱們經過後端傳遞到了前端的位置.
思考用戶名如何傳遞到前端?
上邊是咱們導入的模塊.
session能夠傳遞user用戶名,咱們還有什麼辦法傳遞?除了密碼不能傳遞.
咱們登陸的時候已經拿到了用戶名字.上圖的第28行,如何傳遞到前端?
先寫一個login和logout函數和路由再說.
上邊咱們跳轉到的是userlist界面
前端怎麼寫?
登陸以後沒有出現用戶名???
想要傳遞參數,必須放在session裏邊才能傳遞.
上邊的31行不能夠,咱們用下圖所示的試一下,看一下能不能所有傳遞過去?
獲得上圖這樣,不是一個序列化的對象.查詢出來的是queryset,如何變成可序列化的對象?
又出現上邊的問題.
下面,來一個新的方法,導入下面的這個模塊
再次運行.
咱們看到上邊的內容成功登錄.名字出來了,
還有一種方法是重寫中間件,中間件有5個方法,重寫的是哪一個?
在這裏,咱們就先將上邊這條語句註釋掉.
再在auth.py裏邊寫一個類.
上邊是重寫的類.以及其中的方法,上邊是用法.其中打印一下response
下面,咱們須要在settings.py中加上一個內容
用上邊的方法,咱們就不能用render了.下圖中的第13行從render,替換成TemplateResponse.
刷新上邊的這個界面.服務端獲得這個數據,也就是咱們打印出服務端的auth中的response
TemplateResponse在什麼地方用?在模板渲染的時候才能用.
重寫這個方法,再次打印另外一個內容.
再次刷新一下,
咱們獲得下面的值.
咱們須要更新一下這個內容.
咱們將上邊的內容,都修改爲user.
爲了避免重複,咱們仍是須要從新修改會account
修改後,咱們獲得上邊的內容.注意上邊要加逗號,只有登陸以後纔會有account.
左上角咱們須要修改用戶名.
在上圖中修改爲user.name
這樣就成功修改完成了.
一種是寫在session中,另外一種是重寫中間件.
下面,再說一下編輯
上邊咱們加上了data-url
修改用戶如何寫?
下面先單獨寫一個編輯用戶的內容.
user_edit.html就是由user_create.html修改過來的
修改的位置,
上邊是咱們傳遞過來的pk值.
可能出現沒有edituser這個路徑.
edituser這裏須要傳遞一個pk值
前端多個空格可能就會出錯.
這個時候,點擊編輯,能夠彈出,對應的窗體.
attrs能夠拿到值.也能夠加上必定的屬性.好比加上disabled屬性.
後邊什麼都不加能夠拿到這個值.
$this表示的是當前點擊的對象.
下面,咱們合併一下這個建立和編輯.
js裏邊不能作數據判斷,一切數值計算都須要轉換成字符串
服務端出現一個錯誤,
由於此時要有一個視圖函數須要都修改爲create_user.
注意,uswer.pk是必定獲取不到的
上圖中加上引號,url
一直報錯出不來前端的彈窗裏邊的內容,緣由是多寫了一個空格.
出現上圖的沒有定義,問題是什麼?同名函數,共用一個函數和共用一個界面html
編輯,不改上邊的代碼,出現上邊的問題"郵箱已存在",應該如何操做?
緣由是什麼?form沒有寫對.
下面修改form
此時,咱們再次提交錯誤重複的信息,會出現上邊的內容.
上圖顯示,咱們點擊"編輯",不修改,"提交",報上邊的錯誤
上圖是原來的樣子,下面是修改以後的樣子.
添加相同的郵箱可能存在錯誤.如何解決呢?
上圖中,郵箱已存在,咱們須要進一步操做.上邊這個已經成功解決了問題.
最開始,咱們是按照上圖的寫法,寫的.
若是一開始查找的一條數據,下圖的郵箱,而且修改的數據和庫裏邊查找的數據是同樣的,表明這條數據郵箱沒有改變.因此return回去.
咱們先去表裏查找這個郵箱.若是查不到,證實是一個沒有的數據.
若是查找到一個值和目前的傳遞進來的數據是不一致的.須要告訴,可能這裏邊是有的.
else將全部的階段了,因此下面的三行數據都是不須要的了.具體見下圖.
user.count()==1表明查找到的是本身的那條記錄.而且傳遞過來的值是不同的
對instance的理解,
咱們獲得上邊的instance不是None,所以self.instance=instance.
#17行,查到了1條記錄,而且郵箱沒有改變,
下面是刪除的內容.
上圖是刪除,界面的寫法,看一下源碼中的寫法:
刷新瀏覽器界面,點擊"刪除"
上邊是後端傳遞的信息
上圖是url中的刪除路由.
當咱們點擊"確認"的時候,this就至關於上邊的彈窗.
所以這種寫法是錯誤的,咱們須要按照下圖的寫法,將含有this的這行代碼寫在下圖的位置.
這個時候,就能夠成功刪除了,刪除的同時須要刷新一下也就是reload:true
注意,不能將登錄的用戶刪除,不然會跳轉到登陸界面.
下面,咱們須要在linux環境中安裝開發環境.
yum install -y python36-pip python36-devel #安裝成功 yum install -y openssl-devel #安裝成功 #下面這個安裝失敗,緣由是須要安裝成功ansible才能安裝下面的成功 pip3 install ansible
(1)安裝python3
#第一步,走到opt目錄下 cd /opt #第二步.解決python編譯安裝所需的軟件依賴 yum install gcc patch libffi-devel python-devel zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel -y #第三步:下載python3源碼包 wget https://www.python.org/ftp/python/3.6.7/Python-3.6.7.tar.xz ls #看下是否有壓縮包 xz -d Python-3.6.7.tar.xz tar -xf Python-3.6.7.tar #解壓縮,生成一個python源碼文件夾 ls #第四步:進入python源碼文件夾 cd Python-3.6.7 ls #查看一下文件夾內的內容 #第五步:進行編譯安裝,編譯三部曲,源碼編譯的過程,下一步就是這些東西 (1)第一曲 ./configure --prefix=/opt/python36/ #當前文件夾下的configure #--prefix 參數解釋:指定python36安裝的位置,綠色表明可執行 #上邊這條命令必須進入文件夾 Python-3.6.7 執行 #這樣就會自動釋放一些編譯文件 #只要不出現error(錯誤信息)就能夠了,出現warning(報警信息)不重要 #這個時候就會多了一些makefile文件 ls (2)第二曲 make (3)第三曲,此時就開始安裝python3軟件 make install #上邊兩部能夠合成一步 #make && make install #表明執行完make就執行後邊的make install命令 #上邊安裝速度可能會慢一些 #第六步.進入python36 #安裝目錄,檢查bin目錄 python #按Tab鍵,python3沒有出來,緣由是環境變量沒有配置 cd /opt/ ls #咱們看到最終安裝完成的包python36 cd python36/ ls #咱們對bin目錄有興趣,須要進入 cd bin ls #第七步,配置python3的環境變量 PATH #1.取出當前的path變量(環境變量) echo $PATH #取出當前的環境變量 #/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin pwd #查看當前目錄 #2.填寫python3的bin目錄到PATH中 PATH="/opt/python36/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin" #3.講環境變量,寫入到全局配置文件/etc/profile vim /etc/profile i #插入 o #走到下一行 4.寫入以下代碼,在最底行寫入以下配置 PATH="/opt/python36/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin" 5.讀取配置文件,加載變量生效 source /etc/profile python #按Tab鍵,查看python內容 python3 #進入python3交互界面
(2)安裝django,運行django
yum install tree
#1.安裝django模塊 pip3 install -i https://pypi.douban.com/simple django==1.11.18 #ctrl+C中斷安裝 #2.升級pip pip3 install --upgrade pip pip3 list #看一下pip3安裝了什麼 #3.經過命令建立django項目 #django-admin startproject crm #django-admin startapp app01 cd /opt/ ls django-admin startproject crm ls cd crm ls python3 manage.py runserver #直接這樣寫是有問題的 #中斷 python3 manage.py runserver 0.0.0.0:8000 #依然存在問題 #訪問192.168.34.133:8000這個網址,能夠訪問,可是這裏訪問不成功,緣由是防火牆 iptables -L #查看防火牆的一些規則 4.關閉防火牆 iptables -F 再次運行下面的命令: python3 manage.py runserver 0.0.0.0:8000#依然存在問題可能 python3 manage.py runserver 192.168.34.133:9999 #不行再試一下這個命令 #訪問地址 192.168.34.133:9999 #瀏覽器中報下面的錯誤信息 #Invalid HTTP_HOST header: '192.168.34.133:9999'. You may need to #add '192.168.34.133' to ALLOWED_HOSTS. #下面,咱們須要中斷代碼 ls tree cd .. #回到上一級目錄回到 /opt目錄下面 ls tree crm #看一下crm的目錄結構 cd crm/ vim crm/settings.py /ALLOW #快速找到,修改內容 ALLOWED_HOSTS = ["*"] python3 manage.py runserver 192.168.34.133:9999 #在crm目錄下面,再次啓動 #訪問192.168.34.133:9999能夠成功訪問了. 192.168.34.133:9999 192.168.34.133:9999/admin #能夠正常使用了.
需求,加上hello 視圖"來了老弟!"
vi crm/urls.py yyp #命令是複製一行,退出,建立app01 #建立一個app01 django-admin startapp app01 ls tree #當前在crm目錄下面 vi crm/urls.py #再次打開這個文件 from django.conf.urls import url from django.contrib import admin from app01 import views #修改的位置1 urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^hello/', views.hello), #修改的位置2 ]
ls #在crm下面 vi app01/views.py 用空格鍵解決,
from django.shortcuts import render,HttpResponse #添加後邊的HttpResponse def hello(request): #添加函數 return HttpResponse("來了老弟") Create your views here.
vi crm/settings.py #在settings.py中導入app01 INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app01', #修改的位置 ] #linux端口範圍0-65536.5000-10000 ls python3 manage.py runserver 192.168.34.133:8000 #訪問下面的地址 http://192.168.34.133:8000/ #報錯,也就是首頁沒有東西.大黃頁,咱們在公網上不能讓別人知道咱們的視圖,須要隱藏視圖 #思路:將setting.py裏邊的debug由true修改爲false vi crm/settings.py DEBUG = False #目的,不能將視圖函數暴露給別人 #再次運行下面的命令 python3 manage.py runserver 192.168.34.133:8000 #訪問瀏覽器地址 192.168.34.133:8000 #這個時候就不會暴露了 http://192.168.34.133:8000/hello/ #這個時候能夠看到內容了
安裝成功django以後,咱們再次安裝一遍ansible
pip3 install ansible
#安裝成功
這樣,咱們就將ansible模塊和python3以及django安裝成功了.
上圖是centos7的寫法,下圖是centos6的寫法
網關被.1是window機器佔用,所以咱們須要用,2
也能夠在下圖的網關設置中加上DNS.這樣就能夠加上一個靜態IP地址了.
最後,咱們仍是隻須要關注下面的三個信息.
下圖是我本身的IP修改內容
下面看一下ansible的源碼,
上邊是AdHoc函數.
ansible -m 模塊名 -a 參數
對應的是playbook函數
咱們先執行一個命令
上邊組織了一個"主機數據"
上邊咱們能夠看到"ok","failed","unreachable","skipped",四個頂級的字典,ok,失敗,不可達,跳過.
ok中,第一個ip地址,stdout表示輸出,/root,pwd表示執行的命令
啓動上邊的兩臺機器,上圖,在第1和第2條命令中間執行
第一條表示修改數據,獲得下面的結果
若是修改爲上圖中,一個沒有的命令"pd",
這個時候,就直接出來在failed裏邊了.
上圖第二行的倒數部分顯示,命令沒有找到.
咱們再寫一臺找不到主機的.
再次運行,看一下區別是什麼?
一種是命令錯誤,另外一種是端口不可達是找不到主機.
hostnane的做用是什麼?
下面咱們改爲104
hostname表明的是key值.
上圖是咱們傳遞值到這個函數裏邊.
103行,判斷是否是一個list,斷言.
loader_class()
咱們看到下圖導入的這個包,ansible自帶的一個方法,數據加載
這個時候又運行了下面的方法,
看一下這個變量管理類
而後,就初始化了下圖的函數.
而後執行,下面的方法
循環主機數據,在列表中.
下面,就等於上圖中的Host,點擊77行的Host,咱們獲得下面的內容,
傳遞過來host_data,host_data循環這個列表中的每個值.
端口默認是22,若是是22能夠默認不寫,具體見下圖,
添加密碼和祕鑰文件.
若是沒有vars,默認是一個空的字典,items(),而後組合了一下
playbook有一個變量的說法,
ansible自動2.0以後adhoc也會轉換到playbook裏邊執行.
下圖,是hostname出來的值104
沒有組的話,咱們須要在組的基礎上添加信息.
注意ansible中有一個"組"的概念.
以前都是在init_host文件裏邊改的,如今咱們只須要將IP地址組成一個虛擬的組.
而後將虛擬的組,給了CommandRunner,這個類繼承自AdHocRunner這個類
再次看一下,AdHocRunner定義的內容,
上圖就是咱們自定義的回調函數.
21行表示的是命名元組,一系列參數的指定.forks表示的是併發
ansible -h #查看幫助信息,默認是5個,這裏設置的是10個.
咱們將拿到的值進行處理.執行init方法
也就是說,執行上圖的C都滿滿的Runner,也就是執行init方法.也就是下圖函數的init方法
先執行init,再執行CommandRunner,而後,咱們再執行下圖的函數
函數傳遞了三個參數,下面開始作判斷,若是module有,而且再也不選擇的範圍內,報錯.若是不傳,默認是module="shell"
也就是從test_runner.py傳遞過來的內容.
也就是說,上圖的hosts,等於實例化的inventory,
動態生成上圖的invent,而後獲得全部的inventory
上圖的hosts和name等於的值.而後再運行上圖中的run,也就是父類的內容
也就是下面,咱們傳遞進來的值,
上圖是獲取系統的變量,
第一個if語句,若是不是pattern,咱們返回一個空的 {}
再看一下下圖的信息
上圖的callback信息.
看一下上圖的tasks,tasks作的是下圖的信息.
獲得上圖的信息.
咱們將值通通加載到clean_tasks列表中,而後返回回去
下圖是組裝的一個字典
上邊傳遞的值進行對應
獲得上圖的play,
上圖是定義的回調函數以及password,上邊是組成的組tqm
運行上圖的位置
異常中什麼都沒有寫,
這就是ansible走AdHoc走的一系列命令.
知道怎麼用就好了,這只是官網上的一部分,修改了一點點
AdHoc和下面的command差很少
最後也是組成了上邊的內容.
一樣,運行了下面的run方法.
上邊打開的文件,以及內容
上邊的stdout對應的值是root,,命令是whoami
獲得上邊的內容.
上圖是playbook組成一個列表,一樣動態生成一個crm,playbookrunner
而後運行,下面的run方法,傳遞的是playbook_path參數,將path變成列表將值放在括號裏邊
而後,咱們運行了下面的run().
獲得上邊的內容.也就是下面的vi a.yml
寫的是下面的內容.
執行下面的yml文件.
運行一下報錯,
再次打開,修改
獲得下面的內容.
上邊顯示的錯誤是極其鏈接不上.上邊是機器的狀態是OK的,運行playbook,下面的一行顯示的信息.
下面,咱們拿到這個信息就能夠進行判斷了.
下面,咱們再次寫一個正常的主機和ip進行處理.
這個時候,咱們再次運行.
上班的Gathering Facts, playbook的第一步是收集用戶的信息,下圖白色部分是一個大的列表.
tasks第一個是手機信息,createuser
咱們看到了下圖這個主機被建立了.
一樣,咱們能夠傳遞變量,修改上邊的這個playbook文件
傳遞下面的數據.
這個時候,咱們再次執行
獲得下圖的name101
再看一下101IP中是否成功完成了建立帳戶alex101了.
注意,這個playbook的hosts須要協程all,須要哪一個用就能夠了,若是寫成單個的機器須要正則匹配很麻煩,這裏很少說.
用哪臺機器,傳遞哪臺機器就能夠了.
獲得上邊的內容.
點擊"Yes"
點擊上圖位置
咱們獲得了後端linux的目錄,能夠查看
點擊右下角的OK
OK,