ansible基本使用教程

轉載請註明出處http://www.cnblogs.com/chenxianpao/p/7360349.htmlhtml

1、 介紹

1. 簡介
    ansible是新出現的自動化運維工具,基於Python開發,集合了衆多運維工具(puppet、cfengine、chef、func、fabric)的優勢,實現了批量系統配置、批量程序部署、批量運行命令等功能。
    ansible是基於模塊工做的,自己沒有批量部署的能力。真正具備批量部署的是ansible所運行的模塊,ansible只是提供一種框架。主要包括:
(1)、鏈接插件connection plugins:負責和被監控端實現通訊;
(2)、host inventory:指定操做的主機,是一個配置文件裏面定義監控的主機;
(3)、各類模塊核心模塊、command模塊、自定義模塊;
(4)、藉助於插件完成記錄日誌郵件等功能;
(5)、playbook:劇本執行多個任務時,非必需可讓節點一次性運行多個任務。
 
官網地址: https://docs.ansible.com
在線playbook分享平臺: https://galaxy.ansible.com
 
2. 特性
(1)、no agents:不須要在被管控主機上安裝任何客戶端;
(2)、no server:無服務器端,使用時直接運行命令便可;
(3)、modules in any languages:基於模塊工做,可以使用任意語言開發模塊;
(4)、yaml,not code:使用yaml語言定製劇本playbook;
(5)、ssh by default:基於SSH工做;
(6)、strong multi-tier solution:可實現多級指揮。
 
3. 優勢
(1)、輕量級,無需在客戶端安裝agent,更新時,只需在操做機上進行一次更新便可;
(2)、批量任務執行能夠寫成腳本,並且不用分發到遠程就能夠執行;
(3)、使用python編寫,維護更簡單,ruby語法過於複雜;
(4)、支持sudo。
 
4. 基本架構(懶人,圖源於網絡,謝做圖之人)
                                                   ansible基本架構
· 核心引擎:即ansible
· 核心模塊(core modules):這些都是ansible自帶的模塊,ansible模塊資源分發到遠程節點使其執行特定任務或匹配一個特定的狀態。
· 自定義模塊(custom modules):若是核心模塊不足以完成某種功能,能夠添加自定義模塊。
· 插件(plugins):完成模塊功能的補充,藉助於插件完成記錄日誌、郵件等功能
· 劇本(playbook):定義ansible任務的配置文件,能夠將多個任務定義在一個劇本中,由ansible自動執行,劇本執行支持多個任務,能夠由控制主機運行多個任務,同時對多臺遠程主機進行管理。
· playbook是ansible的配置、部署和編排語言,能夠描述一個你想要的遠程系統執行策略,或一組步驟的通常過程。若是ansible模塊做爲你的工做室工具,playbook就是設計方案。在基本層面上,劇本能夠用於管理配置和部署遠程機器。在更高級的應用中,能夠序列多層應用及滾動更新,並能夠把動做委託給其餘主機,與監控服務器和負載平衡器交互。
· 鏈接插件(connection plugins):ansible基於鏈接插件鏈接到各個主機上,負責和被管理節點實現通訊。雖然ansible是使用ssh鏈接到各被管理節點,但它還支持其餘的鏈接方法,因此須要有鏈接插件。
· 主機清單(host inventory):定義ansible管理的主機策略,默認是在ansible的hosts配置文件中定義被管節點,同時也支持自定義動態主機清單和指定配置文件路徑。
 
    ansible採用paramiko協議庫(Fabric也使用這個),經過ssh或者ZeroMQ等鏈接主機。ansible在控制主機主機將ansible模塊經過ssh協議(或者Kerberos、LDAP)推送到被管節點執行,執行完以後自動刪除。控制主機與被管理節點之間支持local、SSH、ZeroMQ三種鏈接方式,默認使用基於SSH的鏈接。在規模較大的狀況下使用ZeroMQ鏈接方式會明顯改善執行速度。
 
5. 任務執行模式(懶人,圖源於網絡,謝做圖之人)
    ansible系統由控制主機對被管節點的操做方式可分爲兩類,即ad-hoc和playbook。
    ad-hoc模式使用單個模塊,支持批量執行單條命令。
    playbook模式是ansible的主要管理方式,經過多個task集合完成一類功能,能夠簡單的理解爲經過組合多條ad-hoc操做的配置文件。
                                                         ansible內部執行過程
6. ansible與其餘配置管理軟件的對比
                                                                                                           技術特性比較:
