從零開始的云計算生活——第三十七天,跬步千里,ansible之playbook

目錄

一.故事劇情

二.Playbook簡介

三.Playbook核心元素(重要)

四.Playbook語法

五.Playbook的運行方式

六.Playbooks中tasks語法使用

1、file

2、lineinfile

3、replace

4、shell

5、debug

6、template/copy

7、fetch

8、unarchive

9、wait_for

10、yum

11、when

12、register

?編輯

13、pause

14、ignore_errors

15、cron

七.Ansible變量

1、Ansible 變量介紹

2、變量命名規則

3、變量類型

3.1、全局變量

3.2、劇本變量

3.3、資產變量

3.4、Facts 變量

3.5、注冊變量

4、變量優先級

八.loop循環語句

loop關鍵字說明

九.條件語句

簡介

when關鍵字

1. when基本使用

2. 比較運算符

3. 邏輯運算符

條件判斷與tests

判斷變量

判斷執行結果

判斷路徑

判斷字符串

判斷整除

其他tests

條件判斷與block

block

rescue

always

條件判斷與錯誤處理

fail模塊

failed_when

changed_when

十.高級用法

本地執行

任務委托

任務暫停

滾動執行

只執行一次

設置環境變量

交互式提示

十一.Roles角色(重要)?

概述

目錄介紹

1.Ansible-galaxy角色管理工具

Ansible-galaxy簡介

獲取Ansible-Galaxy幫助

ansible-galaxy命令

二、roles編寫步驟

1、編寫roles 的步驟為:

2、roles的調用

3、roles中使用變量

4、多次調用同一個roles

5、roles管理模板文件

6、roles管理handlers文件

7、roles 的依賴關系

8、roles 的相互調用

十二.總結


一.故事劇情

在了解ansible命令本身之后,她最常用的一部分,便是playbook,使用playbook可以很大程度上減少我們的操作,批量的對很多主機進行更改。

二.Playbook簡介

? ? ? ?playbook是ansible用于配置,部署和管理托管主機劇本,通過playbook的詳細描述,執行其中一系列tasks,可以讓遠程主機達到預期狀態,也可以說,playbook字面意思是劇本,現實中由演員按劇本表演,在ansible中由計算機進行安裝,部署應用,提供對外服務,以及組織計算機處理各種各樣的事情。

? ? ? ?ansible使用playbook來管理自動化task,playbook是yaml格式的文件,其基本內容可以認為是多條ansible的ad-hoc的語句組成。我們完成一個任務,例如安裝部署一個httpd服務,我們需要多個模塊(一個模塊也可以稱之為task)提供功能來完成。而playbook就是組織多個task的容器,他的實質就是一個文件,是用yaml(Yet Another Markup Language)語言編寫的文件,有著特定的組織格式。YAML 是專門用來寫配置文件的語言,非常簡潔和強大,遠比 JSON 格式方便,YAML語法能夠簡單的表示散列表,字典等數據結構。

? ? ? ?playbook命令根據自上而下的順序依次執行。同時,playbook開創了很多特性,它可以允許你傳輸某個命令的狀態到后面的指令,如你可以從一臺機器的文件中抓取內容并附為變量,然后在另一臺機器中使用,這使得你可以實現一些復雜的部署機制,這是ansible命令無法實現的。

三.Playbook核心元素(重要)

  • Hosts 執行的遠程主機列表

  • Tasks 任務集

  • Varniables 內置變量或自定義變量在playbook中調用

  • Templates 模板,即使用模板語法的文件,后綴.j2,比如配置文件等

  • Handlers 和notify結合使用,由特定條件觸發的操作,滿足條件方才執行,否則不執行

  • tags 標簽,指定某條任務執行,用于選擇運行playbook中的部分代碼

四.Playbook語法

playbook使用yaml語法格式,后綴可以是yaml,也可以是yml

  • 一般情況下,一個playbook需要使用"---"開始。

  • 在單一一個playbook文件中,可以連續三個連子號(---)區分多個play。還有選擇性的連續三個點號(...)用來表示play的結尾,也可省略。

  • 次行開始正常寫playbook的內容,一般都會寫上描述該playbook的功能

  • 使用#號注釋代碼

  • 縮進必須統一,不能空格和tab混用

  • 縮進的級別也必須是一致的,同樣的縮進代表同樣的級別,程序判別配置的級別是通過縮進結合換行實現的

  • YAML文件內容和Linux系統大小寫判斷方式保持一致,是區分大小寫的,k/v的值均需大小寫敏感

  • k/v的值可同行寫也可以換行寫。同行使用: 分隔

  • v可以是個字符串,也可以是一個列表[]

五.Playbook的運行方式

通過ansible-playbook命令運行

ansible-playbook <filename.yml> ... [options]

常用命令:

ansible-playbook filename.yml [options]
?
# ssh 連接的用戶名
-u REMOTE_USER, --user=REMOTE_USER
?
# ssh登錄認證密碼
-k, --ask-pass ? ?
?
# sudo 到root用戶,相當于Linux系統下的sudo命令
-s, --sudo ? ? ??
? ??
# sudo 到對應的用戶
-U SUDO_USER, --sudo-user=SUDO_USER ??
?
# 用戶的密碼(—sudo時使用)
-K, --ask-sudo-pass ? ??
?
# ssh 連接超時,默認 10 秒
-T TIMEOUT, --timeout=TIMEOUT
?
# 指定該參數后,執行 playbook 文件不會真正去執行,而是模擬執行一遍,然后輸出本次執行會對遠程主機造成的修改
-C, --check ? ? ?
?
# 設置額外的變量如:key=value 形式 或者 YAML or JSON,以空格分隔變量,或用多個-e
-e EXTRA_VARS, --extra-vars=EXTRA_VARS ? ?
?
# 進程并發處理,默認 5
-f FORKS, --forks=FORKS ? ?
?
# 指定 hosts 文件路徑,默認 default=/etc/ansible/hosts
-i INVENTORY, --inventory-file=INVENTORY ??
?
# 指定一個 pattern,對- hosts:匹配到的主機再過濾一次
-l SUBSET, --limit=SUBSET ? ?
?
# 只打印有哪些主機會執行這個 playbook 文件,不是實際執行該 playbook
--list-hosts ?
?
# 列出該 playbook 中會被執行的 task
--list-tasks ??
?
# 私鑰路徑
--private-key=PRIVATE_KEY_FILE ??
?
# 同一時間只執行一個 task,每個 task 執行前都會提示確認一遍
--step ? ?
?
# 只檢測 playbook 文件語法是否有問題,不會執行該 playbook
--syntax-check ?
?
# 當 play 和 task 的 tag 為該參數指定的值時才執行,多個 tag 以逗號分隔
-t TAGS, --tags=TAGS ??
?
# 當 play 和 task 的 tag 不匹配該參數指定的值時,才執行
--skip-tags=SKIP_TAGS ??
?
# 輸出更詳細的執行過程信息,-vvv可得到所有執行過程信息。
-v, --verbose?

