一、模塊使用
1.1 Yum模塊
功能:管理軟件包,只支持RHEL,CentOS,fedora,不支持Ubuntu其它版本
參數 | 說明 |
---|---|
name | 要操作的軟件包名稱,支持通配符(如 httpd , nginx* ),也可以是 URL 或本地 .rpm 文件路徑。 |
state | 軟件包狀態: - present :安裝(默認) - absent :卸載 - latest :安裝最新版本 |
webow_downgrade | 是否允許降級安裝指定版本的包(默認為否)。?? 可能導致非冪等行為。 |
autoremove | 刪除不再依賴的"葉"包(僅當 state=absent 或單獨使用時有效)。 |
bugfix | 僅安裝標記為 bugfix 的更新(配合 state=latest 使用)。 |
conf_file | 指定自定義的 yum 配置文件路徑。 |
disable_excludes | 禁用 yum 配置中的排除規則(可選值:web , main , repoid )。 |
disable_gpg_check | 安裝時是否禁用 GPG 校驗(適用于測試環境)。 |
disablerepo | 操作期間臨時禁用的倉庫 ID(可以是逗號分隔字符串或列表)。 |
enablerepo | 操作期間臨時啟用的倉庫 ID(可以是逗號分隔字符串或列表)。 |
download_only | 僅下載 RPM 包而不安裝。 |
download_dir | 指定 RPM 包下載目錄(配合 download_only 使用)。 |
exclude | 排除某些包不進行操作(例如:kernel* )。 |
instweb_weak_deps | 安裝弱依賴項(僅限 yum >= 4, 如 RHEL/CentOS 8)。 |
instwebroot | 指定替代根目錄(用于 chroot 環境)。 |
list | 列出包信息(如 instwebed , updates , available 或具體包名)。 |
lock_timeout | 等待 yum 鎖釋放的最大時間(單位:秒)。 |
范例1:
ansible web -m yum -a 'name=httpd state=present' #安裝
范例2:
ansible web -m yum -a 'name=httpd state=absent' #刪除
1.2?Service模塊
功能:管理服務
參數 | 必填 | 說明 |
---|---|---|
name | ? 是 | 要操作的服務名稱(如 httpd , nginx )。 |
state | 否 | 服務狀態: - started :啟動服務 - stopped :停止服務 - restarted :重啟服務 - reloaded :重載配置 |
enabled | 否 | 是否設置為開機自啟(布爾值,yes /no ) |
pattern | 否 | 如果服務不支持 status 命令,可指定一個進程名匹配字符串(用于檢測是否運行)。 |
arguments | 否 | 啟動服務時傳遞的額外命令行參數。 |
runlevel | 否 | 僅適用于 OpenRC 系統(如 Gentoo),指定服務所屬 runlevel。 |
sleep | 否 | 在 restarted 時,stop 和 start 之間等待秒數(部分 init 腳本需要)。 |
use | 否 | 強制使用某個服務管理模塊(如 systemd , sysv , openrc ),默認自動識別。 |
范例1:
ansible web -m service -a 'name=httpd state=started enabled=yes'
范例2:
ansible web -m shell -a "sed -i 's/^Listen 80/Listen 8080/' /etc/httpd/conf/httpd.conf"
1.3?User模塊
功能:管理用戶
參數 | 必填 | 說明 |
---|---|---|
name | ? 是 | 要操作的用戶名(如 alice , bob )。 |
state | 否 | 用戶狀態: - present :創建或更新用戶(默認) - absent :刪除用戶 |
comment | 否 | 設置用戶的描述信息(GECOS 字段)。 |
home | 否 | 設置用戶的家目錄路徑。 |
shell | 否 | 設置用戶的登錄 shell(如 /bin/bash )。 |
group | 否 | 設置用戶的主組(組名)。 |
groups | 否 | 設置用戶的附加組列表(逗號分隔字符串或列表)。 若為空字符串 '' ,則移除所有附加組。 |
append | 否 | 如果為 yes ,在現有附加組基礎上添加新組;否則替換原有附加組。與 local 互斥。 |
create_home | 否 | 是否創建用戶家目錄(默認為 yes )。 |
remove | 否 | 當 state=absent 時,是否刪除用戶的家目錄和郵件文件(相當于 userdel -r )。 |
force | 否 | 強制刪除用戶(即使正在登錄或擁有運行進程),僅在支持的系統上有效。 |
password | 否 | 設置用戶密碼(需提供加密后的密碼,如使用 mkpasswd 或 openssl 生成)。 |
generate_ssh_key | 否 | 是否為用戶生成 SSH 密鑰對。 |
ssh_key_bits | 否 | 指定生成的 SSH 密鑰位數(默認 2048)。 |
ssh_key_type | 否 | 指定 SSH 密鑰類型(如 rsa , ed25519 )。 |
expires | 否 | 設置用戶過期時間(以 Unix 時間戳表示)。僅限 Linux、FreeBSD 等支持平臺。 |
system | 否 | 是否創建為系統用戶(UID 小于系統設定閾值)。 |
uid | 否 | 指定用戶的 UID。 |
login_class | 否 | 設置 BSD 系統上的登錄類(如 FreeBSD)。 |
local | 否 | 強制使用本地命令(如 luseradd )操作本地用戶數據庫,適用于集中認證環境。與 groups 和 append 互斥。 |
move_home | 否 | 若更改了 home ,是否移動原家目錄到新路徑。 |
范例1:
ansible web -m user -a 'name=user1 comment="test user" uid=2048 home=/app/user1 group=root'
1.4?Group模塊
功能:管理組
參數 | 必填 | 說明 |
---|---|---|
name | ? 是 | 要操作的組名(如 developers , admins )。 |
state | 否 | 組狀態: - present :創建組(默認) - absent :刪除組 |
gid | 否 | 設置組的 GID(組 ID)。 |
non_unique | 否 | 如果設置了 gid ,允許使用非唯一 GID(僅限 Linux,不支持 macOS 或 BusyBox)。 |
system | 否 | 若為 yes ,則創建一個系統組(通常 GID 小于系統設定的閾值)。 |
local | 否 | 強制使用本地命令(如 lgroupadd )來操作本地組數據庫,適用于集中認證環境。 |
范例1:
#創建組
ansible web -m group -a 'name=nginx gid=88 system=yes'
#刪除組
ansible web -m group -a 'name=nginx state=absent'
1.5?Lineinfile模塊
ansible在使用sed進行替換時,經常會遇到需要轉義的問題,而且ansible在遇到特殊符號進行替換時,存在問題,無法正常進行替換 。其實在ansible自身提供了兩個模塊:lineinfile模塊和replace模塊,可以方便的進行替換
功能:相當于sed,可以修改文件內容
參數 | 必填 | 說明 |
---|---|---|
dest 或 path | ? 是 | 要操作的目標文件路徑。 |
state | 否 | 行的狀態: - present :確保該行存在(默認) - absent :刪除匹配的行 |
regexp | 否 | 正則表達式,用于匹配文件中的一行或多行。如果未提供,默認匹配整行內容。 |
line | 否(當 state=present 時必填) | 要插入或替換的文本行。 |
backup | 否 | 修改前創建備份文件(帶時間戳)。 |
create | 否 | 如果文件不存在且 state=present ,是否創建文件。 |
insertafter | 否 | 當 state=present 且沒有匹配到 regexp 時,在匹配該正則的 最后一行之后 插入新行。可使用 EOF 插入到文件末尾。 |
insertbefore | 否 | 類似 insertafter ,但在匹配的行 之前 插入。可使用 BOF 插入到文件開頭。 |
firstmatch | 否 | 若為 yes ,在 insertafter 或 insertbefore 中只匹配第一個符合條件的行。 |
backrefs | 否 | 若為 yes ,允許 line 中使用正則捕獲組(配合 regexp 使用),僅當匹配時替換并更新行。否則不修改文件。 |
group | 否 | 設置文件所屬的用戶組。 |
owner | 否 | 設置文件所屬的用戶。 |
mode | 否 | 設置文件權限(如 0644 , 0755 )。 |
attributes | 否 | 設置文件屬性(如通過 chattr 設置的屬性)。 |
范例:
ansible web -m lineinfile -a "path=/etc/selinux/config regexp='^SELINUX=' line='SELINUX=enforcing'"ansible web -m lineinfile -a 'dest=/etc/fstab state=absent regexp="^#"'
1.6?Replace模塊
該模塊有點類似于sed命令,主要也是基于正則進行匹配和替換
參數 | 必填 | 說明 |
---|---|---|
path | ? 是 | 要操作的目標文件路徑。 |
regexp | ? 是 | 正則表達式,用于匹配需要替換的內容(Python 風格)。 使用 MULTILINE 模式:^ /$ 匹配每行開頭/結尾。 |
replace | 否 | 替換后的內容,可以包含正則捕獲組引用(如 \1 , (?P<name>...) )。若未設置,則匹配內容會被刪除。 |
backup | 否 | 若為 yes ,在修改前創建帶時間戳的備份文件。 |
after | 否 | 只替換在此正則匹配內容之后的部分(配合 before 使用)。 |
before | 否 | 只替換在此正則匹配內容之前的部分(配合 after 使用)。 |
encoding | 否 | 文件的字符編碼(如 utf-8 , latin1 等)。 |
group | 否 | 設置文件所屬的用戶組。 |
owner | 否 | 設置文件所屬的用戶。 |
mode | 否 | 設置文件權限(如 0644 , 0755 或符號模式如 u=rw,g=r,o=r )。 |
attributes | 否 | 設置文件屬性(如通過 chattr 設置的屬性)。 |
范例:
ansible web -m replace -a "path=/etc/fstab regexp='^(UUID.*)' replace='#\1'"
ansible web -m replace -a "path=/etc/fstab regexp='^#(.*)' replace='\1'"
1.7?Setup模塊
功能: setup 模塊來收集主機的系統信息,這些 facts 信息可以直接以變量的形式使用.
但是如果主機較多,會影響執行速度,可以使用gather_facts: no
來禁止 Ansible 收集 facts 信息
參數 | 必填 | 說明 |
---|---|---|
filter | 否 | 使用通配符(shell 風格,如 ansible_distribution* )過濾輸出的 facts。 |
gather_subset | 否 | 指定要收集的 fact 子集: - web :全部(默認) - min :最小基礎信息 - hardware :硬件相關信息 - network :網絡相關信息 - virtual :虛擬化信息 - facter / ohai :兼容 Puppet Facter 或 Chef Ohai 可使用 ! 排除子集,如 !network |
gather_timeout | 否 | 設置每個 fact 收集的最大時間(秒),防止因某些模塊卡頓導致整體超時。 |
fact_path | 否 | 自定義本地自定義 facts 腳本路徑(.fact 文件),支持 JSON 或 INI 格式。 |
范例:
ansible web -m setup
ansible web -m setup -a "filter=ansible_nodename"
ansible web -m setup -a "filter=ansible_hostname"
ansible web -m setup -a "filter=ansible_domain"
ansible web -m setup -a "filter=ansible_memtotal_mb"
ansible web -m setup -a "filter=ansible_memory_mb"
ansible web -m setup -a "filter=ansible_memfree_mb"
ansible web -m setup -a "filter=ansible_os_family"
ansible web -m setup -a "filter=ansible_distribution_major_version"
ansible web -m setup -a "filter=ansible_distribution_version"
ansible web -m setup -a "filter=ansible_processor_vcpus"
ansible web -m setup -a "filter=ansible_web_ipv4_addresses"
ansible web -m setup -a "filter=ansible_architecture"
ansible web -m setup -a "filter=ansible_processor*"
范例:
[root@ansible ~]#ansible web -m setup -a 'filter=ansible_python_version'
10.0.0.7 | SUCCESS => {"ansible_facts": {"ansible_python_version": "2.7.5","discovered_interpreter_python": "/usr/bin/python"},"changed": false
}
10.0.0.6 | SUCCESS => {"ansible_facts": {"ansible_python_version": "2.6.6","discovered_interpreter_python": "/usr/bin/python"},"changed": false
}
10.0.0.8 | SUCCESS => {"ansible_facts": {"ansible_python_version": "3.6.8","discovered_interpreter_python": "/usr/libexec/platform-python"},"changed": false
}
[root@ansible ~]#
二、playbook介紹
2.1 介紹
playbook 劇本是由一個或多個“play”組成的列表。
play的主要功能在于將預定義的一組主機,裝扮成事先通過ansible中的task定義好的角色。Task實際是調用ansible的一個module,將多個play組織在一個playbook中,即可以讓它們聯合起來,按事先編排的機制執行預定義的動作。
Playbook 文件是采用YAML語言編寫的。
2.2?YAML 語言
YAMl 語言介紹
YAML是一個可讀性高的用來表達資料序列的格式。YAML參考了其他多種語言,包括:XML、C語言、Python、Perl以及電子郵件格式RFC2822等。
Clark Evans在2001年在首次發表了這種語言,另外Ingy d?t Net與Oren Ben-Kiki也是這語言的共同設計者,目前很多軟件中采有此格式的文件,如:ubuntu,anisble,docker,k8s等。
YAML:YAML Ain’t Markup Language,即YAML不是XML。不過,在開發的這種語言時,YAML的意思其實是:"Yet Another Markup Language"(仍是一種標記語言)
YAML 語言特性
-
YAML的可讀性好
-
YAML和腳本語言的交互性好
-
YAML使用實現語言的數據類型
-
YAML有一個一致的信息模型
-
YAML易于實現
-
YAML可以基于流來處理
-
YAML表達能力強,擴展性好
YAML語法簡介
-
在單一文件第一行,用連續三個連字號“-” 開始,還有選擇性的連續三個點號( … )用來表示文件的結尾
-
次行開始正常寫Playbook的內容,一般建議寫明該Playbook的功能
-
使用#號注釋代碼
-
縮進必須是統一的,不能空格和tab混用
-
縮進的級別也必須是一致的,同樣的縮進代表同樣的級別,程序判別配置的級別是通過縮進結合換行來實現的 YAML文件內容是區別大小寫的,key/value的值均需大小寫敏感
-
多個key/value可同行寫也可換行寫,同行使用,分隔
-
v可是個字符串,也可是另一個列表
-
一個完整的代碼塊功能需最少元素需包括 name 和 task
-
一個name只能包括一個task
-
YAML文件擴展名通常為yml或yaml
YAML的語法和其他高階語言類似,并且可以簡單表達清單、散列表、標量等數據結構。
其結構(Structure)通過空格來展示,序列(Sequence)里的項用"-"來代表,Map里的鍵值對用":"分隔,下面介紹常見的數據結構。
List列表
列表由多個元素組成,每個元素放在不同行,且元素前均使用“-”打頭,或者將所有元素用 [ ] 括起來放在同一行
范例:
fruits:- Apple- Orange- Strawberry- Mangofruits:[Apple,Orange,Strawberry,Mango]
Dictionary字典
字典由多個key與value構成,key和value之間用 :分隔,所有k/v可以放在一行,或者每個 k/v 分別放在不同行
范例:
name: John Smith
age: 41
gender: Male
spouse:name: Jane Smithage: 37gender: Female
children:- name: Jimmy Smithage: 17gender: Male- name: Jenny Smithage: 13gender: Female
?
2.3?Playbook核心元素
-
Hosts 執行的遠程主機列表
-
Tasks 任務集
-
Variables 內置變量或自定義變量在playbook中調用
-
Templates 模板,可替換模板文件中的變量并實現一些簡單邏輯的文件
-
Handlers 和 notify 結合使用,由特定條件觸發的操作,滿足條件方才執行,否則不執行
-
tags 標簽 指定某條任務執行,用于選擇運行playbook中的部分代碼。ansible具有冪等性,因此會自動跳過沒有變化的部分,即便如此,有些代碼為測試其確實沒有發生變化的時間依然會非常地長。此時,如果確信其沒有變化,就可以通過tags跳過此些代碼片斷
hosts 組件
Hosts:playbook中的每一個play的目的都是為了讓特定主機以某個指定的用戶身份執行任務。hosts用于指定要執行指定任務的主機,須事先定義在主機清單中
案例:
- hosts: web:appsrvs
remote_user 組件
remote_user: 可用于Host和task中。也可以通過指定其通過sudo的方式在遠程主機上執行任務,其可用于play全局或某任務;此外,甚至可以在sudo時使用sudo_user指定sudo時切換的用戶
- hosts: webremote_user: jyxtasks:- name: test connectionping: remote_user: sp sudo: yes sudo_user: wang
task列表和action組件
play的主體部分是task list,task list中有一個或多個task,各個task 按次序逐個在hosts中指定的所有主機上執行,即在所有主機上完成第一個task后,再開始第二個task
task的目的是使用指定的參數執行模塊,而在模塊參數中可以使用變量。
模塊執行是冪等的,這意味著多次執行是安全的,因為其結果均一致
每個task都應該有其name,用于playbook的執行結果輸出,建議其內容能清晰地描述任務執行步驟。
如果未提供name,則action的結果將用于輸出
task兩種格式:
(1) action: module arguments
(2) module: arguments 建議使用
注意:shell和command模塊后面跟命令,而非key=value
范例:
---
- hosts: webremote_user: roottasks:- name: instweb httpdyum: name=httpd- name: start httpdservice: name=httpd state=started enabled=yes
其它組件
某任務的狀態在運行后為changed時,可通過“notify”通知給相應的handlers
任務可以通過"tags“打標簽,可在ansible-playbook命令上使用-t指定進行調用
ShellScripts VS Playbook 案例
#SHELL腳本實現
#!/bin/bash
# 安裝Apache
yum install -y httpd
# 復制配置文件
cp /tmp/httpd.conf /etc/httpd/conf/httpd.conf
cp/tmp/vhosts.conf /etc/httpd/conf.d/
# 啟動Apache,并設置開機啟動
systemctl enable --now httpd #Playbook實現
---
- hosts: webremote_user: roottasks:- name: "安裝Apache"yum: name=httpd- name: "復制配置文件"copy: src=/tmp/httpd.conf dest=/etc/httpd/conf/- name: "復制配置文件"copy: src=/tmp/vhosts.conf dest=/etc/httpd/conf.d/- name: "啟動Apache,并設置開機啟動"service: name=httpd state=started enabled=yes
2.4?playbook 命令
格式
ansible-playbook <filename.yml> ... [options]
常見選項
-C --check #只檢測可能會發生的改變,但不真正執行操作
--list-hosts #列出運行任務的主機
--list-tags #列出tag
--list-tasks #列出task
--limit 主機列表 #只針對主機列表中的主機執行
-v -vv -vvv #顯示過程
范例:
ansible-playbook file.yml --check #只檢測
ansible-playbook file.yml
ansible-playbook file.yml --limit web
Playbook 初步
利用 playbook 創建 mysql 用戶
范例:mysql_user.yml
---
- hosts: dbremote_user: roottasks:- name: create groupgroup: name=mysql system=yes gid=306- name: create useruser: name=mysql shell=/sbin/nologin system=yes group=mysql uid=306 home=/data/mysql create_home=no
利用 playbook 安裝 nginx
范例:instweb_nginx.yml
---
# instweb nginx
- hosts: webremote_user: root tasks:- name: add group nginxgroup: name=nginx state=present- name: add user nginxuser: name=nginx state=present group=nginx- name: Instweb Nginxyum: name=nginx state=present- name: web pagecopy: src=files/index.html dest=/usr/share/nginx/html/index.html- name: Start Nginxservice: name=nginx state=started enabled=yes
利用 playbook 安裝和卸載 httpd
范例:instweb_httpd.yml
---
#instweb httpd
- hosts: webremote_user: rootgather_facts: notasks:- name: Instweb httpdyum: name=httpd state=present- name: Instweb configure filecopy: src=files/httpd.conf dest=/etc/httpd/conf/- name: web htmlcopy: src=files/index.html dest=/var/www/html/- name: start serviceservice: name=httpd state=started enabled=yesansible-playbook instweb_httpd.yml --limit 10.0.0.8
范例:remove_httpd.yml
#remove_httpd.yml
---
- hosts: webremote_user: roottasks:- name: remove httpd packageyum: name=httpd state=absent- name: remove apache user user: name=apache state=absent- name: remove config filefile: name=/etc/httpd state=absent- name: remove web htmlfile: name=/var/www/html/index.html state=absent
利用 playbook 結合shell安裝mysql
[root@ansible ~]#cat /data/ansible/instweb_mysql.yml
---
# instweb mysql-8
- hosts: dbremote_user: rootgather_facts: notasks:- name: copy shellscript: /soft/instweb_mysql.sh