項目 Puppet Saltstack Ansible
開發語言 Ruby Python Python
是否有客戶端
是否支持二次開發 不支持 支持 支持
服務器與遠程機器是否相互驗證
服務器與遠程機器通訊是否加密 是,標準SSL協議 是,使用AES加密 是,使用OpenSSH
是否提供WEB UI 提供 提供 提供,可是商業版本
配置文件格式 Ruby語法 YAML YAML
命令行執行 不支持,但能夠經過配置模塊實現 支持 支持

2、ansible組件介紹

 
1. ansible inventory
    在大規模的配置管理工做中咱們須要管理不一樣業務的機器,這些機器的信息都存放在ansible的inventory組件裏。在咱們工做中配置部署針對的主機必須先存放在inventory裏,這樣才能使用ansible對它進行操做。默認ansible的inventory是一個靜態的ini文件/etc/ansible/hosts。亦可經過ANSIBLE_HOSTS環境變量指定或者命令運行時用-i參數臨時設置。
參考示例:
定義主機和主機組
一、100.0.0.1 ansible_ssh_pass='123456'
二、100.0.0.2 ansible_ssh_pass='123456'
三、[docker]
四、100.0.0.1[1:3]
五、[docker:vars]
六、ansible_ssh_pass='123456'
七、[ansible:children]
八、docker
第1、二行定義一個主機,指定ssh登陸密碼
第三行定義了一個叫docker的組
第四行定義了docker組下面四個主機從100.0.0.11-100.0.0.13
第5、六行定義了docker組的ssh登陸密碼
第7、八行定義了ansible組,ansible組包含docker組
 
2.inventory內置參數
 
參考 解釋 例子
ansible_ssh_host 將要鏈接的遠程主機名.與你想要設定的主機的別名不一樣的話,可經過此變量設置. ansible_ssh_host=192.169.1.123
ansible_ssh_port ssh端口號.若是不是默認的端口號,經過此變量設置. ansible_ssh_port=5000
ansible_ssh_user 默認的 ssh 用戶名 ansible_ssh_user=cxpadmin
ansible_ssh_pass ssh 密碼(這種方式並不安全,咱們強烈建議使用 --ask-pass 或 SSH 密鑰) ansible_ssh_pass=’123456’
ansible_sudo_pass sudo 密碼(這種方式並不安全,咱們強烈建議使用 --ask-sudo-pass) ansible_sudo_pass=’123456’
ansible_sudo_exe sudo 命令路徑(適用於1.8及以上版本) ansible_sudo_exe=/usr/bin/sudo
ansible_connection 與主機的鏈接類型.好比:local, ssh 或者 paramiko. Ansible 1.2 之前默認使用 paramiko.1.2 之後默認使用 'smart','smart' 方式會根據是否支持 ControlPersist, 來判斷'ssh' 方式是否可行. ansible_connection=local
ansible_ssh_private_key_file ssh 使用的私鑰文件.適用於有多個密鑰,而你不想使用 SSH 代理的狀況. ansible_ssh_private_key_file=/root/key
ansible_shell_type 目標系統的shell類型.默認狀況下,命令的執行使用 'sh' 語法,可設置爲 'csh' 或 'fish'. ansible_shell_type=zsh
ansible_python_interpreter 目標主機的 python 路徑.適用於的狀況: 系統中有多個 Python, 或者命令路徑不是"/usr/bin/python",好比 \*BSD, 或者 /usr/bin/python
不是 2.X 版本的 Python.咱們不使用 "/usr/bin/env" 機制,由於這要求遠程用戶的路徑設置正確,且要求 "python" 可執行程序名不可爲 python之外的名字(實際有可能名爲python26).
ansible_python_interpreter=/usr/bin/python2.6
ansible_*_interpreter 定義其餘語言解釋器 ansible_*_interpreter=/usr/bin/ruby
ansible_sudo 定義sudo用戶 ansible_sudo=cxpadmin
注:從ansible2.0開始, ansible_ssh_user, ansible_ssh_host, ansible_ssh_port已經改變爲ansible_user, ansible_host, ansible_port。具體參考官網 http://docs.ansible.com/ansible/latest/intro_inventory.html
 
3. ansible ad-hoc命令
    咱們常常會經過命令行的形式使用ansible模塊,ansible自帶不少模塊,能夠直接使用這些模塊。目前ansible已經自帶了200+個模塊,咱們可使用ansible-doc -l顯示全部自帶模塊,還可使用ansible-doc 模塊名,查看模塊的介紹以及案例。須要注意的是,若是使用ad-hoc命令,ansible的一些插件功能就沒法使用,好比loop facts功能等。
