ansible基本使用教程


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

一、 介紹

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
命令行執行 不支持,但可以通過配置模塊實現 支持 支持

二、ansible組件介紹

 
1. ansible inventory
    在大規模的配置管理工作中我們需要管理不同業務的機器,這些機器的信息都存放在ansible的inventory組件里。在我們工作中配置部署針對的主機必須先存放在inventory里,這樣才能使用ansible對它進行操作。默認ansible的inventory是一個靜態的ini文件/etc/ansible/hosts。亦可通過ANSIBLE_HOSTS環境變量指定或者命令運行時用-i參數臨時設置。
參考示例:
定義主機和主機組
1、100.0.0.1 ansible_ssh_pass='123456'
2、100.0.0.2 ansible_ssh_pass='123456'
3、[docker]
4、100.0.0.1[1:3]
5、[docker:vars]
6、ansible_ssh_pass='123456'
7、[ansible:children]
8、docker
第一、二行定義一個主機,指定ssh登錄密碼
第三行定義了一個叫docker的組
第四行定義了docker組下面四個主機從100.0.0.11-100.0.0.13
第五、六行定義了docker組的ssh登錄密碼
第七、八行定義了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 模塊名查看。網絡上的中文文檔更新不是很頻繁,不建議閱讀,建議閱讀官方英文文檔。

三、核心模塊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針對的目標主機。
第3、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
 
 


免責聲明!

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



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