banner
云野阁

云野阁

闲云野鹤,八方逍遥

Ansible知識梳理

🔜什麼是Ansible?🔚

Ansible 是一款 IT 自動化工具。主要應用場景有配置系統、軟體部署、持續發布及不停服平滑滾動更新的高級任務編排。

Ansible 提供開源自動化,可降低複雜性並在任何地方運行。使用 Ansible 可以自動執行幾乎任何任務。

架構#

Ansible:Ansible 核心程序。
HostInventory:記錄由 Ansible 管理的主機信息,包括端口、密碼、ip 等。
Playbooks:“劇本” YAML 格式文件,多個任務定義在一個文件中,定義主機需要調用哪些模塊來完成的功能。
CoreModules核心模塊,主要操作是通過調用核心模塊來完成管理任務。
CustomModules:自定義模塊,完成核心模塊無法完成的功能,支持多種語言。
ConnectionPlugins:連接插件,Ansible 和 Host 通信使用

1

Ansible 重要概念#

控制節點#

控制節點是運行 Ansible Ansible CLI 工具的機器。它負責與受控節點(被管理節點)進行通信,發出命令並執行任務。

受控節點(被管理節點)#

也稱為 “主機”,這些是用 Ansible 管理的目標設備。Ansible 控制節點會在這些機器上執行任務。受控節點不需要安裝任何代理。

庫存 (Inventory)#

包含要管理的目標主機或節點的清單。它是 Ansible 用來定義目標主機信息的配置文件,支持靜態或動態的主機清單。它還用於分配組,這既允許在劇集中選擇節點,也允許批量分配變量。

劇本(Playbook)#

Playbook 是 Ansible 配置管理的核心部分,是一組用於自動化執行任務的 YAML 文件。Playbook 可以執行多個步驟(例如安裝軟體、啟動服務等),並定義執行順序、任務等。

模塊 (Modules)#

模塊是 Ansible 中執行實際任務的單元。它們是高度可重用的代碼塊,負責執行特定的操作(如安裝軟體包、配置文件等)。

角色 (Roles)#

角色是 Playbook 的一種組織方式,用於把多個任務、文件、模板、變量等組織成一個完整的功能模塊。角色幫助將複雜的配置拆分成可重用的組件。可在劇集內部使用的可重用 Ansible 內容。

任務 (Tasks)#

任務是 Playbook 中定義的具體操作。每個任務通常會調用一個 Ansible 模塊來執行特定的操作。是 ad-hoc 更適合臨時執行命令的執行場景。

插件#

擴展 Ansible 核心功能的代碼片段。插件可以控制您如何連接到被管理節點(連接插件)、操作數據(過濾器插件),甚至控制在控制台中顯示的內容(回調插件)。

集合#

Ansible 內容的分發格式,可以包含劇本、角色、模塊和插件。

Ansible 任務執行模式#

Ansible 系統由控制主機對被管節點的操作方式可分為兩類,即ad-hocplaybook

  • ad-hoc 模式 (點對點模式)
      使用單個模塊,支持批量執行單條命令。ad-hoc 命令是一種可以快速輸入的命令,而且不需要保存起來的命令。
  • playbook 模式 (劇本模式)
      是 Ansible 主要管理方式,也是 Ansible 功能強大的關鍵所在。playbook 通過多個 task 集合完成一類功能。可以簡單地把 playbook 理解為通過組合多條 ad-hoc 操作的配置文件。

Ansible 安裝(centos 7)#

修改系統鏡像源為阿里雲鏡像源

cd /etc/yum.repos.d
mv CentOS-Base.repo CentOS-Base.repo.bak
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

方式一:使用 yum 安裝#

安裝epel-release包與Ansible

yum install epel-release -y
yum install ansible -y
#查看版本
 ansible --version

方式二:使用 pip 安裝#

yum install python3 python3-devel python3-pip -y
python3 -m pip install ansible
#查看版本
 ansible --version

Ansible 配置文件#

配置文件讀取的優先級順序如下:

  1. 檢查環境變量ANSIBLE_CONFIG指向的路徑文件 (export ANSIBLE_CONFIG=xxxx);
  2. 檢查當前項目目錄下的 ansible.cfg 配置文件;
  3. ~/.ansible.cfg,檢查當前目錄下的 ansible.cfg 配置文件;
  4. /etc/ansible/ansible.cfg檢查 etc 目錄的配置文件。

Ansible 免密登錄#

root 用戶#

控制節點設置 ssh 免密登錄,並將密鑰傳至受控節點上。

ssh-keygen -t dsa -f ~/.ssh/id_dsa -P ""
ssh-copy-id -i ~/.ssh/id_dsa.pub root@受控主機ip

普通用戶#

控制節點和被控節點都要有普通用戶,此處以test用戶為例。

#添加test用戶,並設置密碼
useradd test
passwd test

在控制節點設置 ssh 免密登錄,並將密鑰傳至受控節點。

ssh-keygen -t dsa -f ~/.ssh/id_dsa -P ""
ssh-copy-id -i ~/.ssh/id_dsa.pub test@受控主機ip

修改所有主機的test用戶的 sudo 權限。

visudo
test    ALL=(ALL)       NOPASSWD: ALL

修改控制節點的配置文件/etc/ansible/ansible.cfg,設置普通用戶權限提升。

vi /etc/ansible/ansible.cfg
#將以下內容註釋取消
[privilege_escalation]
become=True   #啟用權限提升
become_method=sudo  #通過 sudo 提升到 root 用戶的權限
become_user=root  #作為 root 用戶執行任務
become_ask_pass=False  #禁用密碼提示

Ansible Ad-Hoc 與常用模塊#

Ad-Hoc#

ad-hoc 即為命令行模式,執行完即結束。

命令語法結構:

ansible 'groups' -m command -a 'df -h', 其含義如下圖:

2

執行過程:

  1. 加載配置文件,默認/etc/ansible/ansible.cfg;
  2. 查找對應的主機配置文件,找到要執行的主機或者組:
  3. 加載對應的模塊文件,如command;
  4. 通過ansible將模塊或命令生成對應的臨時py文件,並將該文件傳輸至遠程伺服器對應執行用戶$HOME/.ansible/tmp/ansible-tmp-number/XXX.PY;
  5. 遠程主機執行該文件;
  6. 執行並返回結果;
  7. 刪除臨時py文件,sleep 0退出;

執行狀態:

使用 ad-hoc 執行一次遠程命令,注意觀察返回結果的顏色:

  • 綠色:代表受控節點沒有被修改
  • 黃色:代表受控節點發現變更
  • 紅色:代表出現了故障,注意查看提示

常用模塊#

command 模塊#

基本格式和常用參數

ansible '組/IP' -m command -a '[參數] 命令'
參數選項含義
chdirchdir /opt執行 ansible 時,切換到指定目錄
createscreates /data/file如果文件存在,則跳過執行
removesremoves /data/file如果文件存在,則執行

[root@121 ~]# ansible webservers -m command -a 'ls /root'

192.168.1.122 | CHANGED | rc=0 >>
anaconda-ks.cfg
test.txt
192.168.1.121 | CHANGED | rc=0 >>
anaconda-ks.cfg
test

[root@121 ~]# ansible webservers -m command -a 'creates=/root/test.txt hostname'
192.168.1.122 | SUCCESS | rc=0 >>
skipped, since /root/test.txt exists
192.168.1.121 | CHANGED | rc=0 >>
121
[root@121 ~]# ansible webservers -m command -a 'removes=/root/test.txt hostname'
192.168.1.122 | CHANGED | rc=0 >>
122
192.168.1.121 | SUCCESS | rc=0 >>
skipped, since /root/test.txt does not exist
[root@121 ~]#

shell 模塊支持管道符,command 模塊不支持

shell 模塊#

基本格式和常用參數

ansible '組/IP/all' -m shell -a '[參數] 命令'

ansible webservers -m shell -a 'ps aux | grep sshd'

yum/apt 模塊#

常用參數功能
name需要安裝的服務名
state=present (缺省值)/absent狀態,abasent 表示卸載服務

#安裝服務

ansible webservers -m yum -a 'name=httpd'

#卸載服務

ansible webservers -m yum -a 'name=httpd state=absent'

copy 模塊#

基本格式和常用參數

ansible < > -m copy -a 'src=   dest=   [owner= ] [mode=]   '
常用參數功能注意事項
src指定源文件的路徑(支持目錄或文件)若源為目錄,目標也需為目錄
dest指定目標文件的位置(必須為絕對路徑)1. 若源為目錄,目標需為目錄 2. 目標文件已存在時會覆蓋原內容
mode設置目標文件的權限
owner設置目標文件的屬主
group設置目標文件的屬組
content直接指定目標文件的內容不可與 src 參數同時使用

ansible dbservers -m copy -a 'src=/etc/fstab dest=/opt/fstab.bak owner=root mode=640'
ansible dbservers -a 'ls -l /opt'
ansible dbservers -a 'cat /opt/fstab.bak'

systemd 模塊#

常用參數功能
name指定需要控制的服務名稱
state指定服務狀態,可選值:stoppedstartedreloadedrestartedstatus
enabled設置服務是否開機啟動,yes 為啟動,no 為不啟動
daemon_reload設為 yes 時重啟 systemd 服務,使 unit 文件生效

ansible webservers -m systemd -a 'name=firewalld state=started'

file 模塊#

基本格式和常用參數

ansible < > -m file -a ''
常用參數功能备注
path指定遠程伺服器的路徑也可寫成 destname
state定義操作類型:- directory:創建目錄 - touch:創建文件 - link:創建軟鏈接 - hard:創建硬鏈接 - absent:刪除目錄 / 文件 / 鏈接
mode設置文件 / 目錄權限默認值:- 文件 644- 目錄 755
owner設置屬主默認 root
group設置屬組默認 root
recurse遞歸修改yes 或 no
src目標主機上的源文件(與 copy 模塊不同)

