Anisble Playbook

文章目錄

  • 一、Playbook簡介
    • 三種常見的數據格式
    • Playbook特點
    • YAML語言介紹
  • 二、Playbook核心組件
    • host組件
    • remote_user組件
    • task列表和action組件
    • gather_facts
    • Handlers notify
    • ignore_errors
  • 三、playbook命令
    • playbook命令
    • tags 標簽
  • 四、Playbook中的變量
    • setup模塊中的變量
    • Playbook命令行中定義變量
    • 定義變量文件
    • 直接在playbook文件中建立變量
    • 使用獨立的變量文件
    • 針對主機和主機組的變量
  • 四、template模版技術
    • Jinja2簡介
    • template
    • template中使用流程控制for和 if
  • 五、循環迭代
    • 迭代with_items(loop)
    • 迭代嵌套子變量
    • playbook中使用when
  • 六、角色
    • 建立role


一、Playbook簡介

在Ansible中,playbook就是一個包含了要在遠程主機上執行的一系列任務的文件。通過playbook,可以實現自動化配置、部署和管理遠程主機的操作。它可以定義任務的順序、條件、并發執行等,是Ansible自動化工具中的核心組件之一。通過編寫和執行playbook,可以實現系統管理的自動化和規范化。

三種常見的數據格式

  • XML:Extensible Markup Language,可擴展標記語言,可用于數據交換和配置
  • JSON:JavaScript Object Notation, JavaScript 對象表記法,主要用來數據交換或配置,不支持注釋
  • YAML:YAML Ain’t Markup Language YAML 不是一種標記語言, 主要用來配置,大小寫敏感,不支持tab。
    注意:ansible使用的YAML語言。
    由于YAML語言不支持tab所以我們設置一些vim編輯器的選項
set ai 開啟自動縮進
set ts=2 設置Tab鍵的寬度為2個空格

在這里插入圖片描述

Playbook特點

在這里插入圖片描述

  • playbook 劇本是由一個或多個"play"組成的列表。
  • play的主要功能在于將預定義的一組主機,裝扮成事先通過ansible中的task定義好的角色。Task實際是調用ansible的一個module,將多個play組織在一個playbook中,即可以讓它們聯合起來,按事先編排的機制執行預定義的動作。
  • Playbook 文件是采用YAML語言編寫的。

YAML語言介紹

YAML:YAML Ain’t Markup Language,即YAML不是標記語言。不過,在開發的這種語言時,YAML的意思其實是:“Yet Another Markup Language”(仍是一種標記語言)

YAML是一個可讀性高的用來表達資料序列的格式。YAML參考了其他多種語言,包括:XML、C語言、Python、Perl以及電子郵件格式RFC2822等。Clark Evans在2001年在首次發表了這種語言,另外Ingy d?t Net與Oren Ben-Kiki也是這語言的共同設計者,目前很多最新的軟件比較流行采用此格式的文件存放配置信息,如:ubuntu,anisble,docker,kubernetes等。

YAML官方網站:http://www.yaml.organsible 官網: https://docs.ansible.com/ansible/latest/reference_appendices/YAMLSyntax.html

YAML語言特性

  • YAML的可讀性好
  • YAML和腳本語言的交互性好
  • YAML使用實現語言的數據類型
  • YAML有一個一致的信息模型
  • YAML易于實現
  • YAML可以基于流來處理
  • YAML表達能力強,擴展性好

YAML語法簡介

  • 在單一文件第一行,用連續三個連字號"-" 開始,還有選擇性的連續三個點號( … )用來表示文件的結尾
  • 次行開始正常寫Playbook的內容,一般建議寫明該Playbook的功能
  • 使用#號注釋代碼
  • 縮進必須是統一的,不能空格和tab混用
  • 縮進的級別也必須是一致的,同樣的縮進代表同樣的級別,程序判別配置的級別是通過縮進結合換行來實現的
  • YAML文件內容是區別大小寫的,key/value的值均需大小寫敏感
  • 多個key/value可同行寫也可換行寫,同行使用,分隔
  • key后面冒號要加一個空格 比如: key: value
  • value可是個字符串,也可是另一個列表
  • YAML文件擴展名通常為yml或yaml