命令用法:ansible <host-pattern> [options]
 

經常使用模塊介紹

① ping模塊
ping模塊的做用與其名相同,即判斷遠程主機的網絡是否暢通
示例:ansible cluster_hosts -m ping
 
② copy模塊
copy模塊在ansible裏的角色就是把ansible執行機器上的文件拷貝到遠程節點上。與fetch模塊相反的操做。
經常使用模塊參數
參數名 是否必須 默認值 選項 說明
src no     用於定位ansible執行的機器上的文件,須要絕對路徑。若是拷貝的是文件夾,那麼文件夾會總體拷貝,若是結尾是」/」,那麼只有文件夾內的東西被考過去。一切的感受很像rsync
content no     用來替代src,用於將指定文件的內容,拷貝到遠程文件內
dest yes     用於定位遠程節點上的文件,須要絕對路徑。若是src指向的是文件夾,這個參數也必須是指向文件夾
backup no no yes/no 備份遠程節點上的原始文件,在拷貝以前。若是發生什麼意外,原始文件還能使用。
directory_mode no     這個參數只能用於拷貝文件夾時候,這個設定後,文件夾內新建的文件會被拷貝。而老舊的不會被拷貝
follow no no yes/no 當拷貝的文件夾內有link存在的時候,那麼拷貝過去的也會有link
force no yes yes/no 默認爲yes,會覆蓋遠程的內容不同的文件(可能文件名同樣)。若是是no,就不會拷貝文件,若是遠程有這個文件
group no     設定一個羣組擁有拷貝到遠程節點的文件權限
mode no     等同於chmod,參數能夠爲「u+rwx or u=rw,g=r,o=r」
owner no     設定一個用戶擁有拷貝到遠程節點的文件權限
 
示例:將文件copy到測試主機
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
[root@node1 ansible]# ansible testservers -m copy -a 'src=/root/install.log dest=/tmp/install.log owner=testuser group=testgroup'
192.168.100.131 | success >> {
"changed": true,
"checksum": "7b3626c84bb02d12472c03d2ece878fdc4756c94",
"dest": "/tmp/install.log",
"gid": 1100,
"group": "testgroup",
"md5sum": "c7d8a01a077940859e773b7770d2e07e",
"mode": "0644",
"owner": "testuser",
"size": 9458,
"src": "/root/.ansible/tmp/ansible-tmp-1456387213.94-229503410500766/source",
"state": "file",
"uid": 1000
}

192.168.100.132 | success >> {
"changed": true,
"checksum": "7b3626c84bb02d12472c03d2ece878fdc4756c94",
"dest": "/tmp/install.log",
"gid": 1100,
"group": "testgroup",
"md5sum": "c7d8a01a077940859e773b7770d2e07e",
"mode": "0644",
"owner": "testuser",
"size": 9458,
"src": "/root/.ansible/tmp/ansible-tmp-1456387213.94-186055595812050/source",
"state": "file",
"uid": 1000
}
示例:copy 前先備份
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
[root@node1 ansible]# echo "test " >> /root/install.log
[root@node1 ansible]# ansible testservers -m copy -a 'src=/root/install.log dest=/tmp/install.log owner=testuser group=testgroup backup=yes'
192.168.100.132 | success >> {
"backup_file": "/tmp/install.log.2016-02-25@16:01:26~",
"changed": true,
"checksum": "b5da7af32ad02eb98f77395b28f281a965b4c1f5",
"dest": "/tmp/install.log",
"gid": 1100,
"group": "testgroup",
"md5sum": "d39956add30a18019cb5ad2381a0cd43",
"mode": "0644",
"owner": "testuser",
"size": 9464,
"src": "/root/.ansible/tmp/ansible-tmp-1456387285.87-128685659798967/source",
"state": "file",
"uid": 1000
}

192.168.100.131 | success >> {
"backup_file": "/tmp/install.log.2016-02-25@16:01:26~",
"changed": true,
"checksum": "b5da7af32ad02eb98f77395b28f281a965b4c1f5",
"dest": "/tmp/install.log",
"gid": 1100,
"group": "testgroup",
"md5sum": "d39956add30a18019cb5ad2381a0cd43",
"mode": "0644",
"owner": "testuser",
"size": 9464,
"src": "/root/.ansible/tmp/ansible-tmp-1456387285.86-134452201968647/source",
"state": "file",
"uid": 1000
}

