Ansible自動化運維模塊詳解一(command、shell、script、copy、file)


  Ansible軟件安裝完就可以直接使用了,不像其他服務需要對主配置文件進行修改,唯一要調整的配置文件就是主機列表清單文件。

  Ansible實現批量管理主機主要由兩種模式,一種是利用ansible命令實現批量管理(ad-hoc模式),另一種是利用Ansible劇本實現批量管理(playbook模式).

ansible命令格式:ansible        wangju          -m                          command         -a                      hostname

ansible格式說明:命令            主機組模塊名          指定模塊參數          模塊名稱         指定利用模塊執行的動作參數          批量要執行的操作

模塊名稱有很多個,這里只需要介紹幾個常用的:command(*)、shell(*)、script(*)、copy(*)、file、service、cron、yum、user、group、mount

Ansible自動化服務軟件實現批量管理功能必須依靠ansible軟件中的眾多模塊,因此只需要熟悉模塊的使用,基本上就可以說對Ansible軟件了解了一大半。

command模塊功能說明:在遠程節點上執行一個命令(用於執行一個命令)

command選項參數

chdir :在執行命令之前,通過cd命令進入指定的目錄

creates:定義一個文件是否存在,如果不存在,則運行相應的命令,如果存在,則逃過此步驟

free_from(必有參數):參數信息中可以輸入任何系統命令信息,實現遠程管理

removes:定義一個文件是否存在,如果存在,則運行相應的命令,如果不存在,則逃過此步驟

利用command模塊實現批量管理:獲取所有主機的負載信息

[root@localhost ~]# ansible all -m command -a 'uptime'   #注意在使用command模塊的時候,不能帶管道以及重定向符號
192.168.146.110 | CHANGED | rc=0 >>
10:53:35 up 6:13, 6 users, load average: 0.00, 0.01, 0.05
192.168.146.120 | CHANGED | rc=0 >>
10:53:42 up 4:25, 5 users, load average: 0.00, 0.01, 0.05

利用command模塊實現批量管理:切換到/etc/目錄

[root@localhost ~]# ansible all -m command -a "pwd chdir=/etc"
192.168.146.120 | CHANGED | rc=0 >>
/etc
192.168.146.110 | CHANGED | rc=0 >>
/etc

利用command模塊實現批量管理:實踐creates

[root@localhost ~]# ansible all -m command -a "pwd creates=/loving"
192.168.146.110 | SUCCESS | rc=0 >>      #輸出綠色的信息,是因為/loving 存在,所以沒有執行pwd
skipped, since /loving exists
192.168.146.120 | CHANGED | rc=0 >>      #輸出黃色的信息,是因為/loving 不存在,執行了pwd
/root

 利用command模塊實現批量管理:removes實踐

[root@localhost ~]# ansible all -m command -a "ls /opt removes=/opt"
192.168.146.120 | CHANGED | rc=0 >> 

192.168.146.110 | CHANGED | rc=0 >>     #存在,執行命令
hosts

[root@localhost ~]# ansible all -m command -a "ls /old removes=/old"
192.168.146.120 | SUCCESS | rc=0 >>
skipped, since /old does not exist        #不存在,跳過
192.168.146.110 | SUCCESS | rc=0 >>
skipped, since /old does not exist

利用command模塊實現批量管理:warn實踐

warn=False 忽略警告的意思

[root@localhost ~]# ansible all -m command -a "chmod 000 /etc/hosts"     #警告未忽略,下面是紫色的

[WARNING]: Consider using the file module with mode rather than running 'chmod'. If you need to use
command because file is insufficient you can add 'warn: false' to this command task or set
'command_warnings=False' in ansible.cfg to get rid of this message.
192.168.146.120 | CHANGED | rc=0 >>

192.168.146.110 | CHANGED | rc=0 >>

[root@localhost ~]# ansible all -m command -a "chmod 000 /etc/hosts warn=False"     #忽略警告
192.168.146.120 | CHANGED | rc=0 >>

192.168.146.110 | CHANGED | rc=0 >>

shell模塊功能說明

功能說明:在遠程節點上執行命令(可以是多個命令)

chdir :在執行命令之前,通過cd命令進入指定的目錄

creates:定義一個文件是否存在,如果不存在,則運行相應的命令,如果存在,則逃過此步驟

free_from(必有參數):參數信息中可以輸入任何系統命令信息,實現遠程管理

removes:定義一個文件是否存在,如果存在,則運行相應的命令,如果不存在,則逃過此步驟

批量執行ps -ef|grep sshd|grep -v grep 命令

[root@localhost ~]# ansible wangju -m shell -a "ps -ef|grep sshd|grep -v grep"
192.168.146.110 | CHANGED | rc=0 >>
root 1190 1 0 11:07 ? 00:00:00 /usr/sbin/sshd -D
root 23771 1190 0 16:44 ? 00:00:00 sshd: root@pts/3
root 25186 1190 0 17:37 ? 00:00:00 sshd: root@pts/4
root 26710 1190 10 19:41 ? 00:00:00 sshd: root@pts/1

批量執行的遠程腳本

