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~
結束啦!!!