六.Playbooks中tasks語法使用

先創建一個目錄用來存放yml文件

可以使用-C來驗證文件內容是否出錯

1、file

操作文件,比如創建文件或目錄、刪除文件或目錄、修改文件權限等

常用參數:

  • path:指定要操作的文件或目錄

  • state:參數非常靈活,可以包含的值及含義如下

    • directory - 與path結合說明我們要操作的是一個目錄

    • touch - 與path結合說明我們要操作的是一個文件

    • link - 創建軟連接

    • hard - 創建硬鏈接

    • absent - 刪除目標

  • src:當state設置為link或hard創建鏈接時,用于說明鏈接哪個文件,指定鏈接源

  • force:值為yes表示強制創建

  • owner:指定被操作文件的屬主

  • group:指定被操作文件的屬組

  • mode:指定被操作文件的權限

測試成功,直接刪除-C來執行,然后去查看是否創建成功?

2、lineinfile

修改文件某一行文本

常用參數:

  • path:操作的文件路徑

  • regexp:正則表達式,要替換的內容

  • line:指定修改后的文本內容

  • state:當設置為absent代表刪除匹配的行

  • backrefs:默認為no,當未匹配到時line對應的內容會被插入到文本的末尾,為yes表示不插入

  • insertafter:借助insertafter參數可以將文本插入到“指定的行”之后

  • insertbefore:借助insertbefore參數可以將文本插入到“指定的行”之前

  • backup:是否進行備份

  • create:操作的文件不存在時是否創建

示例:

先在文本中加入內容

在文本中加入tags來進行單個步驟

將所有line開頭的行替換?

3、replace

根據正則表達式替換文件內容

常用參數:

  • path:操作文件的路徑

  • regexp:正則表達式

  • replace:指定最終要替換的字符串

  • backup:是否在修改文件之前對文件進行備份,yes是進行備份

簡單示例:

4、shell

執行腳本命令

5、debug

用于在調試中輸出信息

6、template/copy

模板作用類似于copy,可將文件分發到不同節點上,可以在模板文件中引入變量

常用參數:

  • src: 源文件路徑

  • dest:目標文件路徑

  • group:目標文件屬組

  • mode:目標文件權限

  • backup:如果目標文件存在,則先備份目標文件

  • force:是否強制覆蓋,默認為yes

  • validate:在復制之前通過命令驗證目標文件,如果驗證通過則復制

7、fetch

功能與copy類似,但是是用于從遠程主機中拷貝文件到管理主機,不能拷貝目錄

常用參數:

  • src:從遠程主機上獲取的文件路徑

  • dest:保存文件的目錄

  • flat:是否校準源文件與獲取文件是否一致,默認false

8、unarchive

解壓縮,將壓縮文件解壓分發到不同節點上,對zip壓縮不友好,盡量使用tar歸檔壓縮(必須是壓縮文件目標)

常用參數:

  • src: 源文件路徑

  • dest: 目標文件路徑

  • mode:目標文件權限

9、wait_for

等待某些操作完成以后再進行后續操作

常用參數:

  • connect_timeout:在下一個任務執行之前等待連接的超時時間

  • delay:指在等待過程中輪詢的時間間隔

  • host:等待的主機地址,默認是127.0.0.1

  • port:等待的主機端口

  • path:文件路徑,只有當這個文件存在時才開始執行下一個任務

  • state:等待的狀態,值可以為started/stoped/absent/present

  • timeout:等待的超時時間,默認300秒

當8080端口未開啟時,檢測將一直進行,此時將nginx端口改為8080并重啟,打開8080端口

監測發現8080端口開啟,此時進行下一個命令

10、yum

軟件包管理

常用參數:

? ? name:指定需要管理的軟件包名

? ? state:參數非常靈活,可以包含的值及含義如下

? ? ? ? ? ?present:確保軟件包已經安裝了

? ? ? ? ? ?installed:安裝

? ? ? ? ? ?latest:安裝最新的軟件包

? ? ? ? ? ?removed/absent:刪除對應的軟件包

? ? disable_gpg_check:用于禁用對rpm包公鑰驗證,默認值no表示不禁用驗證,yes表示禁用驗證

11、when

條件判斷,滿足后再執行任務

12、register

用于注冊一個變量,保存命令的結果,常與when結合使用

13、pause

暫停一定時間

常用參數:

  • minutes:暫停多少分鐘

  • seconds:暫停多少秒

  • prompt:打印一串信息提示用戶操作

14、ignore_errors

忽略錯誤的命令,通常情況下當出現執行失敗時ansible會停止運行,有時候你會想要繼續執行下去就需要添加這個

15、cron

定時任務,功能相當于crontab

常用參數:

? ? name:任務名稱

? ? minute:分, hour:時,day:天,month:月,weekday:周

? ? job:指定要執行的命令或者腳本

? ? state:當設置為absent代表刪除任務

七.Ansible變量

1、Ansible 變量介紹

在 PlayBook中,將 PlayBook 類比成了 linux 中的shell。那么它作為一門 ansible 特殊的語言,肯定要涉及到變量定義、控制結構的使用等特性。

2、變量命名規則

  • 變量的名字由 字母、下劃線和數字組成,必須以字母開頭

  • 保留關鍵字不能作為變量名稱

3、變量類型

根據變量的作用范圍大體的將變量分為:

  • 全局變量

  • 劇本變量

  • 資產變量

  • Facts 變量

  • 注冊變量

3.1、全局變量

全局變量,是我們使用ansible 或使用 ansible-playbook 時,手動通過 -e 參數傳遞給 ansible 的變量。

通過 ansible 或者 ansible-playbook 的 help 幫助,可以獲取具體格式使用方式:

#傳遞一個YAML/JSON 的形式(注意不管YAML 還是 JSON,它們的最終格式一定要是一個字典)

3.2、劇本變量

這種變量和playbook 有關,定義在 playbook 中的,它的定義方式有多種。這里介紹兩種最常見的定義方式。

通過 Playbook 屬性 vars 定義

通過 Play 屬性 vars_files 定義
?

#當通過vars屬性定義的變量很多時,這個 Play 就會感覺特別臃腫,此時我們可將變量單獨從play中抽離出來
#形成單獨的 yaml 文件---
- name: test play varshosts: allvars_files:- vars/users.yml

