Ansible批量部署執行

1 批量管理服務知識介紹

1.ansible是一個基於python開發的自動化運維工具
2.ansible是一個基於ssh協議實現遠程管理的工具
3.ansible軟件可以實現多種批量管理操作(批量系統配置、批量軟件部署、批量文件拷貝)

2 批量管理服務特徵介紹

1.ansible軟件服務端:不需要啓動任何服務,默認服務端不需要任何的配置
2.ansible軟件客戶端:沒有客戶端軟件安裝

3 absible軟件安裝部署

3.1 ansible軟件自動化環境架構規劃

管理主機m01
受控主機:其他

3.2 ansible軟件自動化部署條件

建議基於ssh密鑰方式建立遠程鏈接
1.ssh密鑰對創建(管理主機)

ssh-keygen -t dsa -f /root/.ssh/id_dsa -N ""
-f  /root/.ssh/id_dsa		--指定私鑰的存放路徑
-N "" or -P  ""				--私鑰文件密碼設定

2.公鑰文件分發

sshpass -p123 ssh-copy-id -i /root/.ssh/id_dsa.pub  "-o  StrictHostKeyChecking=no" 172.16.1.31
sshpass -p123  							--免交互式輸入密碼
-o  StrictHostKeyChecking=no   			--不檢查

編寫腳本批量分發並檢查

[root@m01 scripts]# vim fenfa_key.sh
#!/bin/sh
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
if [ ! -f /root/.ssh/id_dsa ];then
ssh-keygen -t dsa -f /root/.ssh/id_dsa -N ""
else
for n in 31 41 7
do
sshpass -p123 ssh-copy-id -i /root/.ssh/id_dsa.pub  "-o  StrictHostKeyChecking=no" 172.16.1.$n>/dev/null
 2>&1
ssh 172.16.1.$n hostname
done
fi

補充
shift的作用
若用戶要求Shell在不知道變量個數的情況下,還能逐個處理參數,也就是在$1之後是$2,$2之後是$3。在未運行shift命令之前$1是可用的,當使用shift命令之後,原來的$2會變成$1,並且原有的11變得不可用,通過#命令獲得的參數個數也會少1。

