自動化運維工具ansible 常見模組使用
ansible: ansible是新出現的運維工具是基於Python研發的糅合了眾多老牌運維工具的優點實現了批量作業系統配置、批量程式的部署、批量執行命令等功能。
ansible特性:
基於Python語言實現,由Paramiko, PyYAML和Jinjia2三個關鍵模組;
ansible是工作在agentless模式下具有冪等性。ansible在控制端只需要告訴監控端的期望狀態就可以實現批量部署;
預設使用SSH協議;
(1) 基於金鑰認證;
(2) 在inventory檔案中指定賬號和密碼;
基於“模組”完成各種“任務”
支援自定義模組:支援各種程式語言
可以使用YAML語言定製playbook
Ansible核心元件說明:
Ansible:Ansible的核心程式
Host Lnventory:記錄了每一個由Ansible管理的主機資訊,資訊包括ssh埠,root帳號密碼,ip地址等等。
Playbooks:YAML格式檔案,多個任務定義在一個檔案中,使用時可以統一呼叫
Core Modules:
Custom Modules:自定義模組,完成Ansible核心模組無法完成的功能
Connection Plugins:連線外掛,Ansible和Host通訊使用
模組使用:
如何檢視模組幫助:
ansible-doc -l #檢視所有模組
ansible-doc -s MODULE_NAME #檢視指定模組的詳細幫助
ansible命令應用基礎:
語法: ansible <host-pattern> [-f forks] [-m module_name] [-a args]
-f forks:啟動的併發執行緒數;
-m module_name: 要使用的模組;
-a args: 模組特有的引數;
Command
功能:命令模組,預設模組,用於在遠端主機執行命令,缺點:執行的命令中無法使用變數,管道。
[[email protected] ~]# ansible-doc -s command
- name: 在遠端節點執行命令
action: command
chdir # 在執行命令之前,先切換到該目錄
creates # 一個檔名,當這個檔案存在,則該命令不執行
executable # 切換shell來執行命令,需要使用命令的絕對路徑
free_form= #要執行的Linux指令,一般使用Ansible的-a引數代替。
removes #一個檔名,這個檔案不存在,則該命令不執行
示例:檢視被管理節點的時間,使用-m使用command模組,-a使用date命令即可
Cron
[[email protected] ~]# ansible-doc -s cron
- name: 設定管理節點生成定時任務
action: cron
backup # 如果設定,建立一個crontab備份
cron_file #如果指定, 使用這個檔案cron.d,而不是單個使用者crontab
day # 日應該執行的工作( 1-31, *, */2, etc )
hour # 小時 ( 0-23, *, */2, etc )
job #指明執行的命令是什麼
minute #分鐘( 0-59, *, */2, etc )
month # 月( 1-12, *, */2, etc )
name #定時任務描述
reboot # 任務在重啟時執行,不建議使用,建議使用special_time
special_time # 特殊的時間範圍,引數:reboot(重啟時),annually(每年),monthly(每月),weekly(每週),daily(每天),hourly(每小時)
state #指定狀態,prsent表示新增定時任務,也是預設設定,absent表示刪除定時任務
user # 以哪個使用者的身份執行
weekday # 周 ( 0-6 for Sunday-Saturday, *, etc )
示例:設定webServer組的主機沒10分鐘執行一次hello world
刪除定時任務的方法如下所示:只需要設定state為absent即可
User
[[email protected] ~]# ansible-doc -s user
- name: 管理使用者帳號
action: user
comment # 使用者的描述資訊
createhome # 是否建立家目錄
force # 在使用`state=absent'是, 行為與`userdel --force'一致.
group # 指定基本組
groups # 指定附加組,如果指定為('groups=')表示刪除所有組
home # 指定使用者家目錄
login_class #可以設定使用者的登入類 FreeBSD, OpenBSD and NetBSD系統.
move_home # 如果設定為`home='時, 試圖將使用者主目錄移動到指定的目錄
name= # 指定使用者名稱
non_unique # 該選項允許改變非唯一的使用者ID值
password # 指定使用者密碼
remove # 在使用 `state=absent'時, 行為是與 `userdel --remove'一致.
shell # 指定預設shell
state #設定帳號狀態,不指定為建立,指定值為absent表示刪除
system # 當建立一個使用者,設定這個使用者是系統使用者。這個設定不能更改現有使用者。
uid #指定使用者的uid
update_password # 更新使用者密碼
示例:建立一個使用者
刪除使用者
Group
[[email protected] ~]# ansible-doc -s group
- name: 新增或刪除組
action: group
gid # 設定組的GID號
name= # 管理組的名稱
state # 指定組狀態,預設為建立,設定值為absent為刪除
system # 設定值為yes,表示為建立系統組
示例:建立一個mysql組,並新增mysql使用者加入到組中
Copy
[[email protected] ~]# ansible-doc -s copy
- name: 將檔案複製到被管理主機
action: copy
backup # 建立一個備份檔案包括時間戳資訊,如果以某種方式重創錯了,還可以拿回原始檔案
content # 取代src=,表示直接用此處指定的資訊生成為目標檔案內容;
dest= # 遠端節點存放檔案的路徑,必須是絕對路徑
directory_mode # 遞迴複製設定目錄許可權,預設為系統預設許可權
force # 如果目標主機包含該檔案,但內容不同,如果設定為yes,則強制覆蓋,如果設定為no,則只有當目標主機的目標位置不存在該檔案時,才複製。預設為yes
group # 複製到遠端主機後,指定檔案或目錄的屬
mode # 複製到遠端主機後,指定檔案或目錄許可權,類似與 `chmod'指明如 0644
owner # 複製到遠端主機後,指定檔案或目錄屬主
src # 指定複製的原始檔,可以是相對路徑或者絕對路徑,如果給出的源是目錄,那麼會把目錄下的所有檔案都複製過去
示例:將本地的/etc/fatab檔案複製到目標主機的/tmp/fatab.ansbile,屬主為root許可權為640
驗證:webserver組中的主機/tmp/目錄下已經出現fstab.ansbile檔案,屬主和許可權都正確
[[email protected] ~]# ll /tmp/fstab.ansbile
-rw-r----- 1 root root 921 Jun 28 14:16 /tmp/fstab.ansbile
示例:在webserver組主機建立檔案,自己手動指定檔案內容。
驗證:檢視檔案內容
[[email protected] ~]# cat /tmp/test.ansible
Hello Ansible
Hello world[[email protected] ~]#
File
[[email protected] ~]# ansible-doc -s file
- name: 設定檔案屬性
action: file
force # 需要在兩種情況下強制建立軟連線,一種是原始檔不存在但之後會建立的情況下;另一種是目標連線已存在,需要先取消之前的軟連線,有兩個選項:yes|no
group # 設定檔案或目錄的屬組
mode # 設定檔案或目錄的許可權
owner # 設定檔案或目錄的屬主
path= # 必選項,定義檔案或目錄的路徑
recurse # 遞迴設定檔案的屬性,只對目錄有效
src # 要被連結到的路徑,只應用與state=link的情況
state # directory:如果目錄不存在,建立目錄;file:即使檔案不存在,也不會被建立;link:建立軟連線;hard:建立硬連線;touch:如果檔案不存在,則會建立一個新的檔案,如果檔案或目錄已存在,則更新其最後修改時間;absent:刪除目錄、檔案或者取消連結檔案
示例:設定/tmp/fstab.ansbile屬主和屬組都為mysql,許可權為644
示例:在webserver組建立/test/fstab.ansible的連線檔案
Ping
功能:測試指定主機是否能連線,如果成功返回pong。
Service
[[email protected] ~]# ansible-doc -s service
- name: 管理服務
action: service
arguments # 向服務傳遞的命令列引數
enabled # 設定服務開機自動啟動,引數為yes|no
name= # 控制服務的名稱
pattern # 定義一個模式,如果通過status指令來檢視服務的狀態時,沒有響應,就會通過ps指令在程序中根據該模式進行查詢,如果匹配到,則認為該服務依然在執行
runlevel # 設定服務自啟動級別
sleep # 如果執行了restarted,則在stop和start之間沉睡幾秒鐘
state # 啟動`started' 關閉`stopped' 重新啟動 `restarted' 過載 `reloaded'
檢視httpd伺服器資訊:開機為不啟動,當前狀態為關閉
示例:啟動httpd服務,並設定開機自動啟動
Shell
功能:執行的命令中有管道或者變數,就需要使用shell
[[email protected] ~]# ansible-doc -s shell
- name: Execute commands in nodes.
action: shell
chdir # 執行之前,先cd到指定目錄在執行命令
creates # 一個檔名,當這個檔案存在,則該命令不執行
executable # 切換shell來執行命令,需要使用命令的絕對路徑
free_form= # 執行的命令
removes # 一個檔名,這個檔案不存在,則該命令不執行
示例:為user1使用者設定密碼
Script
[[email protected] ~]# ansible-doc -s script
- name: 將本地指令碼複製到遠端主機並執行之
action: script
creates # 一個檔名,當這個檔案存在,則該命令不執行
free_form= # 本地指令碼路徑
removes # 一個檔名,這個檔案不存在,則該命令不執行
示例:將本機的test.sh指令碼在被管理主機執行
驗證:
[[email protected] ~]# ll /tmp/script.ansible
-rw-r--r-- 1 root root 26 Jun 28 15:21 /tmp/script.ansible
[[email protected] ~]# cat /tmp/script.ansible
hello ansible from script
yum
[[email protected] ~]# ansible-doc -s yum
- name: Manages packages with the `yum' package manager
action: yum
conf_file # yum的配置檔案
disable_gpg_check # 關閉gpg_check
disablerepo # 不啟用某個源
enablerepo # 啟用某個源
name= # 指定要安裝的包,如果有多個版本需要指定版本,否則安裝最新的包
state # 安裝(`present'),安裝最新版(`latest'),解除安裝程式包(`absent')
示例:安裝zsh程式包
setup:
收集遠端主機的facts
每個被管理節點在接收並執行管理命令之前,會將自己主機相關資訊,如作業系統版本、IP地址等報告給遠端的ansbile主機;
示例:檢視172.16.4.101主機狀態資訊,輸出內容很多,但是通俗易懂,這裡不做過多說明
[[email protected] ~]# ansible 172.16.4.101 -m setup
172.16.4.101 | success >> {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"172.16.4.101"
],
"ansible_all_ipv6_addresses": [
"fe80::20c:29ff:fef1:ddb2"
],
"ansible_architecture": "x86_64",
"ansible_bios_date": "05/20/2014",
"ansible_bios_version": "6.00",
"ansible_cmdline": {
"KEYBOARDTYPE": "pc",
"KEYTABLE": "us",
"LANG": "en_US.UTF-8",
"SYSFONT": "latarcyrheb-sun16",
"crashkernel": "auto",
"quiet": true,
"rd_LVM_LV": "vg0/root",
"rd_NO_DM": true,
"rd_NO_LUKS": true,
"rd_NO_MD": true,
"rhgb": true,
"ro": true,
"root": "/dev/mapper/vg0-root"
},
"ansible_date_time": {
"date": "2015-06-28",
"day": "28",
"epoch": "1435476945",
"hour": "15",
"iso8601": "2015-06-28T07:35:45Z",
"iso8601_micro": "2015-06-28T07:35:45.390263Z",
"minute": "35",
"month": "06",
"second": "45",
"time": "15:35:45",
"tz": "CST",
"tz_offset": "+0800",
"weekday": "Sunday",
"year": "2015"
},
"ansible_default_ipv4": {
"address": "172.16.4.101",
"alias": "eth0",
"gateway": "172.16.0.1",
"interface": "eth0",
"macaddress": "00:0c:29:f1:dd:b2",
"mtu": 1500,
"netmask": "255.255.0.0",
"network": "172.16.0.0",
"type": "ether"
},
"ansible_default_ipv6": {},
"ansible_devices": {
"sda": {
"holders": [],
"host": "SCSI storage controller: LSI Logic / Symbios Logic 53c1030 PCI-X Fusion-MPT Dual Ultra320 SCSI (rev 01)",
"model": "VMware Virtual S",
"partitions": {
"sda1": {
"sectors": "409600",
"sectorsize": 512,
"size": "200.00 MB",
"start": "2048"
},
"sda2": {
"sectors": "125829120",
"sectorsize": 512,
"size": "60.00 GB",
"start": "411648"
}
},
"removable": "0",
"rotational": "1",
"scheduler_mode": "cfq",
"sectors": "377487360",
"sectorsize": "512",
"size": "180.00 GB",
"support_discard": "0",
"vendor": "VMware,"
},
"sr0": {
"holders": [],
"host": "IDE interface: Intel Corporation 82371AB/EB/MB PIIX4 IDE (rev 01)",
"model": "VMware IDE CDR10",
"partitions": {},
"removable": "1",
"rotational": "1",
"scheduler_mode": "cfq",
"sectors": "2097151",
"sectorsize": "512",
"size": "1024.00 MB",
"support_discard": "0",
"vendor": "NECVMWar"
}
},
"ansible_distribution": "CentOS",
"ansible_distribution_major_version": "6",
"ansible_distribution_release": "Final",
"ansible_distribution_version": "6.6",
"ansible_domain": "",
"ansible_env": {
"CVS_RSH": "ssh",
"G_BROKEN_FILENAMES": "1",
"HOME": "/root",
"LANG": "C",
"LC_CTYPE": "C",
"LESSOPEN": "||/usr/bin/lesspipe.sh %s",
"LOGNAME": "root",
"MAIL": "/var/mail/root",
"PATH": "/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin",
"PWD": "/root",
"QTDIR": "/usr/lib64/qt-3.3",
"QTINC": "/usr/lib64/qt-3.3/include",
"QTLIB": "/usr/lib64/qt-3.3/lib",
"SHELL": "/bin/bash",
"SHLVL": "2",
"SSH_ASKPASS": "/usr/libexec/openssh/gnome-ssh-askpass",
"SSH_CLIENT": "172.16.4.100 60862 22",
"SSH_CONNECTION": "172.16.4.100 60862 172.16.4.101 22",
"SSH_TTY": "/dev/pts/0",
"TERM": "linux",
"USER": "root",
"_": "/usr/bin/python"
},
"ansible_eth0": {
"active": true,
"device": "eth0",
"ipv4": {
"address": "172.16.4.101",
"netmask": "255.255.0.0",
"network": "172.16.0.0"
},
"ipv6": [
{
"address": "fe80::20c:29ff:fef1:ddb2",
"prefix": "64",
"scope": "link"
}
],
"macaddress": "00:0c:29:f1:dd:b2",
"module": "e1000",
"mtu": 1500,
"promisc": false,
"type": "ether"
},
"ansible_form_factor": "Other",
"ansible_fqdn": "node2",
"ansible_hostname": "node2",
"ansible_interfaces": [
"lo",
"eth0"
],
"ansible_kernel": "2.6.32-504.el6.x86_64",
"ansible_lo": {
"active": true,
"device": "lo",
"ipv4": {
"address": "127.0.0.1",
"netmask": "255.0.0.0",
"network": "127.0.0.0"
},
"ipv6": [
{
"address": "::1",
"prefix": "128",
"scope": "host"
}
],
"mtu": 65536,
"promisc": false,
"type": "loopback"
},
"ansible_lsb": {
"codename": "Final",
"description": "CentOS release 6.6 (Final)",
"id": "CentOS",
"major_release": "6",
"release": "6.6"
},
"ansible_machine": "x86_64",
"ansible_memfree_mb": 68,
"ansible_memtotal_mb": 474,
"ansible_mounts": [
{
"device": "/dev/mapper/vg0-root",
"fstype": "ext4",
"mount": "/",
"options": "rw",
"size_available": 19614814208,
"size_total": 21003628544
},
{
"device": "/dev/sda1",
"fstype": "ext4",
"mount": "/boot",
"options": "rw",
"size_available": 159812608,
"size_total": 198902784
},
{
"device": "/dev/mapper/vg0-usr",
"fstype": "ext4",
"mount": "/usr",
"options": "rw",
"size_available": 7437721600,
"size_total": 10434699264
},
{
"device": "/dev/mapper/vg0-var",
"fstype": "ext4",
"mount": "/var",
"options": "rw",
"size_available": 19657154560,
"size_total": 21003628544
}
],
"ansible_nodename": "node2",
"ansible_os_family": "RedHat",
"ansible_pkg_mgr": "yum",
"ansible_processor": [
"Intel(R) Core(TM) i5-4200M CPU @ 2.50GHz"
],
"ansible_processor_cores": 1,
"ansible_processor_count": 1,
"ansible_processor_threads_per_core": 1,
"ansible_processor_vcpus": 1,
"ansible_product_name": "VMware Virtual Platform",
"ansible_product_serial": "VMware-56 4d cf 50 b9 67 e1 67-fd ba 73 89 3c f1 dd b2",
"ansible_product_uuid": "564DCF50-B967-E167-FDBA-73893CF1DDB2",
"ansible_product_version": "None",
"ansible_python_version": "2.6.6",
"ansible_selinux": {
"status": "disabled"
},
"ansible_ssh_host_key_dsa_public": "AAAAB3NzaC1kc3MAAACBAJX6mCvtR/7SlWAQtqoJ7fGcOnCQUif9z8BNlTf8Zh0WadsNAOOm6bq48O8FKAuuUl+PDQdvfJteGSb0maqdzBL1A5BaOCIBFLAdcubrSPm9BjBu37M9Dd0/rGzeLmNRpKuEf0VpmJ0QJvp36iDnDsUCtekjrYlhhwcauJUSVqvxAAAAFQDVMMCA/SHSLd8bskYGRZztoVDHewAAAIB16IbxqPLWALteNs8HmFkk2+m43LQ8xJhzAoUB/rBYclWs0W8HHKF98p91rYfwVfitLIZ+S2gFEYxrMrMyRlJNpeChDDeEVZoMyhBeo8Y9PXd4eQCl+FJ2ZQJ31lC0EEB6T+zwdKuP5dQfCaJ7wVNr87UQuQf7t8My3GHkN7ErSAAAAIEAhPngSDosZGPofwHzNJG+dDITWQEJ7cI0tpYJUum0xREDnkYuWUhjI5soR4jotfToUeTwLRxRZMJXA7dCE6NtHJicEbhxiSXHYQUNhQvvrE0/MEvH/BChJK0Nqqt/RxpFNMF2yN5lJPYdufSKd92rgYEMIzELuh21GL6c4iGJWyM=",
"ansible_ssh_host_key_rsa_public": "AAAAB3NzaC1yc2EAAAABIwAAAQEA57ZIETHEsImga9O6N6pHClC6vXfhK01/odan1OdlZnCGTSx3J/fhvNxRidj6YwTb91lahWRRZHOx6EuQ35O4Ba/YVdOF/eF47i/tFNHuo5eEXj2n6fV1mHS97rBc2P+o+2TwL0Ezo9ifXjQPyUHRcCir0abh/if7m/DNfxofY0trW0MKKlA9Ig3CuKrg1k5DUD2HYTS2bbWXDppDG2hpXa6DgxiFO6iLWysR9rw6kY5Aj8WusUpLd2aDkolfIV4zHn2TF6tLP0c1pF2z3u7F5IjOg7aqbEfubmI7mU2d6VPVbxsAakvBNGXoClwt8Skxki1U4u4KXSZ8s/Vq75nRIQ==",
"ansible_swapfree_mb": 2047,
"ansible_swaptotal_mb": 2047,
"ansible_system": "Linux",
"ansible_system_vendor": "VMware, Inc.",
"ansible_user_id": "root",
"ansible_userspace_architecture": "x86_64",
"ansible_userspace_bits": "64",
"ansible_virtualization_role": "guest",
"ansible_virtualization_type": "VMware",
"module_setup": true
},
"changed": false
}