支持的數據類型

  • YAML 支持以下常用幾種數據類型:
  • 標量:單個的、不可再分的值
  • 對象:鍵值對的集合,又稱為映射(mapping)/ 哈希(hashes) / 字典(dictionary)
  • 數組:一組按次序排列的值,又稱為序列(sequence) / 列表(list)

二、Playbook核心組件

一個playbook 中由多個組件組成,其中所用到的常見組件類型如下:

  • Hosts 執行的遠程主機列表
  • Tasks 任務集,由多個task的元素組成的列表實現,每個task是一個字典,一個完整的代碼塊功能需最少元素需包括 name 和 task,一個name只能包括一個task。
  • Variables 內置變量或自定義變量在playbook中調用。
  • Templates 模板,可替換模板文件中的變量并實現一些簡單邏輯的文件。
  • Handlers 和 notify 結合使用,由特定條件觸發的操作,滿足條件方才執行,否則不執行。
  • tags 標簽 指定某條任務執行,用于選擇運行playbook中的部分代碼。ansible具有冪等性,因此會自動跳過沒有變化的部分,即便如此,有些代碼為測試其確實沒有發生變化的時間依然會非常地長。此時,如果確信其沒有變化,就可以通過tags跳過此些代碼片斷。

注意:查看模塊用法 用ansible-doc 加上 模塊名 可以查看模塊的使用方法和例子
在這里插入圖片描述

host組件

Hosts:playbook中每一個play的目的都是為了讓特定主機以某個指定的用戶身份執行任務。hosts用于指定要執行指定任務的主機,需要事先定義在主機清單中。
在這里插入圖片描述
host文件的例子

Websrvs:dbsrvs	#或者,兩個組的并集W
ebsrvs:&dbsrvs	#與,兩個組的交集
webservers:!dbsrvs	#在websrvs組,但不在dbsrvs組
- hosts: websrvs:appsrvs

remote_user組件

remote_user: 可用于Host和task中。也可以通過指定其通過sudo的方式在遠程主機上執行任務,其可用于play全局或某任務;此外,甚至可以在sudo時使用sudo_user指定sudo時切換的用戶。

- hosts: websrvs remote_user: zhangsan                    tasks:- name: test connection ping:remote_user: wangsudo: yes#默認sudo為rootsudo_user:wang#sudo為wang

task列表和action組件

play的主體部分是task list,task list中有一個或多個task,各個task 按次序逐個在hosts中指定的所有主機上執行,即在所有主機上完成第一個task后,再開始第二個task。

task的目的是使用指定的參數執行模塊,而在模塊參數中可以使用變量。模塊執行是冪等的,這意味著多次執行是安全的,因為其結果均一致每個task都應該有其name,用于playbook的執行結果輸出,建議其內容能清晰地描述任務執行步驟。如果未提供name,則action的結果將用于輸出。

寫yml時,一定要注意對齊!
set ai 開啟自動縮進
set ts=2 設置Tab鍵的寬度為2個空格

在這里插入圖片描述

在這里插入圖片描述
在這里插入圖片描述

gather_facts

作用:收集信息
表示不收集信息,但是使用變量是需要收集。
默認是收集信息的。

---
- hosts: webremote_user: rootgather_facts: notasks:-name: install httpd yum: name=httpd-name: start httpdservice: name=httpd state=started enabled=yes

Handlers notify

Handlers本質是task list ,類似于MySQL中的觸發器觸發的行為,其中的task與前述的task并沒有本質上的不同,主要用于當關注的資源發生變化時,才會采取一定的操作。而Notify對應的action可用于在每個play的最后被觸發,這樣可避免多次有改變發生時每次都執行指定的操作,僅在所有的變化發生完成后一次性地執行指定操作。在notify中列出的操作稱為handler,也即notify中調用handler中定義的操作。