如何在 playbook 中使用這些變量

在playbook中使用變量時,使用 {{ 變量名 }} 來使用變量

驗證是否創建成功

name: {{ user }} 是一個字典的開始。因此,加針對變量的使用,加上了雙引號,避免 ansible 錯誤解析。

3.3、資產變量

資產變量分為主機變量和主機組變量,分別針對資產中的單個主機和主機組。

主機變量

以下資產中,定義了一個主機變量britz,此變量只針對 192.168.71.193?這臺服務器有效。

此時193有定義,195沒有所以報錯,可用使用全局變量使其有數值

主機組變量

以下資產中,定義了一個組變量home,此變量將針對 web_servers 這個主機組中的所有服務器有效

發現此時有定義的193仍顯示自己的key,而195沒有則會顯示主機組的key?

變量的繼承

此時全部繼承了children組的key?

3.4、Facts 變量

facts 變量不包含在之前介紹的全局變量、劇本變量及資產變量之內。

facts 變量不需要我們人為去聲明變量名及賦值。它的聲明和賦值完全有 ansible 中的 setup 模塊幫助我們完成。

它收集了有關被管理服務器的操作系統版本、服務器IP地址、主機名,磁盤的使用情況、cpu個數、內存條大小等等有關被管理服務器的私有信息。

在每次playbook運行的時候都會發現在 Playbook 執行一個 Gathering Facts的過程。這個過程就是收集被管理服務器的facts信息過程。

手動收集 Facts 變量

過濾 Facts

通過剛剛的手動收集 Facts,我們發現facts 信息量很大。因此,可以有針對性的顯示我們想要的信息。

可以通過使用facts 模塊中filter 參數去過濾我們想要的信息。

  • 僅獲取服務器的內存信息情況

3.5、注冊變量

用于保存一個 task 任務的執行結果,以便于 debug 時使用,或者將此次 task 任務的結果作為條件,去判斷是否執行其他 task 任務。

注冊變量在playbook中通過 register 關鍵字 去實現。

vim  playbook.yml
cat  playbook.yml
---
- name: install a package and print the resulthosts: web_serversremote_user: roottasks:- name: install nginx packageyum: name=nginx state=present register: install_result- name: print resultdebug: msg: "{{ install_result }}"
...ansible-playbook  -i hosts playbook.ymlPLAY [install a package and print the result] *********************************************************TASK [Gathering Facts] ********************************************************************************
ok: [192.168.71.193]TASK [install nginx package] **************************************************************************
ok: [192.168.71.193]TASK [print result] ***********************************************************************************
ok: [192.168.71.193] => {"install_result": {"changed": false, "failed": false, "msg": "", "rc": 0, "results": ["1:nginx-1.20.1-10.el7.x86_64 providing nginx is already installed"]}
}PLAY RECAP ********************************************************************************************
192.168.115.183            : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

4、變量優先級

變量優先級結論

當一個變量同時在全局變量、劇本變量 和 資產變量中定義時,優先級最高的是全局變量;其次是劇本變量;最后才是資產變量。

八.loop循環語句

loop關鍵字說明

在playbook中使用循環,直接使用loop關鍵字即可。

如下示例,下載多個服務:

九.條件語句

簡介

在有的時候play的結果依賴于變量、fact或者是前一個任務的執行結果,或者有的時候,我們會基于上一個task執行返回的結果而決定如何執行后續的task。這個時候就需要用到條件判斷。

條件語句在Ansible中的使用場景:

  • 在目標主機上定義了一個硬限制,比如目標主機的最小內存必須達到多少,才能執行該task

  • 捕獲一個命令的輸出,根據命令輸出結果的不同以觸發不同的task

  • 根據不同目標主機的facts,以定義不同的task

  • 根據目標機的cpu的大小,以調優相關應用性能

  • 用于判斷某個服務的配置文件是否發生變更,以確定是否需要重啟服務

when關鍵字

1. when基本使用

在ansible中,使用條件判斷的關鍵字就是when。

如在安裝包的時候,需要指定主機的操作系統類型,或者是當操作系統的硬盤滿了之后,需要清空文件等,可以使用when語句來做判斷 。when關鍵字后面跟著的是python的表達式,在表達式中你能夠使用任何的變量或者fact,當表達式的結果返回的是false,便會跳過本次的任務

下面是一個基本的用法示例:

---
- name: Install vimhosts: alltasks:- name: Install VIM via yumyum: name: vsftpdstate: installedwhen: ansible_os_family =="RedHat"- name: Install VIM via aptapt: name: proftpd state: presentwhen: ansible_os_family =="Debian"- name: Unexpected OS familydebug: msg="OS Family {{ ansible_os_family }} is not supported" fail=yeswhen: not (ansible_os_family =="RedHat" or ansible_os_family =="Debian")present

2. 比較運算符

在上面的示例當中,我們使用了"=="的比較運算符,在ansible中,還支持如下比較運算符:

  • ==:比較兩個對象是否相等,相等則返回真。可用于比較字符串和數字

  • !=:比較兩個對象是否不等,不等則為真。

  • >:比較兩個對象的大小,左邊的值大于右邊的值,則為真

  • <:比較兩個對象的大小,左邊的值小于右邊的值,則為真

  • >=:比較兩個對象的大小,左邊的值大于等于右邊的值,則為真

  • <=:比較兩個對象的大小,左邊的值小于等于右邊的值,則為真

when: ansible_machine == "x86_64"?

when: max_memory <= 512

3. 邏輯運算符

在Ansible中,除了比較運算符,還支持邏輯運算符:

  • and:邏輯與,當左邊和右邊兩個表達式同時為真,則返回真

  • or:邏輯或,當左右和右邊兩個表達式任意一個為真,則返回真

  • not:邏輯否,對表達式取反

  • ():當一組表達式組合在一起,形成一個更大的表達式,組合內的所有表達式都是邏輯與的關系

# 邏輯或
when: ansible_distribution == "RedHat" or ansible_distribution == "Fedora"

# 邏輯與
when: ansible_distribution_version == "7.5" and ansible_kernel == "3.10.0-327.el7.x86_64"

when:
? - ansible_distribution_version == "7.5"
? - ansible_kernel == "3.10.0-327.el7.x86_64"
??
# 組合

when: =>?
? ( ansible_distribution == "RedHat" and ansible_distribution_major_version == "7" )
? or
? ( ansible_distribution == "Fedora" and ansible_distribution_major_version == "28")

條件判斷與tests

在shell當中,我們可使用test命令來進行一些常用的判斷操作,如下:

# 判斷/test文件是否存在
test -e /test

# 判斷/testdir是否存在且為一個目錄
test -d /testdir

