ansilbe是實現自動化運維的工具,基於python開發,實現批量系統配置,批量程序部署,批量運行命令等功能。node
ansible是基於模塊工做的,自身是沒有批量部署的能力。真正具備批量部署能力的是ansible的模塊,ansbile只是提供一種框架python
ansbile特色mysql
模塊化:使用特定的模塊,完成特定的工做web
支持自定義模塊redis
基於Python語言開發的sql
不須要再被控端安裝組件,也就是無需客戶端,直接在服務端執行命令。shell
批量任務執行能夠用腳本,也不須要傳遞到遠程就能夠執行。vim
ansible的基本架構:bash
1.連接插件用於鏈接主機,鏈接受控端。架構
2.核心模塊鏈接主機實現操做,依靠模塊作具體的事情。
3.自定義模塊:根據本身的需求編寫模塊
4.插件是對模塊功能的補充。
5.playbook,ansible功能的形象化描述。
6.host inventory 定義ansible須要的操做主機的範圍
服務端:10.220.5.63
兩個被控端:10.220.5.65
10.220.5.66
1、安裝ansible
[root@63 ~]# yum install ansible
查看版本
[root@63 ~]# ansible --version ansible 2.6.2 config file = /etc/ansible/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, Apr 11 2018, 07:36:10) [GCC 4.8.5 2015
相關文檔
[root@63~]# rpm -qc ansible /etc/ansible/ansible.cfg /etc/ansible/hosts
2、生成密鑰
[root@63 ~]# ssh-keygen -t rsa
[root@63 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub 10.220.5.63 [root@63 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub 10.220.5.65 [root@63~]# ssh-copy-id -i ~/.ssh/id_rsa.pub 10.220.5.66
[root@63 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub 10.220.5.63 <<<本身也做爲受控端 [root@63 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub 10.220.5.65 [root@63~]# ssh-copy-id -i ~/.ssh/id_rsa.pub 10.220.5.66
在主控端/etc/hosts中添加受控端主機信息
[root@63 ~]# vim /etc/hosts
10.220.5.65 slave1
10.220.5.66 slave2
測試是否能免密碼登陸
[root@63 ~]# ssh slave1 Last login: Sat Nov 17 01:32:37 2018 from 10.220.5.63
[root@slave1 ~]# <<<爲10.220.5.65主機
測試
[root@63 ~]# ssh slave1 ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 1000 link/ether 00:0c:29:d1:a8:6a brd ff:ff:ff:ff:ff:ff inet 10.220.5.65/24 brd 10.220.5.255 scope global noprefixroute ens33 valid_lft forever preferred_lft forever inet 10.220.5.233/24 scope global secondary ens33:1 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fed1:a86a/64 scope link valid_lft forever preferred_lft forever
3、使用ansible管理其餘節點
格式:ansible <host> [options]
選項:
-m:指定模塊名稱
-a:指定模塊的具體參數
-s:以sudo的方式運行操做
-i:指定被管理節點的主機列表
-f:一次鏈接幾個主機進行操做(默認是5個主機)
查看ansible所支持的模塊的信息
[root@63 ~]# ansible-doc -l
默認用command模塊
查看一個模塊的使用幫助
例:
[root@63 ~]# ansible-doc -s command - name: Executes a command on a remote node command: argv: # Allows the user to provide the command as a list vs. a string. Only the string or the list form can be provided, not both. One or the other must be provided. chdir: # Change into this directory before running the command. creates: # A filename or (since 2.0) glob pattern, when it already exists, this step will *not* be run. free_form: # (required) The command module takes a free form command to run. There is no parameter actually named 'free form'. See the examples! removes: # A filename or (since 2.0) glob pattern, when it does not exist, this step will *not* be run. stdin: # Set the stdin of the command directly to the specified value. warn: # If command_warnings are on in ansible.cfg, do not warn about this particular line if set to `no'.
默認模塊
做用:在各個遠程主機上執行命令,可是不能傳遞參數和變量,不支持特殊字符
格式:ansible 目標 -m command -a "命令"
說明:
目標:目標能夠是一個主機組,也能夠是hosts文件中的一個或者多個主機,也但是all
-m command:表示此次ansible操做是基於command模塊實現
-a "命令":表示是在管理節點上要執行的命令
例子:獲取受控節點主機名
[root@63~]# ansible webserver -m command -a "hostname" 10.220.5.65 | SUCCESS | rc=0 >> slave1 10.220.5.66 | SUCCESS | rc=0 >> slave2
也能夠單獨對一個受控端執行命令
[root@63 ~]# ansible 10.220.5.65 -m command -a "hostname" 10.220.5.65 | SUCCESS | rc=0 >> slave1
也是在各個遠程主機上執行命令,但shell模塊能夠支持特殊字符,command不支持
chdir:指定一個目錄,在執行對應的命令以前,會先進入到 chdir 參數指定的目錄中。
creates:數指定一個文件,當指定的文件存在時,就不執行對應命令
removes:指定一個文件,當指定的文件不存在時,就不執行對應命令
executable:默認狀況下,shell 模塊會調用遠程主機中的 /bin/sh 去執行對應的命令,一般狀況下,遠程主機中的默認 shell 都是 bash。若是你想要使用其餘類型的 shell 執行命令,則可使用此參數指定某種類型的 shell 去執行對應的命令。指定 shell 文件時,須要使用絕對路徑。
例子:獲取65主機/tmp全部文件
[root@63 ~]# ansible 10.220.5.65 -m shell -a "ls /tmp/*" 10.220.5.65 | SUCCESS | rc=0 >> /tmp/mysql3306.sock /tmp/mysql3306.sock.lock
做用:在遠程主機執行主控端存的shell腳本(至關於scp+shell)
[root@63 ~]# ansible all -m script -a "/root/shell.sh" 10.220.5.66 | SUCCESS => { "changed": true, "rc": 0, "stderr": "Shared connection to 10.220.5.66 closed.\r\n", "stderr_lines": [ "Shared connection to 10.220.5.66 closed." ], "stdout": "", "stdout_lines": [] } 10.220.5.65 | SUCCESS => {
做用:在指定的時間運行指定命令(計劃任務)
cron: backup: 計劃名稱 cron_file: 替換客戶端用戶的計劃任務的文件 day: 日 hour: 小時
name: 設置計劃任務的名稱
disabled:當計劃任務有名稱時,咱們能夠根據名稱使對應的任務」失效」(註釋掉對應的任務)。
除了須要指定任務的名稱,還須要同時指定任務的job 以及任務的時間設定,並且任務的時間設定必須和對應任務徹底相同,
不然在註釋任務的同時,任務的時間設定會被修改,除非你肯定這樣作。
special_time 後面可加: reboot(重啓後)、yearly(每一年)、annually(每一年,與yearly相同)、monthly(每個月)、weekly(每週)、daily(天天)、hourly(每時)。 user: 設置當前計劃任務屬於哪一個用戶,若是不指定,默認爲管理員用戶 backup: 在修改或者刪除計劃任務時,會先對計劃任務作備份,而後在進行修改或者刪除 job: 用於指定計劃任務中須要實際執行的命令或者腳本
state: 當計劃任務有名字時,能夠根據名稱修改或者刪除對應的任務,若是須要刪除計劃任務時,須要將state的值設置爲absent
例子1:每隔2分鐘再tmp下的log.txt中追加一個信息
[root@63 ~]# ansible all -m cron -a 'minute="*/2" job="echo 123>>/tmp/log.txt" name="job1" state="present"' 10.220.5.66 | SUCCESS => { "changed": true, "envs": [], "jobs": [ "job1" ] } 10.220.5.65 | SUCCESS => { "changed": true, "envs": [], "jobs": [ "job1" ]
例子2.在65主機上建立計劃任務,任務名稱爲crontab day test ,任務每五天執行一次,任務內容輸出爲test
[root@63 ~]# ansible all -m cron -a " name='crontab day test' minute=1 day=*/3 job='echo test'" 10.220.5.65 | SUCCESS => { "changed": true, "envs": [], "jobs": [ "job1", "crontab day test" ] } 10.220.5.66 | SUCCESS => { "changed": true, "envs": [], "jobs": [ "job1", "crontab day test" ] }
例子:.在 65主機上建立計劃任務,任務名稱爲」special time test」,任務將在重啓時執行,任務內容爲輸出 test 字符。
[root@63 ~]# ansible 10.220.5.65 -m cron -a " name='special time test' special_time=reboot job='echo test'" 10.220.5.65 | SUCCESS => { "changed": true, "envs": [], "jobs": [ "job1", "crontab day test", "special time test"
例子:任務」special time test」已經存在於65主機中。,要刪除這個計劃任務,刪除任務的同時能夠進行備份。
[root@63~]# ansible 10.220.5.65 -m cron -a " name='special time test' state=absent backup=yes " 10.220.5.65 | SUCCESS => { "backup_file": "/tmp/crontabNaCVq8", "changed": true, "envs": [], "jobs": [ "job1", "crontab day test"
檢查一下在65主機上建立的計劃任務
[root@63~]# ansible 10.220.5.65 -a "crontab -l" 10.220.5.65 | SUCCESS | rc=0 >> #Ansible: job1 */2 * * * * echo 123>>/tmp/log.txt #Ansible: crontab day test 1 * */3 * * echo test
做用:文件的複製
子命令:
src:原文件路徑
dest:目標文件路徑
mode:指定權限
backup:有目標文件存在,先對原始文件作備份,而後進行覆蓋
force:強制執行覆蓋
owner:指定複製後的文件的屬主
content:替代src
others:全部的file模塊裏的選項均可以在這裏使用
例子1:將主控端/etc/passwd 文件,複製到65主機/tmp/目錄下,並該名爲psswd1
[root@63 ~]# ansible 10.220.5.65 -m copy -a 'src="/etc/passwd" dest=/tmp/passwd1' 10.220.5.65 | SUCCESS => { "changed": false, "checksum": "be868aa216508a02c3e0c64186e77f191f27eeca", "dest": "/tmp/passwd1", "gid": 0, "group": "root", "mode": "0644", "owner": "root", "path": "/tmp/passwd1", "size": 1565, "state": "file", "uid": 0
home:指定用戶的家目錄,須要與createhome配合使用。
groups:指定用戶的屬組。
uid:指定用的uid。
password:指定用戶的密碼。
注意:指定password參數時,不能使用明文密碼,由於後面這一串密碼會被直接傳送到被管理主機的/etc/shadow文件中,因此須要先將密碼字符串進行加密處理。而後將獲得的字符串放到password中便可。
name:指定用戶名。
createhome:是否建立家目錄 yes|no。
system:是否爲系統用戶。
remove:當state=absent時,remove=yes則表示連同家目錄一塊兒刪除,等價於userdel -r。
state:是建立仍是刪除。(present,absent)
shell:指定用戶的shell環境。
generate_ssh_key:是否爲相關用戶生成SSH密鑰。 這不會覆蓋現有的SSH密鑰。
ssh_key_bits:可選擇指定要建立的SSH密鑰中的位數。
ssh_key_passphrase:設置SSH密鑰的密碼。 若是沒有提供密碼,SSH密鑰將默認沒有密碼。
ssh_key_file:指定SSH密鑰文件名(可選)。 若是這是一個相對的文件名,那麼它將是相對於用戶的主目錄。
ssh_key_type:指定要生成的SSH密鑰的類型(可選)。 可用的SSH密鑰類型將取決於目標主機上的實現。
例子:在65主機上建立用戶名爲qq,家目錄爲/home/,屬組爲redis,uid爲1010
[root@63 ~]# ansible 10.220.5.65 -m user -a "name=qq home=/home/qq createhome=yes groups=redis uid=1010" 10.220.5.65 | SUCCESS => { "changed": true, "comment": "", "create_home": true, "group": 1010, "groups": "redis", "home": "/home/qq", "name": "qq", "shell": "/bin/bash", "state": "present", "system": false, "uid": 1010
例子:在65主機上建立用戶組httpd
[root@66 ~]# ansible 10.220.5.65 -m group -a "name=httpd state=present" 10.220.5.65 | SUCCESS => { "changed": true, "gid": 1012, "name": "httpd", "state": "present", "system": fals
RedHat / CentOS包管理工具
config_file:yum的配置文件
disable_gpg_check:關閉gpg_check
disablerepo:不啓用某個源
enablerepo:啓用某個源
name:要進行操做的軟件包的名字,默認最新的程序包,指明要安裝的程序包,能夠帶上版本號,也能夠傳遞一個url或者一個本地的rpm包的路徑
state:狀態(present,absent,latest),表示是安裝還卸載
present:默認的,表示爲安裝
lastest: 安裝爲最新的版本
absent:表示刪除
例子:在65主機安裝httpd
[root@63~]# ansible 10.220.5.65 -m yum -a "name=httpd state=present" 10.220.5.65 | SUCCESS => { "changed": true, "msg": "", "rc": 0, ................................... }
做用:實現文件的各類管理操做
force:須要在兩種狀況下強制建立軟連接,一種是源文件不存在但以後會創建的狀況下;另外一種是目標軟連接已存在,須要先取消以前的軟鏈,而後建立新的軟鏈,有兩個選項:yes|no
group:屬組
mode:權限
owner:屬主
path:路徑
recurse:遞歸的設置文件的屬性,只對目錄有效
src:要被連接的源文件的路徑,只應用於state=link的狀況
dest:被連接到的路徑,只應用於state=link的狀況
state:
directory:若是目錄不存在,建立目錄
file:即便文件不存在,也不會被建立
link:建立軟連接
hard:建立硬連接
touch:若是文件不存在,則會建立一個新的文件,若是文件或目錄已存在,則更新其最後修改時間
absent:刪除目錄、文件或者取消連接文件
例子:在65主機上建立文件abc.sh
[root@63 ~]# ansible 10.220.5.65 -m file -a 'state=touch path=/tmp/abc.sh' 10.220.5.65 | SUCCESS => { "changed": true, "dest": "/tmp/abc.sh", "gid": 0, "group": "root", "mode": "0644", "owner": "root", "size": 0, "state": "file", "uid": 0
將65主機/tmp/abc.sh 連接爲/tmp/abc
[root@63 ~]# ansible 10.220.5.65 -m file -a 'state=link src=/tmp/abc.sh path=/tmp/abc' 10.220.5.65 | SUCCESS => { "changed": true, "dest": "/tmp/abc", "gid": 0, "group": "root", "mode": "0777", "owner": "root", "size": 11, "src": "/tmp/abc.sh", "state": "link", "uid": 0 }
做用:管理服務
子命名;
name:指定服務的名稱
enabled:指定服務是否開機自啓動
state:指定服務最後的狀態 started stopped reloaded restarted
runlevel:指定運行級別
例子:在65主機上重啓網卡
[root@66 ~]# ansible 10.220.5.65 -m service -a "name=network state=restarted" 10.220.5.65 | SUCCESS => { "changed": true, "name": "network", "state": "started",
做用:作ping測試
例子:對64主機作ping測試
[root@66 ~]# ansible 10.220.5.64 -m ping 10.220.5.64 | SUCCESS => { "changed": false, "ping": "pong" }
配置掛載點
選項:
dumpfstype:必選項,掛載文件的類型
name:必選項,掛載點
opts:傳遞給mount命令的參數
src:必選項,要掛載的文件
state:必選項
present:只處理fstab中的配置
absent:刪除掛載點
mounted:自動建立掛載點並掛載之
umounted:卸載
例子:在64主機上掛載光盤到/mnt
[root@66 ~]# ansible 10.220.5.64 -m mount -a "name=/mnt src=/dev/sr0 fstype=iso9660 state=mounted" 10.220.5.64 | SUCCESS => { "changed": true, "dump": "0", "fstab": "/etc/fstab", "fstype": "iso9660", "name": "/mnt",