#創建 /data 目錄,授權 test 屬組

ansible webservers -m file -a 'owner=test group=test mode=644 path=/data state=directory recurse=yes '

group 模塊#

基本格式和常用參數

ansible <組/IP/all> -m group -a ' '
參數功能可選值 / 說明
name指定用戶名(必選參數)
state控制帳號的創建或刪除present:創建帳號absent:刪除帳號
system指定是否為系統帳號yes:系統帳號no:普通帳號
gid指定組 ID(修改用戶所屬組)數值格式(如 1001

ansible webservers -m group -a 'name=www gid=666 state=present '

user 模塊#

基本格式和常用參數

ansible <組/IP/all> -m user -a ' '
參數功能可選值 / 說明
name指定用戶名(必選)
state控制帳號的創建或刪除present:創建absent:刪除
system指定是否為系統帳號yes:系統帳號(如 mysqlno:普通帳號
uid指定用戶 UID數值(如 1001),需唯一
group指定用戶基本組組名或 GID(需提前存在)
groups指定用戶所屬附加組組名列表(如 groups=wheel,admin
shell設置用戶默認 shell路徑(如 /bin/bash
create_home是否創建家目錄yes:自動創建no:不創建(默認行為可能依賴系統)
password設置用戶密碼建議使用加密後的字符串(如 password="$6$加密字符串"
remove刪除用戶時是否同時刪除家目錄(需state=absentyes:刪除家目錄no:保留

1、 創建 www 用戶,指定 uid666, 基本組 www

ansible webservers -m user -a 'name=www uid=666 group=www shell=/sbin/nologin create home=no'

2、 創建 db 用戶,基本組是 root, 附加組,adm,sys

ansible webservers -m user -a 'name=db group=root groups=adm,sys append=yes shell=/bin/bash create_home=yes'

3、 創建一個 ddd 用戶,密碼 123,需要正常登錄系統

(1)密碼加密

ansible localhost -m debug -a "msg={{ '123' | password_hash('sha512', 'salt123') }}"
參數作用注意事項
sha512指定哈希算法(推薦)支持 sha256/md5 等,但 sha512 更安全 2
salt123自定義鹽值鹽值需為字母 / 數字,含 -_ 會導致哈希失敗(返回 *0) 5
password_hash 過濾器將明文密碼轉為加密字符串需通過 {{ }} 調用且與變量用 `

localhost | SUCCESS => {
"msg": "$6$salt123$c806NQq6Oqk29MjZdmHxTw7sK3BB1K498o7sZC47UiwQmjx5NJyi5ZhWWGngXf3UfyELHQ1wRJ//oW/Y94azv0"
}

(2)撰寫創建命令,完成創建

ansible webservers -m user -a "name=ddd password=第一步獲取的加密密碼 shell=/bin/bash create_home=yes"

4、 創建一個 dev 用戶,並為其生成對應的秘鑰

ansible webservers -m user -a 'name=dev generate_ssh_key=yes ssh_key_bits=2048 ssh_key_file=.ssh/id_rsa'

mount 模塊#

常用參數功能
src指定要掛載的設備或分區路徑。
path指定要掛載到的目標路徑。
fstype指定要掛載的文件系統類型。
state指定掛載狀態,可選值為 mounted、(臨時掛載)present(永久掛載)、unmounted (臨時卸載)或 absent(卸載)。
opts指定掛載選項,例如掛載選項或參數。

#將 192.168.1.121 上的 /nfs 目錄掛載到 192.168.1.122 的 /nfs 目錄

ansible 192.168.1.122 -m mount -a 'src=192.168.1.121:/nfs path=/nfs fstype=nfs opts=defaults state=present '

cron 模塊#

基本格式和常用參數

ansible <組/IP/all> -m cron -a ' '
常用參數功能
minute/hour/day/month/weekday分 / 時 / 日 / 月 / 周
job任務計劃要執行的命令
name任務計劃的名稱
user指定計劃任務屬於哪個用戶,默認是 root 用戶
statepresent 表示添加(可以省略),absent 表示移除。

#添加一個每天 19 點執行 /data/test.sh 腳本的定時任務,任務名為 script-test。

ansible webservers -m cron -a 'name="script-test" hour=19 minute=00 job="/bin/bash /data/test.sh" '

#註釋該定時任務

ansible webservers -m cron -a 'name="script-test" hour=19 minute=00 job="/bin/bash /data/test.sh" disabled=yes '

#刪除該定時任務

ansible webservers -m cron -a 'name="script-test" hour=19 minute=00 job="/bin/bash /data/test.sh" state=absent '

archive 模塊#

常用參數功能
path指定要打包的源目錄或文件的路徑。
dest指定打包文件的輸出路徑。
format指定打包文件的格式,可以是 zip、tar、gz 或 bzip2。默認為 tar 格式。
remove指定是否在打包文件之後,刪除源目錄或文件。可選值為 yes 或 no。默認為 no,即不刪除源目錄或文件。

unarchive 模塊#

常用參數功能
copy指定是否將打包文件複製到遠程節點以進行解壓縮。
remote_src(已棄用) 改用 copy 參數。
src指定要解壓縮的打包文件路徑,可以是本地路徑或遠程路徑。
dest指定要將文件解壓縮到的目標目錄。
creates指定一個文件路徑,如果該文件已經存在,則不進行解壓縮操作。
remote_tmp用於指定遠程節點上的臨時目錄。默認為 /tmp

1、 將控制端的壓縮包,解壓到被控端:

ansible webservers -m unarchive -a 'src=./test.tar.gz dest=/mnt'
2、 將被控端的壓縮包解壓到被控端:

ansible webservers -m unarchive -a 'src=/tmp/config_vpn_new.zip dest=/mnt remote_src=yes'

lineinfile 模塊#

含義:替換 | 追加 | 刪除

參數选项含義
path指定要操作的目標文件路徑
regexp使用正則表達式匹配文件中的行
line指定要修改或插入的新文本內容
insertafter將文本插入到「正則匹配行」之後
insertbefore將文本插入到「正則匹配行」之前
stateabsent /present (默認)absent刪除匹配行,present確保文本存在
backrefsyes / noyes啟用正則後向引用,no未匹配時不操作文件
backup修改前是否創建備份文件(布爾值)
create當目標文件不存在時是否創建新文件(布爾值)

1、替換 httpd.conf 文件中,Listen 為 Listen8080;

ansible webservers -m lineinfile -a 'path=/etc/httpd/conf/httpd.conf regexp="^Listen" line="Listen 8080"'

2、 給主機增加一個網關:

ansible webservers -m lineinfile -a 'path=/etc/sysconfig/network-scripts/ifcfg-eth1 line="GATEWAY=172.16.1.200"'
3、 刪除主機的網關:

ansible webservers -m lineinfile -a 'path=/etc/sysconfig/network-scripts/ifcfg-ethl regexp="^GATEWAY" state=absent'

Ansible Playbook#

playbook 是一個由 yml 語法編寫的文本文件,它由playtask兩部分組成。
play:主要定義要操作主機或者主機組。

task:主要定義對主機或主機組具體執行的任務,可以是一個任務,也可以是多個任務 (模塊)。

playbook 是由一個或多個 play 組成,一個 play 可以包含多個 task 任務。

可以理解為:使用多個不同的模塊來共同完成一件事情。

Playbook 書寫格式#

playbook 是由 yml 語法書寫,結構清晰,可讀性強。

語法描述
縮進YAML 使用固定的縮進風格表示層級結構,每個縮進由兩個空格組成,不能使用 tabs
冒號以冒號結尾的除外,其他所有冒號後面必須有空格
短橫線表示列表項,使用一個短橫杠加一個空格。多個項使用同樣的縮進級別作為同一列表

Playbook 應用實例:#

安裝 nignx#

(1)撰寫 playbook 文件

vi nginx.yml

- hosts: webservers
  tasks:
    - name: 安裝nignx
      yum:
        name: nginx
        state: present
    - name: 啟動nignx
      systemd:
        name: nginx
        state: started
        enabled: yes

(2)檢查文件是否有語法錯誤

ansible-playbook --syntax nginx.yml

ansible-playbook --syntax-check nginx.yml

[root@121 data]# ansible-playbook --syntax nginx.yml

playbook: nginx.yml

(3)進行模擬執行

ansible-playbook -C nginx.yml

[root@121 data]# ansible-playbook -C nginx.yml

PLAY [webservers] **************************************************************

TASK [Gathering Facts] *********************************************************
ok: [192.168.1.122]
ok: [192.168.1.121]

TASK [安裝 nignx] *****************************************************************
changed: [192.168.1.122]
changed: [192.168.1.121]

TASK [啟動 nignx] *****************************************************************
changed: [192.168.1.121]
changed: [192.168.1.122]

PLAY RECAP *********************************************************************
192.168.1.121 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.1.122 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

(4)實際執行

ansible-playbook nginx.yml

[root@121 data]# ansible-playbook nginx.yml

PLAY [webservers] **************************************************************

TASK [Gathering Facts] *********************************************************
ok: [192.168.1.122]
ok: [192.168.1.121]

TASK [安裝 nignx] *************************************************************** **
changed: [192.168.1.121]
changed: [192.168.1.122]

TASK [啟動 nignx] *****************************************************************
changed: [192.168.1.122]
changed: [192.168.1.121]

PLAY RECAP *********************************************************************
192.168.1.121 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.1.122 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

安裝 NFS 服務#

任務順序:

  • 下載 nfs 程序
  • 掛載 nfs 配置文件(設置觸發器,修改配置文件後,使配置重啟生效)
  • 初始化設置 nfs(設置用戶、組、授權)
  • 啟動 nfs

設置的觸發器是 handles,在第二步中添加 notify 信息,當配置文件修改時,handles 獲取 notify 中的信息,重啟 nfs 服務,使得配置重新生效

文件準備:

#創建目錄存放該項目
mkdir nfs
#創建nfs配置文件,將以下內容寫入
vi exports.j2

/ansible_test 192.168.1.0/24(rw,all_squash,anonuid=7777,anongid=7777)

將 ansible 的配置文件ansible.cfghosts,提前放置在該項目目錄下

創建 nfs 劇本

vi nfs.yml

- hosts: webservers
  tasks:
    - name: download nfs
      yum:
        name: nfs-utils
        state: present
    - name: configure nfs
      copy:
        src: ./exports.j2
        dest: /etc/exports
      notify: restart nfs  #觸發信息
    - name: init group
      group:
        name: bbb
        gid: 7777
    - name: init user
      user:
        name: bbb
        uid: 7777
        group: bbb
        shell: /sbin/nologin
        create_home: no
    - name: init directory
      file:
        path: /ansible_test
        state: directory
        owner: bbb
        group: bbb
        mode: "0755"
    - name: start nfs
      systemd:
        name: nfs
        state: started
        enabled: yes
  handlers:  #觸發器
    - name: restart nfs
      systemd:
        name: nfs
        state: restarted

執行並驗證

 ansible-playbook --syntax-check nfs.yml
 ansible-playbook -C nfs.yml
 ansible-playbook nfs.yml
 
 #查看nfs服務
 showmount -e 192.168.1.121
 showmount -e 192.168.1.122
 
 #掛載測試
 mount -t nfs 192.168.1.121:/ansible_test /data/test
 mount -t nfs 192.168.1.122:/ansible_test /data/test1

[root@121 ~]# df -h
文件系統 容量 已用 可用 已用 % 挂載點
devtmpfs 898M 0 898M 0% /dev
tmpfs 910M 0 910M 0% /dev/shm
tmpfs 910M 9.7M 901M 2% /run
tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/mapper/centos-root 17G 1.7G 16G 10% /
/dev/sda1 1014M 153M 862M 16% /boot
tmpfs 182M 0 182M 0% /run/user/0
192.168.1.121:/ansible_test 17G 1.7G 16G 10% /data/test
192.168.1.122:/ansible_test 17G 2.2G 15G 13% /data/test1

安裝 rsync 服務#

rsync 服務端:#

任務順序:

  • 下載 rsync 程序
  • 掛載 rsync 配置文件(設置觸發器,修改配置文件後,使配置重啟生效)
  • 初始化設置 rsync(設置用戶、組、授權)
  • 創建虛擬用戶和密碼
  • 啟動 rsync

設置的觸發器是 handles,當配置文件或虛擬用戶密碼修改時,handles 獲取 notify 中的信息,重啟 rsync 服務,使得配置重新生效

文件準備:

#創建目錄存放該項目
mkdir rsync
#複製rsync配置文件rsyncd.conf並修改(可先手動下載rsync,拷貝配置文件後再卸載,也可直接使用以下內容)

uid = ansible_www
gid = ansible_www
port = 873
fake super = yes
use chroot = yes
max connections = 4
timeout = 900
read only = false
list = false
auth users = rsync_backup
secrets file = /etc/rsync.passwd
log file = /var/log/rsyncd.log
[backup]
path = /backup

將 ansible 的配置文件ansible.cfghosts,提前放置在該項目目錄下

創建 rsync 劇本

vi rsync.yml

- hosts: webservers
  tasks:
    - name: download rsync
      yum:
        name: rsync
        state: present
    - name: configure rsync
      copy:
        src: ./rsyncd.conf
        dest: /etc/rsyncd.conf
        owner: root
        group: root
        mode: "0644"
      notify: restart rsync
    - name: init group
      group:
        name: ansible_www
        gid: 8888
    - name: init user
      user:
        name: ansible_www
        uid: 8888
        group: ansible_www
        shell: /sbin/nologin
        create_home: no
    - name: init directory
      file:
        path: /backup
        state: directory
        owner: ansible_www
        group: ansible_www
        mode: "0755"
        recurse: yes
    - name: init rsync user passwd
      copy:
        content: "rsync_backup:123456"
        dest: /etc/rsync.passwd
        owner: root
        group: root
        mode: 0600
      notify: restart rsync
    - name: start rsync
      systemd:
        name: rsyncd
        state: started
        enabled: yes
  handlers:
    - name: restart rsync
      systemd:
        name: rsyncd
        state: restarted

執行並驗證

ansible-playbook --syntax-check rsync.yml 
ansible-playbook -C rsync.yml 
ansible-playbook rsync.yml  

#驗證
rsync -avz host_group [email protected]::backup
rsync 客戶端:#

任務順序:

  • 將腳本推送至被控端指定路徑下
  • 配置定時任務

創建 rsync-client 劇本

vi rsync-client.yml

- hosts: localhost
  tasks:
    - name: create scripts path
      file:
        path: /scripts
        owner: root
        group: root
        state: directory
        mode: 0755
    - name: push scripts
      copy:
        src: test.sh
        dest: /scripts/test.sh
        owner: root
        group: root
        mode: 0755
    - name: contable job
      cron:
        name: "push backup data"
        minute: "*/1"
        job: "/bin/bash /scripts/test.sh &>/dev/null"

創建 test.sh 以供測試

#!/bin/bash
RSYNC_PASSWORD="123456"  rsync -avz /backup/ [email protected]::backup

查看是否有定時任務

crontab -l

#Ansible: push backup data

*/1 * * * * /bin/bash /scripts/test.sh &>/dev/null

使用 Ansible 部署多節點 phpmyadmin#

項目需求#
  • 使用 LNMP 部署 phpmyadmin
  • nginx(Haproxy)作為負載均衡
  • Redis 實現會話保持
主機規劃#
主機名ip用途
121192.168.1.121Ansible 控制節點、nignx+PHP
122192.168.1.122Ansible 受控節點、nignx+PHP
123192.168.1.123Ansible 受控節點、nignx(Haproxy)
124192.168.1.124Ansible 受控節點、nignx(Haproxy)
125192.168.1.125Ansible 受控節點、Redis
部署步驟#
環境準備

121 節點上要準備好 Ansible,並設置以上 5 台機器免密登錄,具體參照上方的配置過程。

#創建存放項目文件目錄
mkdir /data/phpmyadmin
#將ansible的配置文件`ansible.cfg`和`hosts`,複製到該phpmyadmin目錄下,並修改配置
cp /etc/ansible/ansible.cfg /data/phpmyadmin/ansible.cfg
#修改配置文件中的路徑,並取消註釋
inventory      = /data/phpmyadmin/host_group

cp /etc/ansible/hosts /data/phpmyadmin/host_group
#修改主機組
[webservers]
192.168.1.121
192.168.1.122

[dbservers]
192.168.1.125

[lbservers]
192.168.1.123
192.168.1.124

確認配置文件的讀取路徑是否為當前項目下的/data/phpmyadmin/ansible.cfg

[root@121 phpmyadmin]# ansible --version
ansible 2.9.27
config file = /data/phpmyadmin/ansible.cfg
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Jun 28 2022, 15:30:04) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]

驗證主機是否都可 ping 通

[root@121 phpmyadmin]# ansible all -m ping
192.168.1.122 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
192.168.1.124 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
192.168.1.123 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
192.168.1.125 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
192.168.1.121 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}

安裝 Redis

任務順序:

  • 下載 redis 程序
  • 掛載 redis 配置文件(設置觸發器,修改配置文件後,使配置重啟生效)
  • 啟動 redis

設置觸發器 handles,重啟 redis 服務

(1)將 redis 的配置文件redis.conf,拷貝至/data/phpmyadmin/files目錄下

mkdir /data/phpmyadmin/files
# 若無redis.conf文件可先在控制節點上使用命令yum -y install redis下載後再拷貝
cp /etc/redis.conf /data/phpmyadmin/files
#修改配置文件,將要安裝redis的主機ip加入
bind 127.0.0.1 192.168.1.125

(2)

vi redis.yml

- hosts: dbservers
  tasks:
    - name: download redis
      yum:
        name: redis
        state: present
    - name: configure redis
      copy:
        src: ./files/redis.conf
        dest: /etc/redis.conf
        owner: redis
        group: root
        mode: 0640
      notify: restart redis
    - name: start redis
      systemd:
        name: redis
        state: started
        enabled: yes
  handlers:
    - name: restart redis
      systemd:
        name: redis
        state: restarted

(3)安裝並測試

ansible-playbook --syntax-check redis.yml
ansible-playbook -C redis.yml
ansible-playbook redis.yml
#測試,之前控制節點121安裝了redis,可直接在121上測試
#注意防火牆端口
redis-cli -h 192.168.1.125

[root@121 phpmyadmin]# redis-cli -h 192.168.1.125
192.168.1.125:6379>

安裝 Mariadb

在 192.168.1.125 上安裝 Mariadb

 yum -y install mariadb-server
 systemctl start mariadb
 systemctl enable mariadb
 #設置root用戶密碼
 mysqladmin -uroot password '123456'
 #登錄創建用戶
 mysql -uroot -p123456
 #創建數據庫
 create database php_db;
 #創建數據庫用戶
 grant all on php_db.* to php_user@'%' identified by '123456';
安裝 nginx、PHP

任務順序:

  • 下載 nginx、PHP 程序
  • 掛載 nginx、PHP 配置文件(設置觸發器,修改配置文件後,使配置重啟生效)
  • 初始化設置 nginx(設置用戶、組、授權)
  • 啟動 nginx、PHP

設置觸發器 handles,重啟 nginx、PHP 服務

(1)設置 php7 下載源,在 121,122 上執行

rpm -Uvh https://mirror.webtatic.com/yum/el7/epel-release.rpm
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm

(2)將 nginx、php 的配置文件,拷貝至/data/phpmyadmin/files目錄下,並修改配置

#nginx配置文件
cp /etc/nginx/nginx.conf /data/phpmyadmin/files
#php配置文件
cp /etc/php.ini /data/phpmyadmin/files
cp /etc/php-fpm.d/www.conf /data/phpmyadmin/files

修改 nginx 配置文件,將用戶修改為www

vi nginx.conf
user www;

/data/phpmyadmin/files目錄下,新增phpmyadmin的 nginx 代理文件

vi phpmyadmin.conf

server {
    listen 80;
    server_name ansible.phpmyadmin.local;

    # 確保此路徑與phpMyAdmin實際路徑完全一致
    root /code/phpmyadmin;
    index index.php;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        # 絕對路徑必須完整正確
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        include fastcgi_params;

        # 添加關鍵參數
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_intercept_errors on;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

修改 php 配置文件php.ini,設置 redis 連接。

vi php.ini
[Session]

session.save_handler = redis
session.save_path = "tcp://192.168.1.125:6379?weight=1&timeout=2.5"

修改 php 配置文件www.conf,設置用戶和組,並註釋部分設置。

vi www.conf

[www]
user = www
group = www

;php_value[session.save_handler] = files
;php_value[session.save_path]    = /var/lib/php/session

(3)下載 phpmyadmin

#phpmyadmin程序下載到/data/phpmyadmin/files目錄下
curl -O https://files.phpmyadmin.net/phpMyAdmin/5.2.2/phpMyAdmin-5.2.2-all-languages.zip

#解壓程序
unzip phpMyAdmin-5.2.2-all-languages.zip
#複製並修改配置文件,連接mariadb數據庫
cp phpMyAdmin-5.2.2-all-languages/config.sample.inc.php config.inc.php
#修改localhost為192.168.1.125
$cfg['Servers'][$i]['host'] = '192.168.1.125';

(4)創建 nginx-php 劇本

vi nginx-php.yml

- hosts: webservers
  tasks:
    - name: download nginx
      yum:
        name: nginx
        state: present
    - name: download php
      yum:
        name: "{{ packages }}"
      vars:
        packages:
        - php72w
        - php72w-cli
        - php72w-common
        - php72w-devel
        - php72w-embedded
        - php72w-fpm
        - php72w-gd
        - php72w-mbstring
        - php72w-mysqlnd
        - php72w-opcache
        - php72w-pdo
        - php72w-xml
        - php72w-ldap
        - php72w-pecl-redis

    - name: configure nginx
      copy:
        src: ./files/nginx.conf
        dest: /etc/nginx/nginx.conf
        owner: root
        group: root
        mode: 0644
      notify: restart nginx
    - name: init group www
      group:
        name: www
        gid: 666
    - name: init user www
      user:
        name: www
        uid: 666
        group: www
        shell: /sbin/nologin
        create_home: no
    - name: start nginx
      systemd:
        name: nginx
        state: started        
        enabled: yes

    - name: configure php.ini
      copy:
        src: ./files/php.ini
        dest: /etc/php.ini
        owner: root
        group: root
        mode: 0644
      notify: restart php    
    - name: configure www.conf
      copy:
        src: ./files/www.conf
        dest: /etc/php-fpm.d/www.conf
        owner: root
        group: root
        mode: 0644
      notify: restart php        
    - name: start php
      systemd:
        name: php-fpm
        state: started        
        enabled: yes
        
    - name: copy nginx conf 
      copy:
        src: ./files/phpmyadmin.conf
        dest: /etc/nginx/conf.d/phpmyadmin.conf
      notify: restart nginx      
    - name: create code directory
      file:
        path: /code
        state: directory
        owner: www
        group: www
        mode: "0755"
        recurse: yes    
    - name: unarchive phpmyadmin   #解壓phpmyadmin
      unarchive: 
        src: ./files/phpMyAdmin-5.2.2-all-languages.zip
        dest: /code/
        owner: www
        group: www
        creates: /code/phpMyAdmin-5.2.2-all-languages/config.inc.php        
    - name: create link  #創建軟連接
      file: 
        src: /code/phpMyAdmin-5.2.2-all-languages/
        dest: /code/phpmyadmin 
        state: link
    - name: change phpmyadmin configure 
      copy:
        src: ./files/config.inc.php
        dest: /code/phpMyAdmin-5.2.2-all-languages/config.inc.php  
          
        
  handlers: 
    - name: restart nginx
      systemd:
        name: nginx
        state: restarted
    - name: restart php
      systemd:
        name: php-fpm
        state: restarted

(5)安裝並測試

ansible-playbook --syntax-check nginx-php.yml
ansible-playbook -C nginx-php.yml
ansible-playbook nginx-php.yml

(6)在本機電腦C:\Windows\System32\drivers\etc\hosts配置 hosts

#分別配置121,122的hosts進行訪問測試
192.168.1.121 ansible.phpmyadmin.local
192.168.1.122 ansible.phpmyadmin.local

(7)瀏覽器訪問ansible.phpmyadmin.local,用戶密碼是安裝 Mariadb 數據庫時,創建的用戶php_user及其密碼123456

3

4

負載均衡方式一:nginx

(1)複製 nginx 的配置文件nginx.conf,至/data/phpmyadmin/files目錄下並命名為nginx.conf.lb

cp /etc/nginx.conf /data/phpmyadmin/files/nginx.conf.lb

(2)在/data/phpmyadmin/files目錄下創建配置文件proxy.conf,用作負載均衡

vi proxy.conf

upstream ansible {
    server 192.168.1.121;
    server 192.168.1.122;
}
server {
    listen 80;
    server_name ansible.phpmyadmin.local;
    location / {
        proxy_pass http://ansible;
        proxy_set_header Host $http_host;
    }

}

(3)創建 lb-nginx 劇本

vi lb-nginx.yml

- hosts: lbservers
  tasks:
    - name: download nginx
      yum:
        name: nginx
        state: present
    - name: configure nginx
      copy:
        src: ./files/nginx.conf.lb
        dest: /etc/nginx/nginx.conf
      notify: restart nginx
    - name: copy nginx conf
      copy:
        src: ./files/proxy.conf
        dest: /etc/nginx/conf.d/proxy.conf
      notify: restart nginx
    - name: start nginx
      systemd:
        name: nginx
        state: started
        enabled: yes
  handlers:
    - name: restart nginx
      systemd:
        name: nginx
        state: restarted

(4)安裝並測試

ansible-playbook --syntax-check lb-nginx.yml
ansible-playbook -C lb-nginx.yml
ansible-playbook lb-nginx.yml

(5)在本機電腦C:\Windows\System32\drivers\etc\hosts配置 hosts

192.168.1.123 ansible.phpmyadmin.local
192.168.1.124 ansible.phpmyadmin.local

(6)瀏覽器訪問ansible.phpmyadmin.local,並觀察數據庫伺服器-用戶,刷新查看用戶是否為 121 與 122 切換顯示。

負載均衡方式二:haproxy

(1)設置 haproxy 下載源

rpm -Uvh https://repo.ius.io/ius-release-el7.rpm

(2)將/etc/haproxy/haproxy.cfg,至/data/phpmyadmin/files目錄下

cp /etc/haproxy/haproxy.cfg /data/phpmyadmin/files

可先在任意一台伺服器安裝 haproxy,獲取 /etc/haproxy/haproxy.cfg 文件

(3)修改haproxy.cfg配置文件,新增以下內容。

frontend web
                bind *:8080
                mode http
                acl ansible_domain hdr_reg(host) -i ansible.phpmyadmin.local
                use_backend ansible_cluster if ansible_domain
backend ansible_cluster
                balance roundrobin
                option httpchk HEAD / HTTP/1.1\r\nHost:\ ansible.phpmyadmin.local
                server server1 192.168.1.121:80 check port 80 inter 3s rise 2 fall 3
                server server2 192.168.1.122:80 check port 80 inter 3s rise 2 fall 3

(4)創建 lb-haproxy 劇本

vi lb-haproxy.yml

- hosts: lbservers
  tasks:
    - name: download haproxy
      yum:
        name: haproxy22
        state: present
    - name: configure haproxy
      copy:
        src: ./files/haproxy.cfg
        dest: /etc/haproxy/haproxy.cfg
        owner: root
        group: root
        mode: 0644
      notify: restart haproxy  
    - name: start haproxy
      systemd:
        name: haproxy
        state: started        
        enabled: yes
  handlers: 
    - name: restart haproxy
      systemd:
        name: haproxy
        state: restarted

(5)安裝並測試

ansible-playbook --syntax-check lb-haproxy.yml
ansible-playbook -C lb-haproxy.yml
ansible-playbook lb-haproxy.yml

(5)在本機電腦C:\Windows\System32\drivers\etc\hosts配置 hosts

192.168.1.123 ansible.phpmyadmin.local
192.168.1.124 ansible.phpmyadmin.local

(6)瀏覽器訪問ansible.phpmyadmin.local:8080,並觀察數據庫伺服器-用戶,刷新查看用戶是否為 121 與 122 切換顯示。

本篇知識來源於 B 站視頻 BV11JZcYwEDd

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。