[root@node1 ansible]# ansible testservers -m raw -a 'ls -lrth /tmp/install*'
192.168.100.131 | success | rc=0 >>
-rw-r--r-- 1 root root 9.3K 2 25 16:00 /tmp/install.log.2016-02-25@16:01:26~
-rw-r--r-- 1 testuser testgroup 9.3K 2 25 16:01 /tmp/install.log


192.168.100.132 | success | rc=0 >>
-rw-r--r-- 1 root root 9.3K 2 25 16:00 /tmp/install.log.2016-02-25@16:01:26~
-rw-r--r-- 1 testuser testgroup 9.3K 2 25 16:01 /tmp/install.log
示例:將目錄copy過去
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
[root@node1 ansible]# tree testdir
testdir
├── a
│ ├── e
│ │ └── ansible.cfg
│ ├── f
│ └── g
├── b
│ ├── e
│ ├── f
│ └── g
└── c
├── ansible.cfg
├── e
├── f
└── g


[root@node1 ansible]# ansible testservers -m copy -a 'src=/etc/ansible/testdir dest=/tmp/ owner=testuser group=testgroup backup=yes'
192.168.100.131 | success >> {
"changed": true,
"dest": "/tmp/",
"src": "/etc/ansible/testdir"
}

192.168.100.132 | success >> {
"changed": true,
"dest": "/tmp/",
"src": "/etc/ansible/testdir"
}

[root@node1 ansible]# ansible testservers -m command -a 'tree /tmp/testdir'
192.168.100.131 | success | rc=0 >>
/tmp/testdir
|-- a
| `-- e
| `-- ansible.cfg
|-- b
| `-- e
| `-- hosts
`-- c
`-- ansible.cfg

5 directories, 3 files

192.168.100.132 | success | rc=0 >>
/tmp/testdir
|-- a
| `-- e
| `-- ansible.cfg
|-- b
| `-- e
| `-- hosts
`-- c
`-- ansible.cfg

5 directories, 3 files
注意:發現有文件的目錄copy成功,空的目錄沒有copy過去
 
經常使用參數返回值
參數名 參數說明 返回值 返回值類型 樣例
src 位於ansible執行機上的位置 changed string /home/httpd/.ansible/tmp/ansible-tmp-1423796390.97-147729857856000/source
backup_file 將原文件備份 changed and if backup=yes string /path/to/file.txt.2015-02-12@22:09~
uid 在執行後,擁有者的ID success int 100
dest 遠程節點的目標目錄或文件 success string /path/to/file.txt
checksum 拷貝文件後的checksum值 success string 6e642bb8dd5c2e027bf21dd923337cbb4214f827
md5sum 拷貝文件後的md5 checksum值 when supported string 2a5aeecc61dc98c4d780b14b330e3282
state 執行後的狀態 success string file
gid 執行後擁有文件夾、文件的羣組ID success int 100
mode 執行後文件的權限 success string 0644
owner 執行後文件全部者的名字 success string httpd
group 執行後文件全部羣組的名字 success string httpd
size 執行後文件大小 success int 1220
 
③ shell模塊
它負責在被ansible控制的節點(服務器)執行命令行。shell 模塊是經過/bin/sh進行執行,因此shell 模塊能夠執行任何命令,就像在本機執行同樣。
經常使用參數
參數 是否必須 默認值 選項 說明
chdir no     跟command同樣的,運行shell以前cd到某個目錄
creates no     跟command同樣的,若是某個文件存在則不運行shell
removes no     跟command同樣的,若是某個文件不存在則不運行shell
 
示例1: 
讓全部節點運行somescript.sh並把log輸出到somelog.txt。
$ ansible -i hosts all -m shell -a "sh somescript.sh >> somelog.txt"
示例2: 
先進入somedir/ ,再在somedir/目錄下讓全部節點運行somescript.sh並把log輸出到somelog.txt。
$ ansible -i hosts all -m shell -a "somescript.sh >> somelog.txt" chdir=somedir/
示例3: 
先cd到某個須要編譯的目錄,執行condifgure而後,編譯,而後安裝。
$ ansible -i hosts all -m shell -a "./configure && make && make insatll" chdir=/xxx/yyy/
 