事實上,在ansible中也有類似的用法,只不過ansible沒有使用linux的test命令,而是jinja2模板的tests。

# 通過條件語句判斷testpath的路徑是否存在
- hosts: testvars:testpath: /testdirtasks:- debug:msg: "file exist"when: testpath is exists

判斷變量

  • defined:判斷變量是否已定義,已定義則返回真

  • undefined:判斷變量是否未定義,未定義則返回真

  • none:判斷變量的值是否為空,如果變量已定義且值為空,則返回真

判斷執行結果

  • sucess或succeeded:通過任務執行結果返回的信息判斷任務的執行狀態,任務執行成功則返回true

  • failure或failed:任務執行失敗則返回true

  • change或changed:任務執行狀態為changed則返回true

  • skip或skipped:任務被跳過則返回true

判斷路徑

  • file:判斷指定路徑是否為一個文件,是則為真

  • directory:判斷指定路徑是否為一個目錄,是則為真

  • link:判斷指定路徑是否為一個軟鏈接,是則為真

  • mount:判斷指定路徑是否為一個掛載點,是則為真

  • exists:判斷指定路徑是否存在,存在則為真

特別注意:關于路徑的所有判斷均是判斷主控端上的路徑,而非被控端上的路徑

判斷字符串

  • lower:判斷字符串中的所有字母是否都是小寫,是則為真

  • upper:判斷字符串中的所有字母是否都是大寫,是則為真

判斷整除

  • even:判斷數值是否為偶數,是則為真

  • odd:判斷數值是否為奇數,是則為真

  • divisibleby(num):判斷是否可以整除指定的數值,是則為真

其他tests

  • version

    可用于對比兩個版本號的大小,或者與指定的版本號進行對比,使用語法為version("版本號","比較操作符")

  • version中使用的比較運算符說明:

    • 大于: >, gt

    • 大于等于: >=, ge

    • 小于: <, lt

    • 小于等于: <=, le

    • 等于: =, ==, eq

    • 不等于: !=, <>, ne

  • subset

    判斷一個list是不是另一個list的子集

  • superset

    判斷一個list是不是另一個list的父集"

  • in

? ? ? ? 判斷一個字符串是否存在于另一個字符串中,也可用于判斷某個特定的值是否存在于列表中

  • string

    判斷對象是否為一個字符串,是則為真

  • number

    判斷對象是否為一個數字,是則為真

條件判斷與block

block

我們在前面使用when做條件判斷時,如果條件成立則執行對應的任務。但這就面臨一個問題,當我們要使用同一個條件判斷執行多個任務的時候,就意味著我們要在某一個任務下面都寫一下when語句,而且判斷條件完全一樣。這種方式不僅麻煩而且顯得low。Ansible提供了一種更好的方式來解決這個問題,即block。

- hosts: alltasks:- debug:msg: "task1 not in block"- block:- debug:msg: "task2 in block1"- debug:msg: "task3 in block1"when: 2 > 1

使用block注意事項:

  1. 可以為block定義name(ansible 2.3增加的特性)

  2. 可以直接對block使用when,但不能直接對block使用loop

rescue

block除了能和when一起使用之外,還能作錯誤處理。這個時候就需要用到rescue關鍵字:

- hosts: testtasks:- block:- shell: 'ls /testdir'rescue:- debug:msg: '/testdir is not exists'

在上面的例子中,當block中的任務執行失敗時,則運行rescue中的任務。如果block中的任務正常執行,則rescue的任務就不會被執行。如果block中有多個任務,則任何一個任務執行失敗,都會執行rescue。block中可以定義多個任務,同樣rescue當中也可以定義多個任務。

always

當block執行失敗時,rescue中的任務才會被執行;而無論block執行成功還是失敗,always中的任務都會被執行:

- hosts: testtasks:- block:- shell: 'ls /testdir'rescue:- debug:msg: '/testdir is not exists'always:- debug:msg: 'This task always executes'

條件判斷與錯誤處理

在上面講block的使用方法的時候,我們說block除了可以將多個任務組合到一起,還有錯誤處理的功能。接下來我們繼續說一說錯誤處理。

fail模塊

在shell中,可能會有這樣的需求:當腳本執行至某個階段時,需要對某個條件進行判斷,如果條件成立,則立即終止腳本的運行。在shell中,可以直接調用"exit"即可執行退出。事實上,在playbook中也有類似的模塊可以做這件事。即fail模塊。

fail模塊用于終止當前playbook的執行,通常與條件語句組合使用,當滿足條件時,終止當前play的運行。

選項只有一個:

  • msg:終止前打印出信息

# 使用fail模塊中斷playbook輸出
- hosts: testtasks:- shell: echo "Just a test--error" register: result- fail:msg: "Conditions established,Interrupt running playbook"when: "'error' in result.stdout"- debug:msg: "Inever execute,Because the playbook has stopped"

failed_when

事實上,當fail和when組合使用的時候,還有一個更簡單的寫法,即failed_when,當滿足某個條件時,ansible主動觸發失敗。

# 如果在command_result存在錯誤輸出,且錯誤輸出中,包含了`FAILED`字串,即返回失敗狀態:
- name: this command prints FAILED when it failscommand: /usr/bin/example-command -x -y -zregister: command_resultfailed_when: "'FAILED' in command_result.stderr"

也可以直接通過fail模塊和when條件語句,寫成如下:

- name: this command prints FAILED when it failscommand: /usr/bin/example-command -x -y -zregister: command_resultignore_errors: True- name: fail the play if the previous command did not succeedfail: msg="the command failed"when: " command_result.stderr and 'FAILED' in command_result.stderr"

ansible一旦執行返回失敗,后續操作就會中止,所以failed_when通常可以用于滿足某種條件時主動中止playbook運行的一種方式。

ansible默認處理錯誤的機制是遇到錯誤就停止執行。但有些時候,有些錯誤是計劃之中的。我們希望忽略這些錯誤,以讓playbook繼續往下執行。這個時候就可以使用ignore_errors忽略錯誤,從而讓playbook繼續往下執行。

changed_when

當我們控制一些遠程主機執行某些任務時,當任務在遠程主機上成功執行,狀態發生更改時,會返回changed狀態響應,狀態未發生更改時,會返回OK狀態響應,當任務被跳過時,會返回skipped狀態響應。我們可以通過changed_when來手動更改changed響應狀態。示例如下:

- shell: /usr/bin/billybass --mode="take me to the river"
register: bass_result
changed_when: "bass_result.rc != 2"    #只有該條task執行以后,bass_result.rc的值不為2時,才會返回changed狀態# this will never report 'changed' status
- shell: wall 'beep'changed_when: False    #當changed_when為false時,該條task在執行以后,永遠不會返回changed狀態