注意:

  • 如果多個task通知了相同的handlers, 此handlers僅會在所有tasks結束后運行一 次。
  • 只有notify對應的task發生改變了才會通知handlers,沒有改變則不會觸發handlers 。
  • handlers 是在所有前面的tasks都成功執行才會執行,如果前面任何一個task失敗,會導致handler跳過執行,可以使用force_handlers: yes 強制執行handler。
---- hosts: webgather_facts: notasks:- name: add groupgroup: name=nginx state=present- name: add useruser: name=nginx state=present group=nginx- name: install epelyum: name=epel-release.noarch state=present- name: install nginxyum: name=nginx state=present- name: config filecopy: src=/data/nginx.conf dest=/etc/nginxnotify:- restart nginxhandlers:- name: restart nginxservice: name=nginx state=restarted
~

當配置文件發生改動時,才會觸發handlers,并重新啟動nginx。注意notify和handlers是成對出現的。notify下面的名字和handlers的名字要一致。

在這里插入圖片描述

ignore_errors

如果一個task出錯,默認將不會繼續執行后續的其他task。利用ignore_errors:yes可以忽略此task的錯誤,繼續向下執行playbook其它的task。

playbook是默認順序執行的,當一個出錯之后,便不會執行下一個,所以對于那些不重要的命令,如果執行不成功,即可忽略。

---
- hosts: websrvstasks:- name: errorcommand: /bin/falseignore_errors: yes- name: continuecommand: wall continue

三、playbook命令

playbook命令

命令含義
–syntax-check語法檢查,可縮寫成–syntax, 相當于bash -n
-C --check模擬執行,只檢測可能會發生的改變,但不真正執行操作,dry run
–list-hosts列出tag
–list-tasks列出task
–limit只針對主機列表中的特定主機執行 --limit 主機地址
-i INVENTORY指定主機清單文件,通常一個項對應一個主機清單文件
–start-at-task START_AT_TASK從指定task開始執行,而非從頭開始,START_AT_TASK為任務的name
-v -vv -vvv顯示過程

tags 標簽

在playbook文件中,可以利用tags組件,為特定 task 指定標簽,當在執行playbook時,可以只執行特定tags的task,而非整個playbook文件。
tag就相當于標簽。

vim httpd.yml
---
# tags example
- hosts: websrvsremote_user: rootgather_facts: notasks:- name: Install httpdyum: name=httpd state=present- name: Install configure filecopy: src=files/httpd.conf dest=/etc/httpd/conf/tags: conf- name: start httpd servicetags: serviceservice: name=httpd state=started enabled=yes
ansible-playbook –t conf,service httpd.yml

四、Playbook中的變量

變量名:僅僅能由字母、數字和下劃線組成,且只能以字母開頭。
變量調用方式:
通過{{ variable_name }} 調用變量,且變量名前后建議加空格,有時用"{{ variable_name }}"才生效。
變量來源:

  1. ansible 的 setup facts 遠程主機的所有變量都可直接調用

  2. 通過命令行指定變量,優先級最高

setup模塊中的變量

本模塊自動在playbook調用,不要用ansible命令調用,生成的系統狀態信息, 并存放在facts變量中。詳情可以用ansible-doc setup查詢。facts 包括的信息很多,如: 主機名,IP,CPU,內存,網卡等。

facts 變量的實際使用場景案例:

  • 通過facts變量獲取被控端CPU的個數信息,從而生成不同的Nginx配置文件。
  • 通過facts變量獲取被控端內存大小信息,從而生成不同的memcached的配置文件。
  • 通過facts變量獲取被控端主機名稱信息,從而生成不同的Zabbix配置文件。

利用setup 模塊中的變量生成日志文件

---
- hosts:  webremote_user: rootgather_facts: yestasks:- name: create log filefile: name=/data/{{ ansible_nodename }}.log state=touch owner=zhangsan mode=600

Playbook命令行中定義變量