#測試shift命令(x_shift.sh)
until [ $# -eq 0 ]
do
echo "第一個參數爲: $1 參數個數爲: $#"
shift
done
執行以上程序x_shift.sh:
$./x_shift.sh 1 2 3 4
結果顯示如下:
第一個參數爲: 1 參數個數爲: 4
第一個參數爲: 2 參數個數爲: 3
第一個參數爲: 3 參數個數爲: 2
第一個參數爲: 4 參數個數爲: 1

shift命令一次移動參數的個數由其所帶的參數指定。例如當shell程序處理完前九個命令行參數後,可以使用shift9命令把$10移到$1。

3.3 ansible軟件下載安裝

主控端軟件安裝

yum  -y   install  ansible

受控端軟件安裝(可選)

yum  -y  install  libselinux-python  <---解決selinux開啓後selinux阻止

3.4 ansible軟件受控主機添加配置

/etc/ansible/hosts     《===配置管理的主機
[dxy] 
172.16.1.31    ansible_user=root  ansible_password=123  <==可以指定賬號和密碼信息
172.16.1.41
172.16.1.7
ansible.cfg  	           《===ansible的配置文件

3.5 實踐

[root@m01 ansible]# ansible dxy -m command -a "hostname"
172.16.1.41 | CHANGED | rc=0 >>
backup

172.16.1.7 | CHANGED | rc=0 >>
web01

172.16.1.31 | CHANGED | rc=0 >>
nfs01

3.6 命令參數

參數 含義
dxy 組名稱
-m 指定模塊信息
-a 利用模塊中某些參數功能
-k 基於交互式輸入密碼

absible-doc -l 查看模塊
ansible常用模塊:command shell copy script file systemd yum mount

4 ansible應用

4.1 ansible軟件模塊

4.1.1 command模塊

簡介:
命令模塊採用命令名,後跟空格分隔的參數列表。給定的命令將在所有選定的節點上執行。命令不會通過shell處理,因此$home之類的變量和“<”、“>”、“”、“;”和“&”之類的操作將不起作用。如果需要這些特性,請使用shell模塊。
要創建更易於讀取的命令任務,請使用args task關鍵字傳遞參數。
對於windows目標,請改用win_命令模塊。

官方網站:https://docs.ansible.com/ansible/latest/modules/command_module.html#command-module

參數 作用
chdir 先切換到別的目錄下在執行命令
creates 當文件存在時就不執行後邊的命令
removes 當文件不存在時不執行後邊的命令

chdir實例

[root@m01 ansible]# ansible 172.16.1.31 -m command -a "chdir=/tmp pwd"
172.16.1.31 | CHANGED | rc=0 >>
/tmp

creates實例

[root@m01 ansible]# ansible 172.16.1.31 -m command -a "creates=/tmp pwd"
172.16.1.31 | SUCCESS | rc=0 >>
skipped, since /tmp exists
[root@m01 ansible]# ansible 172.16.1.31 -m command -a "creates=/tmp1 pwd"
172.16.1.31 | CHANGED | rc=0 >>
/root

removes實例

[root@m01 ansible]# ansible 172.16.1.31 -m command -a "removes=/tmp hostname"                    
172.16.1.31 | CHANGED | rc=0 >>
nfs01
[root@m01 ansible]# ansible 172.16.1.31 -m command -a "removes=/tmp1 hostname"
172.16.1.31 | SUCCESS | rc=0 >>
skipped, since /tmp1 does not exist

4.1.2 shell模塊

可以使用特殊符號,shell模塊支持command模塊的所有功能
chdir實例

[root@m01 ansible]# ansible 172.16.1.31 -m shell -a "chdir=/tmp pwd"
172.16.1.31 | CHANGED | rc=0 >>

/tmp
creates實例

[root@m01 ansible]# ansible 172.16.1.31 -m shell -a "creates=/tmp pwd"
172.16.1.31 | SUCCESS | rc=0 >>
skipped, since /tmp exists
[root@m01 ansible]# ansible 172.16.1.31 -m shell -a "creates=/tmp1 pwd"
172.16.1.31 | CHANGED | rc=0 >>
/root

removes實例

[root@m01 ansible]# ansible 172.16.1.31 -m shell -a "removes=/tmp hostname"                    
172.16.1.31 | CHANGED | rc=0 >>
nfs01
[root@m01 ansible]# ansible 172.16.1.31 -m shell -a "removes=/tmp1 hostname"
172.16.1.31 | SUCCESS | rc=0 >>
skipped, since /tmp1 does not exist

4.1.3 script模塊:專門運行腳本

簡介:
Runs a local script on a remote node after transferring it

實例:
ansible 172.16.1.31 -m script  -a "/server/scripts/yum.sh"

4.2 文件類型的模塊

4.2.1 copy---- Copy files to remote locations

synop
複製模塊將文件從本地或遠程計算機複製到遠程計算機上的某個位置。
使用fetch模塊將文件從遠程位置複製到本地框。
如果在複製的文件中需要變量插值,請使用模板模塊。在內容字段中使用變量將導致不可預測的輸出。

對於windows目標,請改用win_copy模塊sis

參數 含義
src 要複製文件本地的路徑,如果是目錄/結尾,複製的時候不包含目錄
dest 應將文件複製到的遠程絕對路徑。如果src是一個目錄,那麼它也必須是一個目錄。如果DEST是一個不存在的路徑,如果要麼以“//”結束,要麼SRC是一個目錄,則創建DEST。如果dest是相對路徑,則起始目錄由遠程主機確定。如果SRC和DEST是文件,則未創建DEST的父目錄,如果該任務不存在,則任務失敗。
backup 創建一個包含時間戳信息的備份文件,以便在不正確地刪除原始文件時可以將其取回。
owner 應該擁有該文件/目錄的用戶的名稱,該名稱將被饋送給chown。
group 設置文件所屬組
mode 設置複製後的文件權限 例如:600 755 等等

src與dest實例

ansible 172.16.1.31 -m copy -a "src=1.txt dest=./"  
backup
[root@m01 ~]# ansible 172.16.1.31 -m copy -a "src=1.txt dest=./ backup=yes"      
172.16.1.31 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "backup_file": "./1.txt.22000.2019-11-01@17:08:50~", 
    "changed": true, 
    "checksum": "47f5487a006fd6ce0f74306c7c8594b219b72d08", 
    "dest": "./1.txt", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "91dc86f0a5e0bede58197f3f22883180", 
    "mode": "0644", 
    "owner": "root", 
    "secontext": "unconfined_u:object_r:admin_home_t:s0", 
    "size": 188, 
    "src": "/root/.ansible/tmp/ansible-tmp-1572599329.88-195785710959257/source", 
    "state": "file", 
    "uid": 0
}
[root@m01 ~]# ansible 172.16.1.31 -m shell  -a "ls ./1.txt*"       
172.16.1.31 | CHANGED | rc=0 >>
./1.txt
./1.txt.22000.2019-11-01@17:08:50~