十.高級用法

本地執行

如果希望在控制主機本地運行一個特定的任務,可以使用local_action語句。

假設我們需要配置的遠程主機剛剛啟動,如果我們直接運行playbook,可能會因為sshd服務尚未開始監聽而導致失敗,我們可以在控制主機上使用如下示例來等待被控端sshd端口監聽:

- name: wait for ssh server to be runningwait_for:port: 22 host: "{{ inventory_hostname }}" search_regex: OpenSSHconnection: local

任務委托

在有些時候,我們希望運行與選定的主機或主機組相關聯的task,但是這個task又不需要在選定的主機或主機組上執行,而需要在另一臺服務器上執行。

這種特性適用于以下場景:

  • 在告警系統中啟用基于主機的告警

  • 向負載均衡器中添加或移除一臺主機

  • 在dns上添加或修改針對某個主機的解析

  • 在存儲節點上創建一個存儲以用于主機掛載

  • 使用一個外部程序來檢測主機上的服務是否正常

可以使用delegate_to語句來在另一臺主機上運行task:

- name: enable alerts for web servershosts: webserverstasks:- name: enable alertsnagios: action=enable_alerts service=web host="{{ inventory_hostname }}"delegate_to: nagios.example.com

如果delegate_to: 127.0.0.1的時候,等價于local_action

任務暫停

有些情況下,一些任務的運行需要等待一些狀態的恢復,比如某一臺主機或者應用剛剛重啟,我們需要需要等待它上面的某個端口開啟,此時就需要將正在運行的任務暫停,直到其狀態滿足要求。

Ansible提供了wait_for模塊以實現任務暫停的需求

wait_for模塊常用參數:

  • connect_timeout:在下一個任務執行之前等待連接的超時時間

  • delay:等待一個端口或者文件或者連接到指定的狀態時,默認超時時間為300秒,在這等待的300s的時間里,wait_for模塊會一直輪詢指定的對象是否到達指定的狀態,delay即為多長時間輪詢一次狀態。

  • host:wait_for模塊等待的主機的地址,默認為127.0.0.1

  • port:wait_for模塊待待的主機的端口

  • path:文件路徑,只有當這個文件存在時,下一任務才開始執行,即等待該文件創建完成

  • state:等待的狀態,即等待的文件或端口或者連接狀態達到指定的狀態時,下一個任務開始執行。當等的對象為端口時,狀態有started,stoped,即端口已經監聽或者端口已經關閉;當等待的對象為文件時,狀態有present或者started,absent,即文件已創建或者刪除;當等待的對象為一個連接時,狀態有drained,即連接已建立。默認為started

  • timeout:wait_for的等待的超時時間,默認為300秒

#等待8080端口已正常監聽,才開始下一個任務,直到超時
- wait_for: port: 8080 state: started  #等待8000端口正常監聽,每隔10s檢查一次,直至等待超時
- wait_for: port: 8000 delay: 10 #等待8000端口直至有連接建立
- wait_for: host: 0.0.0.0 port: 8000 delay: 10 state: drained#等待8000端口有連接建立,如果連接來自10.2.1.2或者10.2.1.3,則忽略。
- wait_for: host: 0.0.0.0 port: 8000 state: drained exclude_hosts: 10.2.1.2,10.2.1.3 #等待/tmp/foo文件已創建    
- wait_for: path: /tmp/foo #等待/tmp/foo文件已創建,而且該文件中需要包含completed字符串    
- wait_for: path: /tmp/foo search_regex: completed #等待/var/lock/file.lock被刪除    
- wait_for: path: /var/lock/file.lock state: absent #等待指定的進程被銷毀
- wait_for: path: /proc/3466/status state: absent #等待openssh啟動,10s檢查一次
- wait_for: port: 22 host: "{{ ansible_ssh_host | default(inventory_hostname) }}" search_regex: OpenSSH delay: 10 

滾動執行

默認情況下,ansible會并行的在所有選定的主機或主機組上執行每一個task,但有的時候,我們會希望能夠逐臺運行。最典型的例子就是對負載均衡器后面的應用服務器進行更新時。通常來講,我們會將應用服務器逐臺從負載均衡器上摘除,更新,然后再添加回去。我們可以在play中使用serial語句來告訴ansible限制并行執行play的主機數量。

下面是一個在amazon EC2的負載均衡器中移除主機,更新軟件包,再添加回負載均衡的配置示例:

- name: upgrade pkgs on servers behind load balancerhosts: myhostsserial: 1tasks:- name: get the ec2 instance id and elastic load balancer idec2_facts:- name: take the host out of the elastic load balancer idlocal_action: ec2_elbargs:instance_id: "{{ ansible_ec2_instance_id }}"state: absent- name: upgrade pkgsapt: update_cache: yes upgrade: yes- name: put the host back n the elastic load balancerlocal_action: ec2_elbargs:instance_id: "{{ ansible_ec2_instance_id }}"state: presentec2_elbs: "{{ items }}"with_items: ec2_elbs

在上述示例中,serial的值為1,即表示在某一個時間段內,play只在一臺主機上執行。如果為2,則同時有2臺主機運行play。

只執行一次

某些時候,我們希望某個task只執行一次,即使它被綁定到了多個主機上。例如在一個負載均衡器后面有多臺應用服務器,我們希望執行一個數據庫遷移,只需要在一個應用服務器上執行操作即可。

可以使用run_once語句來處理:

- name: run the database migrateionscommand: /opt/run_migrateionsrun_once: true

設置環境變量

我們在命令行下執行某些命令的時候,這些命令可能會需要依賴環境變量。比如在安裝某些包的時候,可能需要通過代理才能完成完裝。或者某個腳本可能需要調用某個環境變量才能完成運行。

ansible 支持通過environment關鍵字來定義一些環境變量。

在如下場景中可能需要用到環境變量:

  • 運行shell的時候,需要設置path變量

  • 需要加載一些庫,這些庫不在系統的標準庫路徑當中

---
- name: upload a remote file to aws s3hosts: testtasks:- name: install pipyum:name: python-pipstate: installed- name: install the aws toolspip:name: awsclistate: present- name: upload file to s3shell aws s3 put-object --bucket=my-test-bucket --key={{ ansible_hostname }}/fstab --body=/etc/fstab --region=eu-west-1environment:AWS_ACCESS_KEY_ID: xxxxxxAWS_SECRET_ACCESS_KEY: xxxxxx

交互式提示