"{ { 變量名 } } "
使用ansible-playbook -e 選項,在使用命令時定義變量。
在這里插入圖片描述

- hosts: webgather_facts: notasks:- name: create  useruser: name={{ myname }}   system=yes  create_home=noansible-playbook   -e  myname=cxk  -e myname1=wyf  playbook

定義變量文件

在這里插入圖片描述
在這里插入圖片描述

- hosts: webgather_facts: notasks:- name: install  {{pkname1}}yum:  name={{pkname1}}  state=present- name: install {{pkname2}}yum: name={{pkname2}}  state=presentansible-playbook -e "@var"  test1.yml 
#  @代表文件    var 即是文件名   

注意:
1.var文件要在同一文件夾中
2.定義變量時

tasks:- name: install  "{{pkname1}}"
或者
tasks:- name: "install  {{pkname1}}"

直接在playbook文件中建立變量

方法是:使用vars組件。

---
- hosts: webvars:username: test1groupname: group1tasks:- name: create groupgroup: name={{ groupname }}  state=present- name: create useruser: name={{ username }} state=present

變量之間相互調用

---
- hosts: websvars: suffix: "txt"file: "{{ ansible_nodename }}.{{suffix}}"tasks:- name: test varfile: path="/data/{{file}}" state=touch

使用獨立的變量文件

可以在一個獨立的playbook文件中定義變量,在另一個playbook文件中引用變量文件中的變量,比playbook中定義的變量優化級高。

先寫一個變量文件

vim vars.yml
---
# variables file
package_name: mariadb-server
service_name: mariadb

然后調用這個文件

vim var5.yml
---
#install package and start service
- hosts: dbsrvsremote_user: rootvars_files:- vars.ymltasks:- name: install packageyum: name={{ package_name }}tags: install- name: start serviceservice: name={{ service_name }} state=started enabled=yes

針對主機和主機組的變量

在inventory主機清單文件中指定的主機定義變量以便于在playbook中使用。

在hosts文件中修改,并且只針對單個主機。

[websrvs]
www1.cxk.com http_port=80   maxRequestsPerChild=808
www2.cxk.com http_port=8080 maxRequestsPerChild=909
#只是針對單個主機

例子:

vim /etc/ansible/hosts   
[web]
192.168.232.20  hname=www1  domain=accp.com
192.168.232.30  hname=www2  domain=cxk.com[web:vars]
mark='-'ansible web -m hostname  -a 'name={{ hname }}{{ mark }}{{ domain }}' 

在這里插入圖片描述
這些變量只針對單個主機有效。

四、template模版技術

Ansible模板技術是Ansible自動化工具中的一個重要特性,它使用Jinja2模板引擎來生成動態配置文件。

Jinja2簡介

Jinja2 是一個現代的,設計者友好的,仿照 Django 模板的 Python 模板語言。 它速度快,被廣泛使用,并且提供了可選的沙箱模板執行環境保證安全:

特性:

  • 沙箱中執行
  • 強大的 HTML 自動轉義系統保護系統免受 XSS
  • 模板繼承
  • 及時編譯最優的 python 代碼
  • 可選提前編譯模板的時間
  • 易于調試。異常的行數直接指向模板中的對應行。
  • 可配置的語法
http://docs.jinkan.org/docs/jinja2/
https://www.w3cschool.cn/yshfid/
官方中文文檔

template

template功能:可以根據和參考模塊文件,動態生成相類似的配置文件 template文件必須存放于templates目錄下,且命名為 .j2 結尾 yaml/yml 文件需和templates目錄平級。

是這樣一個目錄:
在這里插入圖片描述

在這里插入圖片描述
在這里插入圖片描述
但是用template模塊式,它會用模版生成的內容完全替換目標文件。 請特別注意。

template中使用流程控制for和 if

for循環
例子生成虛擬主機。

準備j2文件,注意for循環有其固定的寫法。

vim templates/for1.j2 
#  準備  j2 文件{% for vhost in nginx_vhosts %}
server {listen {{ vhost }}
}
{% endfor %}

