ansible是新出現的運維工具是基於Python研發的糅合了衆多老牌運維工具的優勢實現了批量操做系統配置、批量程序的部署、批量運行命令等功能。node
基於Python語言實現,由Paramiko, PyYAML和Jinjia2三個關鍵模塊;python
ansible是工做在agentless模式下具備冪等性。ansible在控制端只須要告訴監控端的指望狀態就能夠實現批量部署。mysql
默認使用SSH協議;linux
(1) 基於密鑰認證;ios
(2) 在inventory文件中指定帳號和密碼;web
基於「模塊」完成各類「任務」sql
支持自定義模塊:支持各類編程語言shell
可使用YAML語言定製playbook編程
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通訊使用
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: 模塊特有的參數;
功能:命令模塊,默認模塊,用於在遠程主機執行命令,缺點:運行的命令中沒法使用變量,管道。
[root@node1 ~]# ansible-doc -s command - name: 在遠程節點執行命令 action: command chdir # 在執行命令以前,先切換到該目錄 creates # 一個文件名,當這個文件存在,則該命令不執行 executable # 切換shell來執行命令,須要使用命令的絕對路徑 free_form= #要執行的Linux指令,通常使用Ansible的-a參數代替。 removes #一個文件名,這個文件不存在,則該命令不執行
示例:查看被管理節點的時間,使用-m使用command模塊,-a使用date命令便可
[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
刪除定時任務的方法以下所示:只須要設置state爲absent便可
[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 # 更新用戶密碼
示例:建立一個用戶
刪除用戶
[root@node1 ~]# ansible-doc -s group - name: 添加或刪除組 action: group gid # 設置組的GID號 name= # 管理組的名稱 state # 指定組狀態,默認爲建立,設置值爲absent爲刪除 system # 設置值爲yes,表示爲建立系統組
示例:建立一個mysql組,並添加mysql用戶加入到組中
[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
驗證:webserver組中的主機/tmp/目錄下已經出現fstab.ansbile文件,屬主和權限都正確
[root@node2 ~]# ll /tmp/fstab.ansbile -rw-r----- 1 root root 921 Jun 28 14:16 /tmp/fstab.ansbile
示例:在webserver組主機建立文件,本身手動指定文件內容。
驗證:查看文件內容
[root@node2 ~]# cat /tmp/test.ansible Hello Ansible Hello world[root@node2 ~]#
[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
示例:在webserver組建立/test/fstab.ansible的鏈接文件
功能:測試指定主機是否能鏈接,若是成功返回pong。
[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服務器信息:開機爲不啓動,當前狀態爲關閉
示例:啓動httpd服務,並設置開機自動啓動
功能:執行的命令中有管道或者變量,就須要使用shell
[root@node1 ~]# ansible-doc -s shell - name: Execute commands in nodes. action: shell chdir # 執行以前,先cd到指定目錄在執行命令 creates # 一個文件名,當這個文件存在,則該命令不執行 executable # 切換shell來執行命令,須要使用命令的絕對路徑 free_form= # 執行的命令 removes # 一個文件名,這個文件不存在,則該命令不執行
示例:爲user1用戶設置密碼
[root@node1 ~]# ansible-doc -s script - name: 將本地腳本複製到遠程主機並運行之 action: script creates # 一個文件名,當這個文件存在,則該命令不執行 free_form= # 本地腳本路徑 removes # 一個文件名,這個文件不存在,則該命令不執行
示例:將本機的test.sh腳本在被管理主機運行
驗證:
[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
[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程序包
收集遠程主機的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