在少數情況下,ansible任務運行的過程中需要用戶輸入一些數據,這些數據要么比較秘密不方便,或者數據是動態的,不同的用戶有不同的需求,比如輸入用戶自己的賬戶和密碼或者輸入不同的版本號會觸發不同的后續操作等。ansible的vars_prompt關鍵字就是用來處理上述這種與用戶交互的情況的。

 - hosts: allremote_user: rootvars_prompt:- name: share_userprompt: "what is your network username?"private: yes- name: share_passprompt: "what is your network password"private: yestasks:- debug:var: share_user- debug:var: share_pass

vars_prompt常用選項說明:

  • private: 默認為yes,表示用戶輸入的值在命令行不可見

  • default:定義默認值,當用戶未輸入時則使用默認值

  • confirm:如果設置為yes,則會要求用戶輸入兩次,適合輸入密碼的情況

十一.Roles角色(重要)?

概述

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

目錄介紹

目錄作用
tasks目錄角色需要執行的主任務文件放置在此目錄中,默認的主任務文件名為main.yml,當調用角色時,默認會執行main.yml文件中的任務,你也可以將其他需要執行的任務文件通過include的方式包含在tasks/main.yml文件中。
handlers目錄當角色需要調用handlers時,默認會在此目錄中的main.yml文件中查找對應的handler
defaults目錄角色會使用到的變量可以寫入到此目錄中的main.yml文件中,通常,defaults/main.yml文件中的變量都用于設置默認值,以便在你沒有設置對應變量值時,變量有默認的值可以使用,定義在defaults/main.yml文件中的變量的優先級是最低的。
vars目錄角色會使用到的變量可以寫入到此目錄中的main.yml文件中,看到這里你肯定會有疑問,vars/main.yml文件和defaults/main.yml文件的區別在哪里呢?區別就是,defaults/main.yml文件中的變量的優先級是最低的,而vars/main.yml文件中的變量的優先級非常高,如果你只是想提供一個默認的配置,那么你可以把對應的變量定義在defaults/main.yml中,如果你想要確保別人在調用角色時,使用的值就是你指定的值,則可以將變量定義在vars/main.yml中,因為定義在vars/main.yml文件中的變量的優先級非常高,所以其值比較難以覆蓋。
meta目錄如果你想要賦予這個角色一些元數據,則可以將元數據寫入到meta/main.yml文件中,這些元數據用于描述角色的相關屬性,比如 作者信息、角色主要作用等等,你也可以在meta/main.yml文件中定義這個角色依賴于哪些其他角色,或者改變角色的默認調用設定,在之后會有一些實際的示例,此處不用糾結。
templates目錄角色相關的模板文件可以放置在此目錄中,當使用角色相關的模板時,如果沒有指定路徑,會默認從此目錄中查找對應名稱的模板文件。
files目錄角色可能會用到的一些其他文件可以放置在此目錄中,比如,當你定義nginx角色時,需要配置https,那么相關的證書文件即可放置在此目錄中。

1.Ansible-galaxy角色管理工具

Ansible-galaxy簡介

Ansible Galaxy 是一個Ansible內容公共資源庫,這些內容由許許多多Ansible管理員和用戶編寫。它包含數千個Ansible角色,具有可搜索的數據庫,可幫助Ansible用戶確定或許有助于他們完成管理任務的角色。Ansible Galaxy含有面向新的Ansible用戶和角色開發人員的文檔和視頻鏈接。

獲取Ansible-Galaxy幫助

通過Ansible Galaxy網站主頁上的Documenttaion標簽,可以進入描述如何使用Ansible Galaxy的頁面。其中包含了介紹如何從Ansible Galaxy下載和使用角色的內容。該頁面也提供關于如何開發角色并上傳到Ansible Galaxy的說明。

通過Ansible Galaxy網站主頁上的Documenttaion標簽,可以進入描述如何使用Ansible Galaxy的頁面。其中包含了介紹如何從Ansible Galaxy下載和使用角色的內容。該頁面也提供關于如何開發角色并上傳到Ansible Galaxy的說明。

Ansible Galaxy

ansible-galaxy命令

語法:

ansible-galaxy [選項] 命令

選項:

選項(不能用)作用
-p 或 --roles-path指定角色安裝的路徑。
-r 或 --role-repo指定角色倉庫的 URL。
-f 或 --force強制重新安裝角色。
-t 或 --skip-install跳過角色安裝,只下載角色文件。 -c 或 --collections-path
--ignore-errors在安裝過程中忽略錯誤。
--debug啟用調試輸出。
--module-name為 import-playbook 命令指定模塊名稱。
--role-name為 import-playbook 命令指定角色名稱。

命令:

命令作用
install安裝角色。
list列出已安裝的角色。
remove刪除已安裝的角色。
import導入角色。
init初始化一個新角色。
update更新已安裝的角色。
import-playbook從角色導入 Playbook。
search搜索角色
info顯示角色信息

二、roles編寫步驟

1、編寫roles 的步驟為:

  1. 創建roles的項目目錄。

  2. 編寫roles的功能,也就是tasks;

  3. 最后playbook引用roles編寫好的tasks;

1、先創建roles_test 項目目錄結構,并創建下面的子目錄,最基本的子目錄需要有tasks目錄。

[root@ansible ansible]# cd roles/
[root@ansible roles]# mkdir roles_test
[root@ansible roles]# cd roles_test/
[root@ansible roles_test]# mkdir tasks
[root@ansible roles_test]# cd tasks/
[root@ansible tasks]# pwd
/etc/ansible/roles/roles_test/tasks

#2、然后在tasks中編寫相關的任務,在tasks中必須有一個 main.yaml 文件。可以把編寫的任務直接寫到 main.yaml 文件中,也可以寫到其他文件中,然后在main.yaml中通過 include 的方式引用這些文件。在 tasks 中不需要寫 play 部分,只寫tasks部分就行。

#------或者----
[root@ansible tasks]# vim test.yaml
- name: test rolesdebug:msg: "this is test roles"
[root@ansible tasks]# vim main.yaml
- include: test.yaml

#3、寫好之后 編寫playbook調用roles,playbook劇本必須要與roles角色在同一目錄

---
- hosts: webremote_user: rootroles:- role: roles_test

#4、測試?

2、roles的調用

在playbook調用roles時,如何找到roles所在的目錄呢?有以下幾種方式:

  • ?playbook文件會在同級目錄中尋找與調用的角色同名的roles,例如在上例中,roletest.yaml這個playbook文件調用了roles_test這個角色,會自動在同級目錄中尋找roles_test這個目錄,并執行其中的tasks。

  • playbook文件也會尋找同級目錄中的roles 目錄,執行roles目錄中同名的角色項目

  • 也可以修改ansible配置文件中定義的roles的路徑,多個路徑之間使用冒號 :隔開

roles_path ? ?= /etc/ansible/roles:/data/ansible/roles:/opt?

  • 在playbook文件中,直接寫roles的絕對路徑也可以調用
---- hosts: webremote_user: rootroles:- role: /etc/ansible/roles/roles_test

3、roles中使用變量

修改roles文件,引入變量

在調用這個角色時,則需要傳入對應的變量,否則就會報錯,調用上例角色的示例如下:

#3、也可以為變量設置默認值,這樣即使在調用角色時沒有傳入任何參數,也有默認的值可以使用,同時也不會在調用時因為沒有傳入對應變量而報錯,需要在roles_test目錄中創建一個defaults目錄/vars 目錄,并且創建defaults/main.yml文件/vars/main.yaml文件,文件內容如下:
[root@ansible roles_test]# mkdir vars
[root@ansible roles_test]# cd vars/
[root@ansible vars]# vim main.yaml
var: test abc#4、然后在運行playbook,結果一樣
[root@ansible ansible]# ansible-playbook roletest.yaml
ok: [192.168.115.112] => {"msg": "test abc"
}
#結論:變量的優先級
#ansible-playbook > vars/main.yaml > 其他變量定義的方式

4、多次調用同一個roles

默認情況下,我們無法多次調用同一個角色,也就是說,如下寫兩遍playbook只會調用一測role角色:

- hosts: webremote_user: rootroles:- role: roles_test- role: roles_test

設置角色的 allow_duplicates 屬性,讓其支持重復使用

#2、調用角色時,傳入不同的參數
#先把vars 文件中的main.yaml 定義的變量注釋掉
#然后在playbook中添加變量

5、roles管理模板文件

前文中提到,roles中把所有的模板文件放置到templates 目錄中,我么來測試下:

1、新增template 目錄,建立模板文件

something in template;
{{ template_var }}

#3、變量文件如下:
var: test abc 
template_var: tempvar#4、playbook文件如下:
---- hosts: webremote_user: rootroles:- role: roles_test[root@ansible ansible]# ansible-playbook  roletest.yamlTASK [roles_test : test roles] **************************************************************************ok: [192.168.71.112] => {"msg": "test abc"}TASK [roles_test : copy template] ***********************************************************************
changed: [192.168.71.112]

6、roles管理handlers文件

如果想要在角色中使用一些handlers 以便進行觸發,則可以直接將對應的handlers 任務寫到 handlers/main.yaml文件中

#1、創建handlers 目錄
[root@ansible roles_test]# mkdir handlers
[root@ansible handlers]# vim main.yaml- name: test_handlersdebug:msg: "this is a test handler"#2、編輯tasks任務
[root@ansible tasks]# vim main.yaml- name: test rolesdebug:msg: "{{ var }}"changed_when: truenotify: test_handlers#3、把之前測試template 的變量注釋掉#4、運行playbook文件
[root@ansible ansible]# ansible-playbook -C roletest.yaml 
TASK [roles_test : test roles] *******************************************************************************
changed: [192.168.71.112] => {"msg": "test abc"
}RUNNING HANDLER [roles_test : test_handlers] ********************************************************************************
ok: [192.168.71.112] => {"msg": "this is a test handler"
}

7、roles 的依賴關系

????????roles 允許在使用時自動引入其他roles,role 依賴關系存儲在meta/main.yaml文件中

示例:

#安裝WordPress 項目時:
#1、需要先確保 nginx 與 php-fpm的role 都能正常運行;
#2、然后在WordPress的role中定義,依賴關系;
#3、依賴的role 有nginx 以及 php-fpm;
#4、 在WordPress的role中新建meta 目錄,編寫main.yaml文件
[root@ansible meta]# vim main.yaml
dependencies:- { role: nginx }- { role: php-fpm }
#5、在WordPress的playbook中就不需要在安裝 nginx 和php-fpm了,只寫一個 WordPress就可以了,安裝WordPress之前會自動先部署 nginx和php-fpm[root@ansible ansible]# vim roletest.yaml
---- hosts: webremote_user: rootroles:- role: WordPress

8、roles 的相互調用

????????roles 中的各項目之間的文件是可以跨項目相互調用的。跨項目調用時,需要指明要調用的role的名稱。

#要同時部署nginx 和apache 兩個項目,這倆項目使用了相同的index.html主頁文件,這個主頁文件已經在nginx項目中定義過了,若此時需要在Apache項目中引用,使用如下方式
[root@localhost  /data/roles]$vim apache/tasks/html.yml      #<==頁面配置- name: Copy Index File copy: src:roles/nginx/files/index.html    #跨項目調用路徑要寫roles的名稱dest: /var/www/nginx/html/   

十二.總結

本節內容補充了ansbile中有關playbook的內容,方便之后使用這些命令對多臺主機進行操作。


本次更新了playbook的剩余內容,包括變量,判斷等。其中最重要的是roles角色,這個在之后會經常使用,要多練習掌握這個roles的使用。

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

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

相關文章

AI驅動下的數據新基建:騰訊游戲數據資產治理與湖倉架構革新

在大模型技術迅猛發展的今天&#xff0c;AI 正深度重塑數據基礎設施&#xff0c;推動其向智能化快速演進。如何將 AI 深度融入數據管理&#xff0c;釋放數據的潛在價值、提升運營效率&#xff0c;成為企業在構建 AI 驅動的數據資產管理體系的核心問題。在近期舉辦的“DataFun A…

ubuntu 系統風扇控制軟件 CoolerControl

背景 A6000顯卡的溫度一直都是86度左右&#xff0c;GPU的風扇轉速不夠大。 我首先把 nvidia的驅動更新了&#xff0c;但是發現風扇依然依然保持在較低的轉速。 后面無意間搜到了CoolerControl 這個linux平臺的風扇控制軟件。設置之后&#xff0c;增加了風扇的轉速&#xff0c;…

Oracle 11gR2 Clusterware應知應會

Oracle 11gR2 Clusterware應知應會 關鍵特性 啟動順序 日志路徑 資源狀態 資源管理 關鍵特性 ?? Oracle 11gR2 Clusterware的一些關鍵特性如下: 在安裝運行11gR2的Real Application Clusters數據庫之前需要先安裝11gR2 Clusterware。 GRID home包括Oracle Clusterware和AS…

微信小程序蘋果手機和安卓,怎么做適配

1. 基于 rpx 單位進行布局適配微信小程序采用 rpx 作為尺寸單位&#xff0c;以實現不同設備的布局適配。小程序的屏幕寬度固定為 750rpx&#xff0c;在不同設備上通過動態計算 1rpx 對應的像素值進行適配。例如&#xff0c;在 iPhone 6 中&#xff0c;屏幕寬度為 375px&#xf…

XGBoost三部曲:XGBoost參數詳解

之前已經介紹了XGBoost三部曲:XGBoost原理。本文詳細介紹XGBoost參數,讓大家在使用XGBoost的過程中能得心應手。后續會更新XGBoost實戰,敬請期待。 文章目錄 一、核心概念回顧 二、XGBoost算法參數整體介紹 1 原生接口和Scikit-learn接口的區別 2 參數分類詳解 三、核心Boos…

【python】轉移本地安裝的python包

我們現在需要將某個環境已經安裝的 python 包離線傳遞到另外一個環境&#xff0c;且確保這種安裝行為最終不需要對 PYPI 中央倉庫的有效連接&#xff0c;也能完成。下面給出兩種辦法&#xff1a; docker container 如果你的 python 環境位于某個容器內&#xff0c;那最好的辦法…

TGD第十篇:當神經網絡遇到TGD特征

目錄一、實驗背景二、實驗設置三、實驗結果和分析四、結語TGD 是我們定義的一種新的“變化率表征”&#xff0c;對連續函數而言是一種新的“廣義導數”&#xff0c;對離散序列而言是一種新的差分。TGD 是一個名字&#xff0c;一個代號。在基于 TGD 的圖像邊緣檢測以及視頻邊緣檢…

FreeRTOS源碼分析二:task啟動(RISCV架構)

系列文章目錄 FreeRTOS源碼分析一&#xff1a;task創建&#xff08;RISCV架構&#xff09; 文章目錄系列文章目錄前言vTaskStartScheduler 調度器啟動函數xPortStartScheduler架構特定調度器啟動函數vPortSetupTimerInterrupt啟動 RISCV 定時器中斷xPortStartFirstTask啟動第一…

Python編程基礎與實踐:Python基礎運算符與表達式入門

Python運算符與表達式實戰 學習目標 通過本課程的學習&#xff0c;學員可以掌握Python中算術運算符、比較運算符、邏輯運算符及賦值運算符的使用方法&#xff0c;并能夠構建簡單的表達式來解決實際問題。 相關知識點 Python運算符與表達式 學習內容 1 Python運算符與表達式 1.1…

Git下載全攻略(未更新完)

一、在 Windows 上安裝 Git? ??? 1.1 下載安裝包? 官方版本可在 Git 官方網站下載,打開Redirecting…,下載會自動開始。此安裝包來自名為 Git for Windows 的項目(也稱作 msysGit),它與 Git 本身是相互獨立的項目,更多相關信息可訪問Redirecting Git for Windows…

rocky\centos安裝docker鏡像的命令

1.安裝依賴&#xff1a; sudo yum install -y yum-utils device-mapper-persistent-data lvm22. 選擇倉庫源&#xff1a; sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo阿里源&#xff1a; sudo yum-config-manager --add-r…

扣子,正式擁抱開源!

資料來源&#xff1a;火山引擎-開發者社區 扣子 是新一代 AI Agent 平臺&#xff0c;旗下有四款子產品&#xff1a;「扣子空間」、「扣子開發平臺」、「扣子羅盤」 及 Eino 。 我們始終堅信&#xff0c;AI Agent 的未來屬于每一位開發者和創造者。為了讓前沿的 AI 技術能夠更快…

Git 各場景使用方法總結

以下是對 Git 各場景使用方法的全面總結,涵蓋 20+ 核心場景和 100+ 命令,包含詳細參數、使用示例及原理說明: 一、基礎操作場景 1. 倉庫初始化 # 本地初始化 git init git init --bare # 創建裸倉庫(無工作區) git init -b main # 指…

國際標準組織共聚,智源推動全球AI開源與國際標準雙輪驅動人工智能普惠化發展

7 月 26 日&#xff0c;人工智能標準化國際合作論壇在上海召開。該論壇由聯合國工業發展組織全球工業人工智能聯盟卓越中心主辦&#xff0c;中國電子技術標準化研究院、上海人工智能研究院承辦&#xff0c;工業和信息化部副部長單忠德、國家市場監督管理總局標準創新管理司司長…

《安富萊嵌入式周報》第356期:H7-TOOL的250M示波器模組批量生產中,自主開發QDD執行器,開源14bit任意波形發生器(2025-07-28)

周報匯總地址&#xff1a;嵌入式周報 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬漢嵌入式論壇 - Powered by Discuz! 視頻版 《安富萊嵌入式周報》第356期&#xff1a;H7-TOOL的250M示波器模組批量生產中&#xff0c;自主開發QDD執行器&a…

大模型學習專欄-導航頁

概要 本專欄是小編系統性調研大模型過程中沉淀的知識結晶&#xff0c;涵蓋技術原理、實踐應用、前沿動態等多維度內容。為助力讀者高效學習&#xff0c;特整理此導航頁&#xff0c;以清晰脈絡串聯核心知識點&#xff0c;搭建起系統的大模型學習框架&#xff0c;助您循序漸進掌握…

leetcode熱題——組合

組合題目描述給定兩個整數 n 和 k&#xff0c;返回范圍 [1, n] 中所有可能的 k 個數的組合。你可以按 任何順序 返回答案。示例 1&#xff1a; 輸入&#xff1a;n 4, k 2 輸出&#xff1a; [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4] ]示例 2&#xff1a; 輸入&#xff1a;…

暑期算法訓練.13

目錄 57 力扣14最長公共前綴 57.1 題目解析&#xff1a; 57.2 算法思路 57.3 代碼演示&#xff1a; ?編輯 57.4 總結反思&#xff1a; 58 力扣 5最長回文字符串 58.1 題目解析&#xff1a; ?編輯 58.2 算法思路&#xff1a; 58.3 代碼演示&#xff1a; ?編輯 …

四、Portainer圖形化管理實戰與Docker鏡像原理

作者&#xff1a;IvanCodes 日期&#xff1a;2025年8月2日 專欄&#xff1a;Docker教程 一、Portainer 安裝與基礎使用教程 Portainer 是一個輕量級、功能強大的Docker圖形化管理界面 (GUI)。它能讓你通過簡單的Web界面來管理和監控你的Docker容器、鏡像、卷、網絡等資源&…

網絡爬蟲(python)入門

一、網絡爬蟲介紹 網絡爬蟲&#xff08;Web Crawler&#xff09;是一種自動抓取互聯網信息的程序&#xff0c;它能夠高效地從海量網頁中提取有價值的數據。作為數據采集的利器&#xff0c;爬蟲技術在數據分析、搜索引擎、價格監控等領域有著廣泛應用。本文將帶你全面了解Pytho…