首先在被管理的主機web1上編寫遠程執行的腳本

[root@web1 ~]# echo pwd >/loving/pwd.sh
[root@web1 ~]# cat /loving/pwd.sh
pwd
[root@web1 ~]# chmod +x /loving/pwd.sh

在本地主機上運行批量管理的命令

[root@localhost ~]# ansible wangju -m shell -a "/loving/pwd.sh"
192.168.146.110 | CHANGED | rc=0 >>

/root

說明:利用shell模塊實現批量執行遠程主機腳本時,腳本必須在遠程主機上存在,並且授權執行權限。

script模塊功能說明

功能說明:把本地腳本傳輸到遠程節點上並運行腳本,和shell模塊相比,本地有一份腳本就可以在所有機器上執行。

creates:定義一個文件是否存在,如果不存在,則運行相應的命令,如果存在,則逃過此步驟

free_from(必有參數):參數信息中可以輸入任何系統命令信息,實現遠程管理

removes:定義一個文件是否存在,如果存在,則運行相應的命令,如果不存在,則逃過此步驟

批量執行遠程腳本

[root@localhost ~]# mkdir -p /server/scripts   #創建測試目錄
[root@localhost ~]# echo -e "pwd\nhostname" >/server/scripts/pwd.sh    #創建本地測試文本

[root@localhost ~]# cat /server/scripts/pwd.sh   #查看測試文本

pwd
hostname
[root@localhost ~]# chmod +x /server/scripts/pwd.sh   #賦予測試文本執行權限
[root@localhost ~]# ansible wangju -m script -a "/server/scripts/pwd.sh"   #批量執行遠程腳本
192.168.146.110 | CHANGED => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 192.168.146.110 closed.\r\n",
"stderr_lines": [
"Shared connection to 192.168.146.110 closed."
],
"stdout": "/root\r\nweb1\r\n",
"stdout_lines": [
"/root",
"web1"
]
}
說明:使用script模塊實現批量執行遠程主機腳本時,腳本不用在遠程主機上存在和授權

Ansible文件類型模塊介紹與實踐

copy模塊功能說明

功能說明:復制文件到遠程主機

src:本地路徑文件復制到遠程服務器;可以是絕對路徑,可以是相對路徑。如果路徑是一個目錄,將會遞歸復制,在這種情況下,如果路徑以”/” 結束,目錄和目錄下所有內容都會被復制,否則,如果不以“/” 結束,目錄和目錄下的所有的內容都會被復制。

dest(必有參數):文件應該被拷貝到的遠程絕對路徑信息,如果src是一個目錄,dest也必須是目錄

owner:定義所擁有的文件/目錄的所屬用戶名稱,類似chown 命令功能

group:定義所擁有的文件/目錄的所屬組名稱,類似chown 命令功能

mode:定義文件或目錄的權限信息,就像使用 /usr/bin/chmod 設定八進制數(如0644)權限一樣,取消前導零可能會有令人意想不到的結果

backup:創建備份文件並且包含時間戳信息,以便能夠還原文件,如在原文件被覆蓋錯誤時。默認配置為no,並且配置指定信息為yes|no

content:當使用代替src參數時,將文件的內容直接設置為指定值。遠端創建有指定內容文件,並且只能設置簡單值。對於任何復雜或格式化內容,請切換到template模塊

force:默認為yes,當遠程文件內容和源文件內容不同時,將覆蓋目標文件。如果為no,文件將只被傳輸,如在目標主機不存在此文件時

remote_src:如果為False,將搜索源信息在本地 / 管理及機器上;如果為True,將到遠程 / 目標主機的機器上搜索。默認為false,目前remote_src不支持遞歸復制

說明:copy模塊是遠程推送數據模塊,只能將數據推送到遠程主機上,不能實現拉取數據到本地管理主機

批量遠程復制文件

批量遠程復制文件並設置用戶、用戶組、權限屬性。

[root@localhost ~]# ansible wangju -m copy -a "src=/etc/passwd dest=/tmp/oldgirl.txt owner=user group=user mode=0755"
192.168.146.110 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"checksum": "990fa46714239836e21f7374dd86880212a14e13",
"dest": "/tmp/oldgirl.txt",
"gid": 1000,
"group": "user",
"md5sum": "7c9dd79bc081589ca7f3f80f62b2c675",
"mode": "0755",
"owner": "user",
"secontext": "unconfined_u:object_r:admin_home_t:s0",
"size": 2569,
"src": "/root/.ansible/tmp/ansible-tmp-1621431893.11-27704-63341040103486/source",
"state": "file",
"uid": 1000
}

[root@localhost ~]# ansible wangju -m command -a "ls -l /tmp/oldgirl.txt"      #登錄到遠程主機查看批量操作的結果
192.168.146.110 | CHANGED | rc=0 >>
-rwxr-xr-x. 1 user user 2569 5月 19 21:44 /tmp/oldgirl.txt

遠程批量復制文件前進行備份,並寫入指定內容到文件