4.2.2 file模塊

synopsis
設置文件、符號鏈接或目錄的屬性。
或者,刪除文件、符號鏈接或目錄。
許多其他模塊支持與文件模塊相同的選項,包括複製、模板和組裝。

對於Windows目標,請改用Win_文件模塊。

[root@m01 ~]# ansible 172.16.1.31 -m file -a "path=/tmp/1.txt owner=test group=test mode=600" 
172.16.1.31 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "gid": 1000, 
    "group": "test", 
    "mode": "0600", 
    "owner": "test", 
    "path": "/tmp/1.txt", 
    "secontext": "unconfined_u:object_r:user_tmp_t:s0", 
    "size": 0, 
    "state": "file", 
    "uid": 1000
}
path是路徑  相當於dest
state:用於指定創建
[root@m01 ~]# ansible 172.16.1.31 -m file -a "dest=/tmp/1.txt state=file"
[root@m01 ~]# ansible 172.16.1.31 -m file -a "dest=/tmp/dir state=directory"

4.2.3 yum模塊

簡介(synopsis)
使用yum包管理器安裝、升級、降級、刪除和列出包和組。

此模塊僅適用於Python2如果需要Python 3支持,請參閱dnf模塊。

參數 含義
name 需要安裝軟件的名稱
state installed安裝absent卸載
list 指定軟件的名稱查看是否可以安裝,以及是否已經安裝過了
ansible 172.16.1.31 -m yum -a "name=iftop state=removed"
ansible 172.16.1.31 -m yum -a "name=iftop state=installed"
ansible 172.16.1.31 -m yum -a "list=iftop"

4.2.4 系統模塊—server

synopsis
控制遠程主機上的服務支持的init系統包括bsd init、openrc、sysv、solaris smf、systemd和upstart。

對於Windows目標,請改用Win_服務模塊。
參數 含義
name 指定管理的服務名稱(管理的服務一定在chkconfig中可以看到)
state 對應的狀態 reloaded restarted stopped started
enabled 服務是否開機自啓動 yes no

4.2.5 系統模塊—systemd

synopsis
控制遠程主機上的系統服務。

參數 含義
name 指定管理的服務名稱(管理的服務一定在chkconfig中可以看到)
state 對應的狀態 reloaded restarted stopped started
enabled 服務是否開機自啓動 yes no

4.2.6 cron模塊—Manage cron.d and crontab entries

synopsis
使用此模塊管理crontab和環境變量項。此模塊允許您創建環境變量和命名的crontab條目、更新或刪除它們。
當crontab作業被管理時:模塊包含一行crontab條目“ansibe:”的描述,與傳遞給模塊的“name”相對應,將來ansibe/module調用將使用該條目查找/檢查狀態。“name”參數應該是唯一的,更改“name”值將導致創建一個新的cron任務(或刪除另一個任務)。
管理環境變量時,不添加註釋行,但是,當模塊需要查找/檢查狀態時,它使用“name”參數來查找環境變量定義行。
使用%等符號時,必須正確轉義。