④ command模塊
command 模塊用於運行系統命令。不支持管道符和變量等("<", ">", "|", and "&"等),若是要使用這些,那麼可使用shell模塊。在使用ansible中的時候,默認的模塊是-m command,從而模塊的參數不須要填寫,直接使用便可。
經常使用參數
參數 是否必須 默認值 選項 說明
chdir no     運行command命令前先cd到這個目錄
creates no     若是這個參數對應的文件存在,就不運行command
executable no     將shell切換爲command執行,這裏的全部命令須要使用絕對路徑
removes no     若是這個參數對應的文件不存在,就不運行command
示例1:
#ansible 命令調用command: ansible -i hosts all -m command -a "/sbin/shutdown -t now"
ansible命令行調用-m command模塊 -a表示使用參數 「」內的爲執行的command命令,該命令爲關機。 
那麼對應的節點(192.168.10.12,127.152.112.13)都會執行關機。
示例2:
# Run the command if the specified file does not exist. ansible -i hosts all -m command -a "/usr/bin/make_database.sh arg1 arg2 creates=/path/to/database"
利用creates參數,判斷/path/to/database這個文件是否存在,存在就跳過command命令,不存在就執行command命令。
 
⑤ raw模塊
raw模塊的功能與shell和command相似。但raw模塊運行時不須要在遠程主機上配置python環境。
示例:
在10.1.1.113節點上運行hostname命令
ansible 10.1.1.113 -m raw-a 'hostname|tee'
 
⑥ fetch模塊
文件拉取模塊主要是將遠程主機中的文件拷貝到本機中,和copy模塊的做用剛剛相反,而且在保存的時候使用hostname來進行保存,當文件不存在的時候,會出現錯誤,除非設置了選項fail_on_missing爲yes
 
經常使用參數
參數 必填 默認值 選項 說明
Dest Yes     用來存放文件的目錄,例如存放目錄爲backup,源文件名稱爲/etc/profile在主機pythonserver中,那麼保存爲/backup/pythonserver/etc/profile
Fail_on_missing No No Yes/no 當源文件不存在的時候,標識爲失敗
Flat No     容許覆蓋默認行爲從hostname/path到/file的,若是dest以/結尾,它將使用源文件的基礎名稱
Src Yes     在遠程拉取的文件,而且必須是一個file,不能是目錄
Validate_checksum No Yes Yes/no 當文件fetch以後進行md5檢查
示例1:
fetch一個文件保存,src表示爲遠程主機上須要傳送的文件路徑,dest表示爲本機上的路徑,在傳送過來的文件,是按照IP地址進行分類,而後路徑是源文件的路徑。在拉取文件的時候,必須拉取的是文件,不能拉取文件夾。
[root@ansibleserver ~]# ansible pythonserver -m fetch -a "src=/root/123 dest=/root"
SSH password:
192.168.1.60 | success >> {
    "changed": true,
    "dest": "/root/192.168.1.60/root/123",
    "md5sum": "31be5a34915d52fe0a433d9278e99cac",
    "remote_md5sum": "31be5a34915d52fe0a433d9278e99cac"
}
示例2:
指定路徑目錄進行保存。在使用參數爲flat的時候,若是dest的後綴名爲/,那麼就會保存在目錄中,而後直接保存爲文件名;當dest後綴不爲/的時候,那麼就會直接保存爲kel的文件。主要是在於dest是否已/結尾,從而來區分這是個目錄仍是路徑。
[root@ansibleserver ~]# ansible pythonserver -m fetch -a "src=/root/Ssh.py dest=/root/kel/ flat=yes"
SSH password:
192.168.1.60 | success >> {
    "changed": true,
    "dest": "/root/kel/Ssh.py",
    "md5sum": "63f8a200d1d52d41f6258b41d7f8432c",
    "remote_md5sum": "63f8a200d1d52d41f6258b41d7f8432c"
}
 