[root@localhost ~]# ansible wangju -m copy -a "content='i am wangju' dest=/tmp/oldgirl.txt backup=yes"
192.168.146.110 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"backup_file": "/tmp/oldgirl.txt.28462.2021-05-19@21:51:31~",
"changed": true,
"checksum": "bc4f8fb29d1d4b01071fa83a7a9989b8687451b6",
"dest": "/tmp/oldgirl.txt",
"gid": 1000,
"group": "user",
"md5sum": "d21227243c1ce62f467bc3dd7ca7e976",
"mode": "0755",
"owner": "user",
"secontext": "unconfined_u:object_r:admin_home_t:s0",
"size": 11,
"src": "/root/.ansible/tmp/ansible-tmp-1621432318.98-27866-81318773987130/source",
"state": "file",
"uid": 1000
}

[root@localhost ~]# ansible wangju -m command -a "cat /tmp/oldgirl.txt"   #檢查文件內容是否被修改,發現文件內容與前面的不一樣了
192.168.146.110 | CHANGED | rc=0 >>
i am wangju

[root@localhost ~]# ansible wangju -m shell -a "ls /tmp/oldgirl.txt*"     #注意這里只能使用shell模塊,不能使用command,因為command模塊兒不能與通配符匹配。
192.168.146.110 | CHANGED | rc=0 >>
/tmp/oldgirl.txt
/tmp/oldgirl.txt.28462.2021-05-19@21:51:31~

file模塊兒功能說明

功能說明:創建及設置文件(目錄)屬性

src:要連接的文件路徑(只能應用state=link),創建連接文件時使用

path(必有參數):文件路徑管理:別名方式:dest,name

owner:定義所擁有的文件 / 目錄的所屬用戶名稱,類似chown命令功能

group:定義所擁有的文件 / 目錄的所屬組名稱,類似chown命令功能

mode:定義文件或目錄的權限信息,就像使用/usr/bin/chmod 設定八進制數(如0644)權限一樣,取消前導零可能會有令人意想不到的結果

state:如果指定的參數為directory,所有不存在的子目錄將會被創建,如果指定的參數為file,如果文件不存在,將不能被創建,如果想創建可以參考copy和template模塊。如果指定的參數為link,符號連接將被創建或者更改;如果指定參數為hard,便會創建出硬鏈接,如果指定參數為absent,目錄將被遞歸刪除以及文件,而連接將被取消。請注意,定義的文件不存在不會失敗,只是輸出沒有發生任何改變結果。如果指定參數為touch,如果路徑不存在將會創建一個空文件,如果文件或目錄存在將接收更新的文件訪問和修改時間。

說明:file模塊主要用於創建文件或目錄數據,以及對存在的文件或目錄權限屬性進行修改管理。

[root@localhost ~]# ansible all -m file -a "dest=/tmp/oldboy_dir state=directory"   #創建目錄信息
192.168.146.120 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"gid": 0,
"group": "root",
"mode": "0755",
"owner": "root",
"path": "/tmp/oldboy_dir",
"secontext": "unconfined_u:object_r:user_tmp_t:s0",
"size": 6,
"state": "directory",
"uid": 0
}
192.168.146.110 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"gid": 0,
"group": "root",
"mode": "0755",
"owner": "root",
"path": "/tmp/oldboy_dir",
"secontext": "unconfined_u:object_r:user_tmp_t:s0",
"size": 6,
"state": "directory",
"uid": 0
}

[root@localhost ~]# ansible wangju -m file -a "dest=/tmp/oldboy_file owner=root group=user mode=777 state=touch"     #創建文件信息
192.168.146.110 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"dest": "/tmp/oldboy_file",
"gid": 1000,
"group": "user",
"mode": "0777",
"owner": "root",
"secontext": "unconfined_u:object_r:user_tmp_t:s0",
"size": 0,
"state": "file",
"uid": 0
}

[root@localhost ~]# ansible wangju -m file -a "src=/etc/hosts dest=/tmp/link_file state=link"     #創建連接信息
192.168.146.110 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"dest": "/tmp/link_file",
"gid": 0,
"group": "root",
"mode": "0777",
"owner": "root",
"secontext": "unconfined_u:object_r:user_tmp_t:s0",
"size": 10,
"src": "/etc/hosts",
"state": "link",
"uid": 0
}

[root@localhost ~]# ansible wangju -m shell -a "ls -l /tmp/"   #登錄到遠程節點主機進行檢查,發現我們創建的文件都能查到
192.168.146.110 | CHANGED | rc=0 >>
總用量 264
drwx------. 2 root root 41 5月 19 22:31 ansible_command_payload_OaHPFe
lrwxrwxrwx. 1 root root 10 5月 19 22:29 link_file -> /etc/hosts      #新建的鏈接文件
drwxr-xr-x. 2 root root 6 5月 19 22:24 oldboy_dir         #新建的目錄
-rwxrwxrwx. 1 root user 0 5月 19 22:26 oldboy_file        #新創建的文件
-rwxr-xr-x. 1 user user 11 5月 19 21:51 oldgirl.txt
-rwxr-xr-x. 1 user user 2569 5月 19 21:44 oldgirl.txt.28462.2021-05-19@21:51:31~

結束啦!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM