ansible及其常見模塊

什麼是Ansible

ansible是新出現的運維工具是基於Python研發的糅合了衆多老牌運維工具的優勢實現了批量操做系統配置、批量程序的部署、批量運行命令等功能。node

Ansible特性

基於Python語言實現,由Paramiko, PyYAML和Jinjia2三個關鍵模塊;python

ansible是工做在agentless模式下具備冪等性。ansible在控制端只須要告訴監控端的指望狀態就能夠實現批量部署。mysql

默認使用SSH協議;linux

    (1) 基於密鑰認證;ios

    (2) 在inventory文件中指定帳號和密碼;web

基於「模塊」完成各類「任務」sql

支持自定義模塊:支持各類編程語言shell

可使用YAML語言定製playbook編程

Ansible架構圖

clip_p_w_picpath001

Ansible核心組件說明:vim

Ansible:Ansible的核心程序

Host Lnventory:記錄了每個由Ansible管理的主機信息,信息包括ssh端口,root賬號密碼,ip地址等等。

Playbooks:YAML格式文件,多個任務定義在一個文件中,使用時能夠統一調用

Core Modules:Ansible執行任何管理任務都不是由Ansible本身完成,而是由核心模塊完成;Ansible管理主機以前,先調用core Modules中的模塊,而後指明管理Host Lnventory中的主機,就能夠完成管理主機。

Custom Modules:自定義模塊,完成Ansible核心模塊沒法完成的功能

Connection Plugins:鏈接插件,Ansible和Host通訊使用

環境拓撲圖

clip_p_w_picpath002

安裝Ansible

Ansible在epel的yum中有提供,因此配置好epel源,直接使用yum命令安裝便可

[root@node1 ~]# yum -y install ansible

查看生成的主要文件

[root@node1 ~]# rpm -ql ansible
/etc/ansible/ansible.cfg   #主配置文件
/etc/ansible/hosts           #invertory文件

說明:Ansible不是服務,因此不須要服務腳本

配置和被管理的主機直接創建基於ssh的密鑰認證

ssh-keygen -t rsa -f ~/.ssh/id_rsa -P ''
ssh-copy-id -i .ssh/id_rsa.pub 172.16.4.101
ssh-copy-id -i .ssh/id_rsa.pub 172.16.4.102
ssh-copy-id -i .ssh/id_rsa.pub 172.16.4.103

定義主機,將全部被管理的主機加入到/etc/ansible/hosts中,不然沒法管理

[root@node1 ~]# vim /etc/ansible/hosts
[webserver]       #定義一個組
172.16.4.101
172.16.4.102
[dbserver]
172.16.4.103

補充:若是沒有設置基於ssh的密鑰認證,能夠在hosts文件中直接指定賬號和密碼,方法以下所示:

[webserver]
172.16.4.101 ansible_ssh_user=root ansible_ssh_pass=password
172.16.4.102 ansible_ssh_user=root ansible_ssh_pass=password
[dbserver]
172.16.4.103 ansible_ssh_user=root ansible_ssh_pass=password

模塊使用:

如何查看模塊幫助:

   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

功能:命令模塊,默認模塊,用於在遠程主機執行命令,缺點:運行的命令中沒法使用變量,管道。

[root@node1 ~]# ansible-doc -s command
- name: 在遠程節點執行命令
action: command
chdir           # 在執行命令以前,先切換到該目錄
creates         # 一個文件名,當這個文件存在,則該命令不執行
executable      # 切換shell來執行命令,須要使用命令的絕對路徑
free_form=      #要執行的Linux指令,通常使用Ansible的-a參數代替。
removes         #一個文件名,這個文件不存在,則該命令不執行

示例:查看被管理節點的時間,使用-m使用command模塊,-a使用date命令便可

clip_p_w_picpath003

Cron

[root@node1 ~]# 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

clip_p_w_picpath004

刪除定時任務的方法以下所示:只須要設置state爲absent便可

clip_p_w_picpath005

User

[root@node1 ~]# 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  # 更新用戶密碼

示例:建立一個用戶

clip_p_w_picpath006

刪除用戶

clip_p_w_picpath007

Group

[root@node1 ~]# ansible-doc -s group
- name: 添加或刪除組
action: group
gid       # 設置組的GID號
name=     # 管理組的名稱
state     # 指定組狀態,默認爲建立,設置值爲absent爲刪除
system    # 設置值爲yes,表示爲建立系統組

示例:建立一個mysql組,並添加mysql用戶加入到組中

clip_p_w_picpath008

Copy

[root@node1 ~]# 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

clip_p_w_picpath009

驗證:webserver組中的主機/tmp/目錄下已經出現fstab.ansbile文件,屬主和權限都正確

[root@node2 ~]# ll /tmp/fstab.ansbile
-rw-r----- 1 root root 921 Jun 28 14:16 /tmp/fstab.ansbile

示例:在webserver組主機建立文件,本身手動指定文件內容。

clip_p_w_picpath010

驗證:查看文件內容

[root@node2 ~]# cat /tmp/test.ansible
Hello Ansible
Hello world[root@node2 ~]#

File

[root@node1 ~]# 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

clip_p_w_picpath011

示例:在webserver組建立/test/fstab.ansible的鏈接文件

clip_p_w_picpath012

Ping

功能:測試指定主機是否能鏈接,若是成功返回pong。

clip_p_w_picpath013

Service

[root@node1 ~]# 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服務器信息:開機爲不啓動,當前狀態爲關閉

clip_p_w_picpath014

示例:啓動httpd服務,並設置開機自動啓動

clip_p_w_picpath015

Shell

功能:執行的命令中有管道或者變量,就須要使用shell

[root@node1 ~]# ansible-doc -s shell
- name: Execute commands in nodes.
action: shell
chdir       # 執行以前,先cd到指定目錄在執行命令
creates     # 一個文件名,當這個文件存在,則該命令不執行
executable  # 切換shell來執行命令,須要使用命令的絕對路徑
free_form=  # 執行的命令
removes     # 一個文件名,這個文件不存在,則該命令不執行

示例:爲user1用戶設置密碼

clip_p_w_picpath016

Script

[root@node1 ~]# ansible-doc -s script
- name: 將本地腳本複製到遠程主機並運行之
action: script
creates      # 一個文件名,當這個文件存在,則該命令不執行
free_form=   # 本地腳本路徑
removes      # 一個文件名,這個文件不存在,則該命令不執行

示例:將本機的test.sh腳本在被管理主機運行

clip_p_w_picpath017

驗證:

[root@node2 ~]# ll /tmp/script.ansible
-rw-r--r-- 1 root root 26 Jun 28 15:21 /tmp/script.ansible
[root@node2 ~]# cat /tmp/script.ansible
hello ansible from script

yum

[root@node1 ~]# 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程序包

clip_p_w_picpath018

setup:

收集遠程主機的facts

每一個被管理節點在接收並運行管理命令以前,會將本身主機相關信息,如操做系統版本、IP地址等報告給遠程的ansbile主機;

示例:查看172.16.4.101主機狀態信息,輸出內容不少,可是通俗易懂,這裏不作過多說明

[root@node1 ~]# 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
}

補充:

Ansible的跟多功能,如playbook,roles詳見下文:

http://ximenfeibing.blog.51cto.com/8809812/1669188

相關文章
相關標籤/搜索