⑦ file模塊
主要用來設置文件、連接、目錄的屬性,或者移除文件、連接、目錄,不少其餘的模塊也會包含這種做用,例如copy,assemble和template。
經常使用參數
參數 必填 默認 選項 說明
Follow No No Yes/no 這個標識說明這是系統連接文件,若是存在,應該遵循
Force No No Yes/no 強制建立連接在兩種狀況下:源文件不存在(過會會存在);目標存在可是是文件(建立連接文件替代)
Group No     文件所屬用戶組
Mode No     文件所屬權限
Owner No     文件所屬用戶
Path Yes     要控制文件的路徑
Recurse No No Yes/no 當文件爲目錄時,是否進行遞歸設置權限
Src No     文件連接路徑,只有狀態爲link的時候,纔會設置,能夠是絕對相對不存在的路徑
State No File File/link
Directory
Hard/touch
Absent
若是是目錄不存在,那麼會建立目錄;若是是文件不存在,那麼不會建立文件;若是是link,那麼軟連接會被建立或者修改;若是是absent,那麼目錄下的全部文件都會被刪除,若是是touch,會建立不存在的目錄和文件
示例1:
設置文件屬性。文件路徑爲path,表示文件路徑,設定所屬用戶和所屬用戶組,權限爲0644。文件路徑爲path,使用文件夾進行遞歸修改權限,使用的參數爲recurse表示爲遞歸。
[root@ansibleserver ~]# ansible pythonserver -m file -a "path=/root/123 owner=kel group=kel mode=0644"
SSH password:
192.168.1.60 | success >> {
    "changed": true,
    "gid": 500,
    "group": "kel",
    "mode": "0644",
    "owner": "kel",
    "path": "/root/123",
    "size": 294,
    "state": "file",
    "uid": 500
}
[root@ansibleserver ~]# ansible pythonserver -m file -a "path=/tmp/kel/ owner=kel group=kel mode=0644 recurse=yes"
SSH password:
192.168.1.60 | success >> {
    "changed": true,
    "gid": 500,
    "group": "kel",
    "mode": "0644",
    "owner": "kel",
    "path": "/tmp/kel/",
    "size": 4096,
    "state": "directory",
    "uid": 500
}
示例2:
建立目錄。建立目錄,使用的參數主要是state爲directory。
[root@ansibleserver ~]# ansible pythonserver -m file -a "path=/tmp/kel state=directory mode=0755"
SSH password:
192.168.1.60 | success >> {
    "changed": true,
    "gid": 0,
    "group": "root",
    "mode": "0755",
    "owner": "root",
    "path": "/tmp/kel",
    "size": 4096,
    "state": "directory",
    "uid": 0
}
示例3:
修改權限。直接使用mode來進行修改權限。
[root@ansibleserver ~]# ansible pythonserver -m file -a "path=/tmp/kel mode=0444"
SSH password:
192.168.1.60 | success >> {
    "changed": true,
    "gid": 0,
    "group": "root",
    "mode": "0444",
    "owner": "root",
    "path": "/tmp/kel",
    "size": 4096,
    "state": "directory",
    "uid": 0
}
示例4:
建立軟鏈接。 src表示已經存在的文件,dest表示建立的軟鏈接的文件名,最後的state狀態爲link。
root@ansibleserver tmp]# ansible pythonserver -m file -a "src=/tmp/1 dest=/tmp/2 owner=kel state=link"
SSH password:
192.168.1.60 | success >> {
    "changed": true,
    "dest": "/tmp/2",
    "gid": 0,
    "group": "root",
    "mode": "0777",
    "owner": "kel",
    "size": 6,
    "src": "/tmp/1",
    "state": "link",
    "uid": 500
}
 
