Ansible Playbook 基本概述與使用案例 主機規劃 添加用戶賬號 說明: 1、 運維人員使用的登錄賬號; 2、 所有的業務都放在 /app/ 下「yun用戶的家目錄」,避免業務數據亂放; 3、 該用戶也被 ansible 使用,因為幾乎所有的生產環境都是禁止 root 遠程登錄的(因此該 ...
Ansible Playbook 基本概述與使用案例
主機規劃
添加用戶賬號
說明:
1、 運維人員使用的登錄賬號;
2、 所有的業務都放在 /app/ 下「yun用戶的家目錄」,避免業務數據亂放;
3、 該用戶也被 ansible 使用,因為幾乎所有的生產環境都是禁止 root 遠程登錄的(因此該 yun 用戶也進行了 sudo 提權)。
1 # 使用一個專門的用戶,避免直接使用root用戶 2 # 添加用戶、指定家目錄並指定用戶密碼 3 # sudo提權 4 # 讓其它普通用戶可以進入該目錄查看信息 5 useradd -u 1050 -d /app yun && echo '123456' | /usr/bin/passwd --stdin yun 6 echo "yun ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers 7 chmod 755 /app/
Ansible 配置清單Inventory
之後文章都是如下主機配置清單
1 [yun@ansi-manager ansible_info]$ pwd 2 /app/ansible_info 3 [yun@ansi-manager ansible_info]$ cat hosts_key 4 # 方式1、主機 + 埠 + 密鑰 5 [manageservers] 6 172.16.1.180:22 7 8 [proxyservers] 9 172.16.1.18[1:2]:22 10 11 # 方式2:別名 + 主機 + 埠 + 密碼 12 [webservers] 13 web01 ansible_ssh_host=172.16.1.183 ansible_ssh_port=22 14 web02 ansible_ssh_host=172.16.1.184 ansible_ssh_port=22 15 web03 ansible_ssh_host=172.16.1.185 ansible_ssh_port=22
Playbook 基本概述
什麼是 playbook,playbook 翻譯過來就是“劇本”,那 playbook 組成如下:
1、play:定義主機角色「比作:劇本中的角色」
2、task:定義具體執行任務「比作:劇本中的角色要做什麼事兒」
3、playbook:由一個或多個play組成,一個 play 可以包含多個 task 任務
簡單理解:使用不同的模塊完成一項事情
Playbook 優勢
1、功能上比 Ad-Hoc 更全
2、能很好的控制先後執行順序,以及依賴關係
3、語法更加直觀,可讀性更好
4、Ad-Hoc 是臨時的無法持久使用,Playbook 可以持久化使用。
Playbook 書寫格式
Playbook 是有 yml 語法書寫,結構清晰,可讀性強。
Playbook 示例-安裝部署 httpd
要求:在 172.16.1.180、172.16.1.181、172.16.1.182 安裝 httpd 服務。
test_httpd.yml 腳本內容
說明:其中 172.16.1.181 和 172.16.1.182 已經安裝好了 httpd 服務。
腳本參數說明:
host:指定主機
remote_user:要使用什麼用戶操作
tasks:具體執行什麼任務
1 [yun@ansi-manager object01]$ pwd 2 /app/ansible_info/object01 3 [yun@ansi-manager object01]$ ll ../ # 主機清單存放位置 4 total 16 5 -rw-rw-r-- 1 yun yun 226 Oct 8 16:07 hosts_key # 主機清單文件 6 drwxrwxr-x 2 yun yun 28 Oct 11 19:24 object01 7 [yun@ansi-manager object01]$ ll 8 total 4 9 -rw-rw-r-- 1 yun yun 937 Oct 11 19:24 test_httpd.yml 10 [yun@ansi-manager object01]$ cat test_httpd.yml # playbook 內容 11 --- 12 # 上面一行表明這是一個 yml 文件,無其他作用 13 # test playbook 14 - hosts: manageservers, proxyservers # 定義主機組 「可以有多個主機組 使用 逗號加空格 隔開」 15 # remote_user: yun # 可省略該行 定義用戶的身份「我們按之前的約定使用的 yun 用戶,因此這裡也是 yun 用戶」 16 17 tasks: # 定義運行什麼樣的任務 18 - name: "Installed httpd server" # 第一個任務 描述 19 yum: name=httpd state=present # 執行什麼模塊「第一種書寫方式,如果該行很長,會有折行的情況,不怎麼美觀」 20 21 - name: "site update" # 第二個任務 描述「第二種書寫方式,推薦,更規範人性化」 22 copy: 23 content: "Test WEB" 24 dest: "/var/www/html/index.html" 25 26 - name: "start httpd server" 27 systemd: 28 name: httpd 29 daemon_reload: yes 30 state: started 31 enabled: yes
語法檢查
1 # 由於我們使用的是 yun 普通用戶 2 # 因此有時需要使用 -b 選擇進行提權 3 [yun@ansi-manager object01]$ ansible-playbook -b -i ../hosts_key --syntax-check test_httpd.yml 4 5 playbook: test_httpd.yml
預執行
如果存在依賴關係【如:軟體安裝,配置,啟動】,那麼可能預執行報錯,但是執行是正常的。
因為後面的「啟動」依賴前面的「配置」,「配置」依賴前面的「軟體安裝」。
因此如果報錯,那麼詳細看看。確定是存在問題還是依賴關係導致的。
1 [yun@ansi-manager object01]$ ansible-playbook -b -i ../hosts_key -C test_httpd.yml 2 3 PLAY [manageservers, proxyservers] *************************************************************************************** 4 5 TASK [Gathering Facts] ************************************************************************************************** 6 ok: [172.16.1.180] 7 ok: [172.16.1.182] 8 ok: [172.16.1.181] 9 10 TASK [Installed httpd server] ******************************************************************************************* 11 ok: [172.16.1.182] 12 ok: [172.16.1.181] 13 changed: [172.16.1.180] 14 15 TASK [site update] ****************************************************************************************************** 16 changed: [172.16.1.180] 17 changed: [172.16.1.181] 18 changed: [172.16.1.182] 19 20 TASK [start httpd server] *********************************************************************************************** 21 changed: [172.16.1.180] 22 changed: [172.16.1.181] 23 changed: [172.16.1.182] 24 25 PLAY RECAP ************************************************************************************************************** 26 172.16.1.180 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 27 172.16.1.181 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 28 172.16.1.182 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
執行 test_httpd.yml
1 [yun@ansi-manager object01]$ ansible-playbook -b -i ../hosts_key test_httpd.yml 2 3 PLAY [manageservers, proxyservers] ************************************************************************************** 4 5 TASK [Gathering Facts] ************************************************************************************************* 6 ok: [172.16.1.182] 7 ok: [172.16.1.180] 8 ok: [172.16.1.181] 9 10 TASK [Installed httpd server] ****************************************************************************************** 11 ok: [172.16.1.182] 12 ok: [172.16.1.181] 13 ok: [172.16.1.180] 14 15 TASK [site update] ***************************************************************************************************** 16 changed: [172.16.1.181] 17 changed: [172.16.1.182] 18 changed: [172.16.1.180] 19 20 TASK [start httpd server] ********************************************************************************************** 21 ok: [172.16.1.180] 22 ok: [172.16.1.182] 23 ok: [172.16.1.181] 24 25 PLAY RECAP ************************************************************************************************************* 26 172.16.1.180 : ok=4 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 27 172.16.1.181 : ok=4 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 28 172.16.1.182 : ok=4 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
然後在 172.16.1.180、172.16.1.181、172.16.1.182 可見 httpd 安裝部署已完成、服務已啟動且已加入開機自啟動;瀏覽器也能正常訪問。
Playbook 示例-安裝部署 nfs
要求:在 172.16.1.180 安裝 NFS 服務端,在 172.16.1.181、172.16.1.182 掛載 NFS。
test_nfs.yml 腳本內容
1 [yun@ansi-manager object01]$ pwd 2 /app/ansible_info/object01 3 [yun@ansi-manager object01]$ ll 4 total 8 5 -rw-rw-r-- 1 yun yun 937 Oct 11 19:24 test_httpd.yml 6 -rw-rw-r-- 1 yun yun 1434 Oct 11 19:50 test_nfs.yml 7 [yun@ansi-manager ansible_info]$ cat test_nfs.yml # playbook 內容 8 --- 9 # 必要包安裝 10 - hosts: manageservers, proxyservers 11 12 tasks: 13 - name: "NFS package install" 14 yum: 15 name: 16 - nfs-utils 17 - rpcbind 18 state: present 19 20 # 服務端配置與啟動 21 - hosts: manageservers 22 23 tasks: 24 - name: "create NFS dir" 25 file: 26 path: /data 27 owner: nfsnobody 28 group: nfsnobody 29 state: directory 30 recurse: yes 31 32 - name: "NFS server config and start" 33 copy: 34 content: "/data 172.16.1.0/24(rw,sync,root_squash,all_squash)\n" 35 dest: /etc/exports 36 owner: root 37 group: root 38 mode: '644' 39 # 當配置文件改變時,需要重載入 NFS 服務 40 notify: "reload NFS server" 41 42 - name: "rpcbind server start" 43 systemd: 44 name: rpcbind 45 state: started 46 daemon_reload: yes 47 enabled: yes 48 49 - name: "NFS server start" 50 systemd: 51 name: nfs 52 state: started 53 daemon_reload: yes 54 enabled: yes 55 56 handlers: 57 - name: "reload NFS server" 58 systemd: 59 name: nfs 60 state: reloaded 61 62 # 客戶端操作 63 - hosts: proxyservers 64 65 tasks: 66 - name: "rpcbind server start" 67 systemd: 68 name: rpcbind 69 state: started 70 daemon_reload: yes 71 enabled: yes 72 73 - name: "mount NFS" 74 mount: 75 src: 172.16.1.180:/data 76 path: /mnt 77 fstype: nfs 78 state: mounted 79 backup: True
語法檢查
1 # 由於我們使用的是 yun 普通用戶 2 # 因此有時需要使用 -b 選擇進行提權 3 [yun@ansi-manager object01]$ ansible-playbook -b -i ../hosts_key --syntax-check test_nfs.yml 4 5 playbook: test_nfs.yml
預執行
如果存在依賴關係【如:軟體安裝,配置,啟動】,那麼可能預執行報錯,但是執行是正常的。
因為後面的「啟動」依賴前面的「配置」,「配置」依賴前面的「軟體安裝」。
因此如果報錯,那麼詳細看看。確定是存在問題還是依賴關係導致的。
[yun@ansi-manager object01]$ ansible-playbook -b -i ../hosts_key -C test_nfs.yml # 具體列印內容,這裡省略
執行 test_nfs.yml
[yun@ansi-manager object01]$ ansible-playbook -b -i ../hosts_key test_nfs.yml # 具體列印內容,這裡省略
然後在 172.16.1.180 可見 NFS 服務已經部署且啟動成功。
在 172.16.1.181、172.16.1.182 可見 NFS 掛載成功,且已寫入 /etc/fstab 文件。
———END———
如果覺得不錯就關註下唄 (-^O^-) !