這邊定義了一個變量vhost。

準備yml文件

---
- hosts: webvars:nginx_vhosts:- 81- 82- 83tasks:- name: template configtemplate: src=for1.j2    dest=/data/test.conf

這樣即可完成。

五、循環迭代

需要執行重復性的任務時,需要用迭代機制。

迭代with_items(loop)

對迭代項的引用,固定內置變量名為"item";要在task中使用with_items給定要迭代的元素列表;注意: ansible2.5版本后,可以用loop代替with_items。

---
- hosts: webgather_facts: notasks:- name: create useruser: name={{ item }}  state=present groups=wheelwith_items:- testuser1- testuser2- testuser3
**注意= 號后不要空格**上面語句的功能等同于下面的語句- name: add several users  user: name=testuser1 state=present groups=wheel- name: add several usersuser: name=testuser2 state=present groups=wheel- name: add several usersuser: name=testuser3 state=present groups=wheel

迭代嵌套子變量

在迭代中,可以嵌套自變量,用來提高工作效率。
例子:
批量建立用戶

---
- hosts: webgather_facts: notasks:- name: create groupgroup: name={{ item }} state=presentwith_items:- nginx- mysql- tomcat- name: create useruser: name={{ item.user }} group={{ item.group }} uid={{ item.uid }} state=presentwith_items:- { user: 'nginx', group: 'nginx' , uid: '80' }- { user: 'mysql', group: 'mysql' , uid: '3306' }- { user: 'tomcat', group: 'tomcat' , uid: '8080' }

playbook中使用when

when語句可以實現條件測試。如果需要根據變量、facts或此前任務的執行結果來做為某task執行與否的前提時要用到條件測試,通過在task后添加when子句即可使用條件測試,jinja2的語法格式。

---
- hosts: webtasks:- name: install sl "{{ ansible_os_family }}"yum:  name=slwhen: ansible_os_family == "RedHat"- name: install   sl   "{{ ansible_os_family }}"apt: name=slwhen: ansible_os_family == "Debian"#ansible_os_family

根據不同的系統,使用不同的安裝命令。

六、角色

角色是ansible自1.2版本引入的新特性,用于層次性、結構化地組織playbook。roles能夠根據層次型結構自動裝載變量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。簡單來講,roles就是通過分別將變量、文件、任務、模板及處理器放置于單獨的目錄中,并可以便捷地include它們的一種機制。 角色一般用于基于主機構建服務的場景中,但也可以是用于構建守護進程等場景中。

運維復雜的場景:建議使用 roles,代碼復用度高。

https://docs.ansible.com/ansible/latest/user_guide/playbooks_reuse_roles.html
官方文檔

在此文件夾中
在這里插入圖片描述

role目錄結構

roles/project1/tasks/files/vars/       templates/handlers/default/    meta/       project2/tasks/files/vars/       templates/handlers/default/    meta/

Role各目錄作用

  1. roles/project/ :項目名稱,有以下子目錄。
  2. files/ :存放由copy或script模塊等調用的文件。
  3. templates/:template模塊查找所需要模板文件的目錄
  4. tasks/:定義task,role的基本元素,至少應該包含一個名為main.yml的文件;其它的文件需要在此文件中通過include進行包含。
  5. handlers/:至少應該包含一個名為main.yml的文件;此目錄下的其它的文件需要在此文件中通過include進行包含。
  6. vars/:定義變量,至少應該包含一個名為main.yml的文件;此目錄下的其它的變量文件需要在此文件中通過include進行包含。
  7. meta/:定義當前角色的特殊設定及其依賴關系,至少應該包含一個名為main.yml的文件,其它文件需在此文件中通過include進行包含。
  8. default/:設定默認變量時使用此目錄中的main.yml文件,比vars的優先級低。

建立role

  1. 創建role的目錄結構.在以roles命名的目錄下分別創建以各角色名稱命名的目錄,如mysql等,在每個角色命名的目錄中分別創建相關的目錄和文件,比如tasks、files、handlers、templates和vars等目錄;用不到的目錄可以創建為空目錄,也可以不創建。
  2. 編寫和準備role的功能文件。
  3. 編寫playbook文件調用需要的角色應用于指定的主機

創建相應的文件夾。
在這里插入圖片描述
建立各個文件,其中main文件中規定了所有文件執行的順序。
在這里插入圖片描述
在這里插入圖片描述
注意:使用role需要再其同級別的目錄建立yml文件。
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/36298.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/36298.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/36298.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vue3 【提效】自動路由(含自定義路由) unplugin-vue-router 實用教程

不再需要為每一個路由編寫冗長的 routes 配置啦,新建文件便可自動生成路由! 使用方法 1. 安裝 unplugin-vue-router npm i -D unplugin-vue-router2. 修改 vite 配置 vite.config.ts import VueRouter from unplugin-vue-router/viteplugins 中加入 V…

消費疲軟,預期一下債券的平均收益

在預測消費疲軟對債券平均收益的影響時,我們需要考慮多個因素,包括宏觀經濟環境、貨幣政策、通脹預期以及債券市場的具體表現等。以下是對債券平均收益的預期分析: 宏觀經濟環境與貨幣政策: 當前中國經濟增速已轉向高質量發展階段…

【Redis一】Redis配置與優化

目錄 一.關系型數據庫與非關系型數據庫 1.關系型數據庫 2.非關系型數據庫 3.二者區別 4.非關系型數據庫產生背景 5.NoSQL與SQL數據記錄對比 關系型數據庫 非關系型數據庫 二.Redis相關概述 1.簡介 2.五大數據類型 3.優缺點 3.1.優點 3.2.缺點 4.使用場景 5.采用…

蘋果應用Testflight上架完整步聚

1.全部選中下圖內容,包含iPhone與iPad屏幕所有旋轉方向 2. 準備App圖標,一定要有152和167這個尺寸,不然后提交不過 3.1024這個尺寸的的圖像不能有透明層,不然提交不通過 4.選中編譯設備為Any iOS Device[arm64] 5.選擇Product下的Archive進行生成 6.在彈出的窗口中選擇Test…

Python之三大基本庫——Numpy(2)

接著上次的內容接著講,連續號都續上哈 七、numpu中random的隨機生成函數 以下總結的是比較常用到的函數: 下面分別介紹一下不用的用法: 首先導入創建函數 import numpy as np np.random.seed(666)1、 rand(d0,d1,d2,...,dn):返…

JavaWeb系列三: JavaScript學習 下

文章目錄 js數組定義方式數組遍歷 js函數函數入門函數使用方式使用方式一使用方式二 函數注意事項函數練習題 定義對象使用object定義使用{}定義 事件onload事件onclick事件失去焦點事件內容發生改變事件表單提交事件靜態注冊動態注冊表單作業 dom對象文檔對象模型document對象…

JDK-調度線程池

歸檔 GitHub: JDK-調度線程池 使用示例 https://github.com/zengxf/small-frame-demo/blob/master/jdk-demo/simple-demo/src/main/java/test/jdkapi/juc/thread_pool/TestSchedule.java JDK 版本 openjdk version "17" 2021-09-14 OpenJDK Runtime Environment…

邊緣計算VNC智能盒子如何助力HMI設備實現二次開發?

HMI(Human-Machine Interface)又稱人機界面,是用戶與機器之間交互和通信的媒介。今天帶你了解智能盒子如何助力HMI設備實現二次開發? HMI設備被廣泛應用在工業自動化中,具有顯示設備信息,實時監測&#xf…

python爬蟲--scrapy框架

Scrapy 一 介紹 Scrapy簡介 1.Scrapy是用純Python實現一個為了爬取網站數據、提取結構性數據而編寫的應用框架,用途非常廣泛2.框架的力量,用戶只需要定制開發幾個模塊就可以輕松的實現一個爬蟲,用來抓取網頁內容以及各種圖片,非…