⑧ yum模塊
Yum(全稱爲 Yellow dog Updater, Modified)是一個在Fedora和RedHat以及CentOS中的Shell前端軟件包管理器。即安裝包管理模塊。
經常使用參數
參數名 是否必須 默認值 選項值 參數說明
conf_file no     設定遠程yum執行時所依賴的yum配置文件
disable_gpg_check no No Yes/No 在安裝包前檢查包,只會影響state參數爲present或者latest的時候
list No     只能由ansible調用,不支持playbook,這個幹啥的你們都懂
name Yes     你須要安裝的包的名字,也能如此使用name=python=2.7安裝python2.7
state no present present/latest/absent 用於描述安裝包最終狀態,present/latest用於安裝包,absent用於remove安裝包
update_cache no no yes/no 用於安裝包前執行更新list,只會影響state參數爲present/latest的時候
示例1:
安裝httpd包
ansible host31 -m yum -a 「name=httpd」 
host31 | SUCCESS => { 
「changed」: true, 
「msg」: 「」, 
「rc」: 0, 
「results」: [ xxxxx ]
示例2:
刪除httpd包
ansible host31 -m yum -a "name=httpd state=absent" host31 | SUCCESS => { "changed": true, "msg": "", "rc": 0, "results": [ xxxx ]
 
⑨ service模塊
service模塊其實就是linux下的service命令。用於service服務管理。
經常使用參數
參數名 是否必須 默認值 選項 說明
enabled no   yes/no 啓動os後啓動對應service的選項。使用service模塊的時候,enabled和state至少要有一個被定義
name yes     須要進行操做的service名字
state no   stared/stoped/restarted/reloaded service最終操做後的狀態。
示例1:
啓動服務。
ansible host31 -m service -a "name=httpd state=started" host31 | SUCCESS => { "changed": true, "name": "httpd", "state": "started" }
示例2:
中止服務。
ansible host31 -m service -a "name=httpd state=stopped" host31 | SUCCESS => { "changed": true, "name": "httpd", "state": "stopped" }
示例3:
設置服務開機自啓動。
[root@host31 ~]# ansible host31 -m service -a "name=httpd enabled=yes state=restarted" host31 | SUCCESS => { "changed": true, "enabled": true, "name": "httpd", "state": "started" }
 
⑩ cron模塊
cron模塊用於管理計劃任務。
參數名 是否必須 默認值 選項 說明
backup       對遠程主機上的原任務計劃內容修改以前作備份
cron_file       若是指定該選項,則用該文件替換遠程主機上的cron.d目錄下的用戶的任務計劃
day       日(1-31,*,*/2,……)
hour       小時(0-23,*,*/2,……)
minute       分鐘(0-59,*,*/2,……)
month       月(1-12,*,*/2,……)
weekday       周(0-7,*,……)
job       要執行的任務,依賴於state=present
name       該任務的描述
special_time       指定何時執行,參數:reboot,yearly,annually,monthly,weekly,daily,hourly
state       確認該任務計劃是建立仍是刪除
user       以哪一個用戶的身份執行
示例:
ansible test -m cron -a 'name="a job for reboot" special_time=reboot job="/some/job.sh"'
ansible test -m cron -a 'name="yum autoupdate" weekday="2" minute=0 hour=12 user="root
ansible test -m cron  -a 'backup="True" name="test" minute="0" hour="5,2" job="ls -alh > /dev/null"'
ansilbe test -m cron -a 'cron_file=ansible_yum-autoupdate state=absent'
 
①① user模塊
user模塊是請求的是useradd, userdel, usermod三個指令。
經常使用參數
參數名 是否必須 默認值 選項 說明
home       指定用戶的家目錄,須要與createhome配合使
groups       指定用戶的屬組
uid       指定用的uid
password       指定用戶的密碼
name       指定用戶名
createhome       是否建立家目錄 yes|no
system       是否爲系統用戶
remove       當state=absent時,remove=yes則表示連同家目錄一塊兒刪除,等價於userdel -r
state       是建立仍是刪除
shell       指定用戶的shell環境
指定password參數時,不能使用明文密碼,由於後面這一串密碼會被直接傳送到被管理主機的/etc/shadow文件中,因此須要先將密碼字符串進行加密處理。而後將獲得的字符串放到password中便可。不一樣的發行版默認使用的加密方式可能會有區別,具體能夠查看/etc/login.defs文件確認,centos 6.5版本使用的是SHA512加密算法。
示例1:
目的:在指定節點上建立一個用戶名爲nolinux,組爲nolinux的用戶
命令:ansible 10.1.1.113 -m user -a 'name=nolinux groups=nolinux state=present'
執行命令:
 
示例2:
刪除用戶
命令:ansible 10.1.1.113 -m user -a 'name=nolinux groups=nolinux state=absent remove=yes'
 
①②group模塊
goup模塊請求的是groupadd, groupdel, groupmod 三個指令。參數參考ansible-hoc group
示例:
目的:在全部節點上建立一個組名爲nolinux,gid爲2014的組
命令:ansible all -m group -a 'gid=2014 name=nolinux'
 
①③script模塊
script模塊將控制節點的腳本執行在被控節點上。
示例:
[root@host31 ~]# ansible host32 -m script -a /tmp/hello.sh host32 | SUCCESS => { "changed": true, "rc": 0, "stderr": "", "stdout": "this is test from host32\r\n", "stdout_lines": [ "this is test from host32" ->執行結果 ] }
 
①④get_url模塊
該模塊主要用於從http、ftp、https服務器上下載文件(相似於wget)
經常使用參數
參數名 是否必須 默認值 選項 說明
sha256sum       下載完成後進行sha256 check;
timeout       下載超時時間,默認10s
url       下載的URL
url_password、url_username       主要用於須要用戶名密碼進行驗證的狀況
use_proxy       是事使用代理,代理需事先在環境變動中定義
示例:
目的:將 http://10.1.1.116/favicon.ico文件下載到指定節點的/tmp目錄下
命令:ansible 10.1.1.113 -m get_url -a 'url= http://10.1.1.116/favicon.ico dest=/tmp'
 
①⑤synchronize模塊
使用rsync同步文件。
參數名 是否必須 默認值 選項 說明
archive       歸檔,至關於同時開啓recursive(遞歸)、links、perms、times、owner、group、-D選項都爲yes ,默認該項爲開啓
checksum       跳過檢測sum值,默認關閉
compress       是否開啓壓縮
copy_links       複製連接文件,默認爲no ,注意後面還有一個links參數
delete       刪除不存在的文件,默認no
dest       目錄路徑
dest_port       dest_port:默認目錄主機上的端口 ,默認是22,走的ssh協議
dirs       傳速目錄不進行遞歸,默認爲no,即進行目錄遞歸
rsync_opts       rsync參數部分
set_remote_user       主要用於/etc/ansible/hosts中定義或默認使用的用戶與rsync使用的用戶不一樣的狀況
mode       push或pull 模塊,push模的話,通常用於從本機向遠程主機上傳文件,pull 模式用於從遠程主機上取文件
示例1:
目的:將主控方/root/a目錄推送到指定節點的/tmp目錄下
命令:ansible 10.1.1.113 -m synchronize -a 'src=/root/a dest=/tmp/ compress=yes'
 
delete=yes   使兩邊的內容同樣(即以推送方爲主)
compress=yes  開啓壓縮,默認爲開啓
--exclude=. Git  忽略同步. git結尾的文件
因爲模塊,默認都是推送push。所以,若是你在使用拉取pull功能的時候,能夠參考以下來實現
mode=pull   更改推送模式爲拉取模式
示例2:
目的:將10.1.1.113節點的/tmp/a目錄拉取到主控節點的/root目錄下
命令:ansible 10.1.1.113 -m synchronize -a 'mode=pull src=/tmp/a dest=/root/'
 
示例3:
因爲模塊默認啓用了archive參數,該參數默認開啓了recursive, links, perms, times, owner,group和-D參數。若是你將該參數設置爲no,那麼你將中止不少參數,好比會致使以下目的遞歸失敗,致使沒法拉取
 
①⑥ 其餘模塊:
mount模塊:配置掛載點
unarchive模塊:解壓文件模塊
 
本文的模塊簡介僅供參考,要想更好更簡便的使用,請多參考官網的幫助文檔 http://docs.ansible.com/ansible/latest/intro_adhoc.html 或者使用ansible-hoc 模塊名查看。網絡上的中文文檔更新不是很頻繁,不建議閱讀,建議閱讀官方英文文檔。

3、核心模塊playbook介紹

ansible的playbook的文件格式爲YAML格式,因此但願你們在學習playbook以前先對YAML語法有必定的瞭解,不然在運行playbook的過程當中會常常碰到莫名其妙的語法錯誤。
 
這邊以一個例子簡單介紹一下playbook。
示例目的:指定一個主機名,對這個主機進行配置操做。
先展現目錄結構
config-ansible
    |___config_hosts.yml
    |___roles
             |___config_hosts
                        |___tasks
                                |___main.yml
                                |___config.yml
總共3個YAML文件,其中config_hosts.yml爲總入口,在這個文件裏調用roles/config_hosts/tasks目錄下的腳本。執行命令ansible-playbook config_hosts.yml 運行劇本。
config_hosts.yml內容爲
1. ---
2. - hosts: node1
3. roles:
4. - config_hosts
 
第1行表示該文件是YAML文件,非必須。
第2行定義該playbook針對的目標主機。
第三、4行指定角色目錄,具體操做在角色中定義。
main.yml的內容爲
1. ---
2. - include: config.yml
第2行指定此roles要導入的task文件。
config.yml的內容爲
1. ---
2. - name: copy test.file
3. copy:
4. src: /home/test.file
5. dest: /home/test.file
6. owner: root
7. group: root
8. mode: 0777
9. force: yes
10.
11. - name: exec hello world script
12. script: /home/helloworld.sh
13.
14.- name: rm test.file
15. file: path=/home/test.file state=absent
config.yml文件內的代碼纔是真正執行的任務代碼。總共有3個任務,第一個把/home目錄的test.file文件拷貝到目標主機的相同路徑下,第二個在目標主機執行/home目錄下的helloworld.sh,helloworld.sh的內容就是打印一條helloworld信息,第三個任務是使用file模塊把目標主機的/home/test.file文件刪除。
 
其實playbook就是各個模塊的組裝,此處只是拋磚引玉,其餘模塊在playbook中的使用可自行學習,就再也不介紹循環、條件判斷等功能的實現了。關於ansible playbook的目錄結構能夠參考 http://docs.ansible.com/ansible/latest/playbooks_roles.html#dynamic-versus-static-includes 或者 https://github.com/ceph/ceph-ansible
相關文章
相關標籤/搜索