name :給定時任務定義名稱
state=absent :刪除一條規則
disabled=yes :註釋定時任務
minute=0-59  or    *    or   */     分鐘
hour=0-23 |*  */	時
day=1-31 | *  */	日
month   月 weekday  周     job=對應的命令    默認是*
[root@m01 ~]# ansible 172.16.1.31 -m cron -a "name=test01 minute=0 hour=0 job='/usr/sbin/sh  /server/scripts/test.sh >/dev/null 2>&1'"
172.16.1.31 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "envs": [], 
    "jobs": [
        "test01"
    ]
}
[root@m01 ~]# ansible 172.16.1.31 -m command -a "crontab -l"
172.16.1.31 | CHANGED | rc=0 >>
##time update
*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1
###Pack and backup at 00:00 every day####
###00 00 * * * /usr/bin/sh /server/scripts/back.sh >/dev/null 2>&1
#Ansible: test01
0 0 * * * /usr/sbin/sh  /server/scripts/test.sh >/dev/null 2>&1
[root@m01 ~]# ansible 172.16.1.31 -m cron -a "name=test01 minute=0 hour=0 job='/usr/sbin/sh  /server/scripts/test.sh >/dev/null 2>&1' disabled=yes"  
172.16.1.31 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "envs": [], 
    "jobs": [
        "test01", 
        "None"
    ]
}
[root@m01 ~]# ansible 172.16.1.31 -m command -a "crontab -l"                                            172.16.1.31 | CHANGED | rc=0 >>
##time update
*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1
###Pack and backup at 00:00 every day####
###00 00 * * * /usr/bin/sh /server/scripts/back.sh >/dev/null 2>&1
#Ansible: test01
#0 0 * * * /usr/sbin/sh  /server/scripts/test.sh >/dev/null 2>&1
[root@m01 ~]# ansible 172.16.1.31 -m cron -a "name=test01 state=absent"                                 172.16.1.31 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "envs": [], 
    "jobs": [
        "None"
    ]
}
[root@m01 ~]# ansible 172.16.1.31 -m command -a "crontab -l"           
172.16.1.31 | CHANGED | rc=0 >>
##time update
*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1
###Pack and backup at 00:00 every day####
###00 00 * * * /usr/bin/sh /server/scripts/back.sh >/dev/null 2>&1

4.3 ansible軟件腳本

編寫的規範:
https://docs.ansible.com/ansible/latest/reference_appendices/YAMLSyntax.html
遵循pyyaml

4.3.1 用法說明

語法格式:

host:
 tasks:
 		--內容

實例:

- hosts: webservers
  vars:
    http_port: 80
    max_clients: 200
  remote_user: root
  tasks:
  - name: ensure apache is at the latest version
    yum:
      name: httpd
      state: latest
  - name: write the apache config file
    template:
      src: /srv/httpd.j2
      dest: /etc/httpd.conf
    notify:
    - restart apache
  - name: ensure apache is running
    service:
      name: httpd
      state: started
  handlers:
    - name: restart apache
      service:
        name: httpd
        state: restarted

4.3.3 空格的用法說明
對編寫的內容進行分級時,需要有兩個空格表示分級
軟件安裝步驟:

-	server端安裝步驟:
第一步:
   第二步:
-	客戶端安裝步驟:

4.4 腳本實例:

4.4.1 編寫安裝nginx的腳本

[root@m01 ~]# vim 1.yml                 
- hosts: 172.16.1.7
  tasks:
    - name: instsll nginx
      yum: name=nginx state=installed
    - name: check install
      shell: rpm -qa|grep nginx
    - name: start nginx
      systemd: name=nginx state=started
    - name: check start
      shell: ss -lntup|grep nginx

4.4.2 測試模擬運行
[root@m01 ~]# ansible-playbook -C 1.yml ##調試
[root@m01 ~]# ansible-playbook 1.yml ##運行
測試安裝成功

ansible同時安裝多個服務實例

服務端自動安裝配置啓動服務,客戶端自動掛載

[root@m01 yml]# cat nfs.yml
- hosts: 172.16.1.31
  vars:
    packe:
      - rpcbind
      - nfs-utils
  tasks:
    - name: yum install nfs rpcbind
      yum: name={{ packe }} state=present
    - name: copy nfs configure 
      copy: src=/server/ansible/conf/nfs/exports dest=/etc/
    - name: create /data directory
      file: dest=/data state=directory owner=nfsnobody group=nfsnobody
    - name:  start nfs rpcbind
      systemd: name={{ item }} state=started enabled=yes
      with_items:
        - rpcbind
        - nfs
- hosts: 172.16.1.7
  tasks:
    - name: yum  install nfs-utils
      yum: name=nfs-utils state=present
    - name: create file /www
      file: dest=/www state=directory
    - name: start  rpc
      systemd: name=rpcbind  state=started enabled=yes
    - name: mount
      mount: name=/www  src=172.16.1.31:/data fstype=nfs state=mounted
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章