GPT-5對普通人有何影響

這篇文章對ChatGPT的使用方法和提問技巧進行了討論,重點強調了背景信息和具體提問的重要性。文章清晰地傳達了如何提高ChatGPT回答的質量,以及個人在使用ChatGPT時的體會和建議。然而,文章在邏輯組織和表達方面還有一些可以改進的地方&#x…

Spring Boot與分布式事務的最佳實踐

Spring Boot與分布式事務的最佳實踐 大家好,我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編,也是冬天不穿秋褲,天冷也要風度的程序猿!今天我們來探討在Spring Boot應用中如何實現分布式事務的最佳實踐。 什么是…

Android Launcher-----MainThreadInitializedObject介紹

MainThreadInitializedObject 是 Android 開發中用于確保對象在主線程上初始化的一種設計模式 一、用途 MainThreadInitializedObject 通常用于確保那些需要在主線程上創建的對象(比如UI組件或依賴于主線程環境的對象)能夠安全地進行初始化 二、優點 …

LeetCode.438找到字符串中所有字母異位詞

問題描述 給定兩個字符串s和p,找到s中所有p的 異位詞 的子串,返回這些子串的起始索引。不考慮答案輸出的順序。 異位詞 指由相同字母重排列形成的字符串(包括相同的字符串)。 解題思路1 注意:該解題思路是錯誤的&am…

Microsoft VBA Excel 操控 Access資料表和查詢代碼進行搬運操作

問題場景 Run_NoSource_AddressSource_FileDestination_AddressDestination_FileCopy_IndicatorRun_Start_Time1C:\Users\EP\path\to\FileSSS-1.MDBC:\Users\EP\path\to\FileSSC-1.MDBY2C:\Users\EP\path\to\FileSSS-2.MDBC:\Users\EP\path\to\FileSSC-2.MDBY3C:\Users\EP\pat…

NC參照 根據名稱轉換為主鍵值,如部門、人員等參照根據部門名稱、人員名稱獲取對應的主鍵值

NC參照 根據名稱轉換為主鍵值,如部門、人員等參照根據部門名稱、人員名稱獲取對應的主鍵值 private BillCardPanel getEditBillCardPanel() {return getEditor().getBillCardPanel(); }private BillData getEditorBillData() {return this.getEditor().getBillCard…

靜態庫和動態庫

1、編譯過程 1.預處理:解釋并展開源程序當中的所有的預處理指令,此時生成 *.i 文件。 2.編譯:詞法和語法的分析,生成對應硬件平臺的匯編語言文件,此時生成 *.s 文件。 3.匯編:將匯編語言文件翻譯為對應處理…

便攜式煙氣監測儀的應用主要有哪些?

煙氣分析儀是一種用于檢測和分析煙氣中各種成分和污染物含量的儀器,通過采集和處理煙氣樣品,對其中的各種成分進行定量分析。那么,便攜式煙氣監測儀的應用主要有哪些?為方便大家了解,下面就讓小編來為大家簡單介紹一下…

2-2到2-4

計算出所有人的平均年齡: val lines sc.textFile("/root/data/scala/people/page.txt") val count lines.count() val total lines.map(line > line.split(" ")(1)).map(t>t.trim.toInt).collect().reduce((a,b)>ab) val avgAge …

如何防止SQL注入

為了防止SQL注入攻擊,可以采取以下一系列的安全措施,這些措施結合了多篇參考文章中的關鍵信息和方法: 使用參數化查詢或預編譯語句: 這是防止SQL注入的最常見且最有效的方法之一。通過將用戶輸入的數據作為參數傳遞給SQL查詢語句…

[Python]根據文件路徑獲取文件所在目錄、文件名和后綴名

一、簡介 本文介紹了在python中如何根據文件的路徑名字(字符串)獲取文件所在目錄名、文件名(帶后綴)、文件名(無后綴)和文件后綴名。 二、代碼 假設文件路徑為/home/user/temp.txt,使用以下代…