Ansiblehtml
幫助獲取:node
ansible-doc -s 模塊名 ##查看指定模塊的幫助信息nginx
ansible-doc -l ##查看支持的全部模塊redis
經常使用模塊:shell
模塊名 | 用途 |
---|---|
file | 文件管理,建立文件、目錄或連接文件 |
copy / synchronize | 用於傳輸文件或目錄,對於copy傳輸慢建議採用synchronize(rsync封裝) |
cron | 計劃任務模塊 |
user | 用戶管理 |
fetch | 從客戶端文件系統拉取文件到ansible服務端 |
service | 服務狀態管理 |
yum | 包管理器,安裝卸載軟件 |
template | 模板模塊,該模塊只在playbook中可使用 |
setup | 用於獲取服務器的信息,能夠結合template作變量引用 |
shell / command | 命令代執行模塊,commnad只能執行裸命令(即系統環境中有支持的命令),至於管道之類的功能不支持, shell模塊能夠作到 |
基本使用:windows
查看模塊幫助 ansible-doc -l 查看全部模塊 ansible-doc -s MODULE_NAME 查看指定模塊的詳細幫助 ansible命令應用基礎 語法: ansible <host-pattern> -f forks [-a args] <host-pattern> 在/etc/ansible/hosts中定義的主機組 -f forks:啓動的併發線程數 -m module_name: 要使用的模塊 -a args: 模塊特有的參數 -u user: 指定用戶執行 -k passwd: 輸入指定用戶密碼 -C 假定playbook執行,並不是真正的操做文件,只檢測語法和流程 --list-host 查看主機組裏的主機 --syntax-check 檢測playbook語法 注:部分模塊參數 present 能夠理解爲True absent 能夠理解爲False
ansible屬於SSH進行指令下發,因此對一切主機發號施令前請先配置好各主機通信時的 [主機地址,SSH端口,用戶名,密碼/祕鑰文件],固然你也能夠在指令下發時在手動輸入地址和用戶認證信息安全
方案一:配置好免祕鑰通信bash
[root@node1 np]# ssh-keygen -t rsa ##回車生成證書信息 [root@node1 np]# ssh-copy-id root@192.168.2.128 ##將本身的公鑰發給別人 [root@node1 np]# ssh root@192.168.2.128 ##查看是否成功免祕鑰 注:當主機過多時能夠考慮使用expect腳原本完成,參考個人另外一篇內容製做自定交互分發腳本:https://blog.51cto.com/swiki/1978831
使用ansible的第一個模塊ping來檢測服務器狀態信息服務器
[root@node1 np]# ansible 192.168.2.128 -m ping 192.168.2.128 | SUCCESS => { "changed": false, "ping": "pong" } [root@node1 np]# ansible 192.168.2.129 -m ping 192.168.2.129 | SUCCESS => { "changed": false, "ping": "pong" } 注:ping模塊不須要參數因此不用-a,其餘須要參數則指定-a
這麼操做也太low了,我若是要獲取一個集羣的狀態豈不是要挨個去ping一次?併發
解決辦法:在hosts重定義主機組:
[root@node1 np]# cat /etc/ansible/hosts [lb] 192.168.2.128 192.168.2.130 #192.168.2.13[1:9] ##表示131-139的主機,還有不少表示方式不一一表述 [db] 192.168.2.130 注:hosts文件不光能夠定義組還能夠定義變量,自定義變量
通信方案二:hosts中設置inventory變量來定製每臺主機的帳號和密碼
[root@node1 np]# cat /etc/ansible/hosts [lb] 192.168.2.128 ansible_ssh_user=root ansible_ssh_pass=root ##默認是22端口 192.168.2.129 ansible_ssh_user=root ansible_ssh_pass=123 ##默認是22端口 注:若是128和129的帳號和密碼同樣還能夠這樣: [lb] 192.168.2.128 192.168.2.129 [lb:vars] ansible_ssh_user=root ansible_ssh_pass=root 不過在hosts中不光能夠定義inventory變量還能夠定義一些每臺主機本身各不相同的自定義變量,用於playbook使用
你學到這個應該大概知道了在ansible與主機間通信形式有三種:
1. 免祕鑰 2. inventory變量 3. 參數指定
如下是一些inventory參數:
... ansible_ssh_host 將要鏈接的遠程主機名.與你想要設定的主機的別名不一樣的話,可經過此變量設置. ansible_ssh_port ssh端口號.若是不是默認的端口號,經過此變量設置. ansible_ssh_user 默認的 ssh 用戶名 ansible_ssh_pass ssh 密碼(這種方式並不安全,咱們強烈建議使用 --ask-pass 或 SSH 密鑰) ansible_sudo_pass sudo 密碼(這種方式並不安全,咱們強烈建議使用 --ask-sudo-pass) ... 這裏只列一部分,參考:https://ansible-tran.readthedocs.io/en/latest/docs/intro_inventory.html
這個時候咱們對lb集羣進行ping狀態監測:
[root@node1 np]# ansible lb -m ping 192.168.2.128 | SUCCESS => { "changed": false, "ping": "pong" } 192.168.2.129 | SUCCESS => { "changed": false, "ping": "pong" } 注:也能夠用all表示hosts中全部主機
到這裏基本快速已經完成了基礎,開始學習一些經常使用的模塊:
這裏模塊總結直接抄的我大表哥的博客總結,否則太費時間了,因此聲明下:http://www.javashuo.com/article/p-kddtzqvl-dh.html
一、copy模塊(synchronize和copy使用方法一致)
從本地copy文件分發到目錄主機路徑 參數說明: src= 源文件路徑 dest= 目標路徑 注意src= 路徑後面帶/ 表示帶裏面的全部內容複製到目標目錄下,不帶/是目錄遞歸複製過去 content= 自行填充的文件內容 owner 屬主 group 屬組 mode權限 示例: ansible all -m copy -a "src=/etc/fstab dest=/tmp/fstab.ansible mode=600" ansible all -m copy -a "content='hi there\n' dest=/tmp/hi.txt" 到node1上查看 [root@node1 tmp]# ll -rw------- 1 root root 465 2月 9 14:59 fstab.ansible -rw-r--r-- 1 root root 9 2月 9 14:58 hi.txt
二、fetch模塊
從遠程主機拉取文件到本地 示例 [root@ansible ~]# ansible all -m fetch -a "src=/tmp/hi.txt dest=/tmp" 172.16.3.152 | SUCCESS => { "changed": true, "checksum": "279d9035886d4c0427549863c4c2101e4a63e041", "dest": "/tmp/172.16.3.152/tmp/hi.txt", "md5sum": "12f6bb1941df66b8f138a446d4e8670c", "remote_checksum": "279d9035886d4c0427549863c4c2101e4a63e041", "remote_md5sum": null } .......省略 說明:fetch使用很簡單,src和dest,dest只要指定一個接收目錄,默認會在後面加上遠程主機及src的路徑
三、command模塊
在遠程主機上執行命令,屬於裸執行,非鍵值對顯示;不進行shell解析; 示例1: [root@ansible ~]# ansible all -m command -a "ifconfig" 172.16.3.152 | SUCCESS | rc=0 >> enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.16.3.152 netmask 255.255.255.0 broadcast 172.16.3.255 .....省略..... 172.16.3.216 | SUCCESS | rc=0 >> enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.16.3.216 netmask 255.255.255.0 broadcast 172.16.3.255 .....省略..... 示例2: [root@ansible ~]# ansible all -m command -a "ifconfig|grep lo" 172.16.3.152 | FAILED | rc=2 >> [Errno 2] 沒有那個文件或目錄 172.16.3.216 | FAILED | rc=2 >> [Errno 2] 沒有那個文件或目錄 這就是由於command模塊不是shell解析屬於裸執行致使的 爲了能達成以上相似shell中的解析,ansible有一個shell模塊;
四、shell模塊
因爲commnad只能執行裸命令(即系統環境中有支持的命令),至於管道之類的功能不支持, shell模塊能夠作到 示例: [root@ansible ~]# ansible all -m shell -a "ifconfig|grep lo" 172.16.3.152 | SUCCESS | rc=0 >> lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 loop txqueuelen 0 (Local Loopback) 172.16.3.216 | SUCCESS | rc=0 >> lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 loop txqueuelen 0 (Local Loopback)
五、file模塊
設置文件屬性(建立文件) 經常使用參數: path目標路徑 state directory爲目錄,link爲軟件連接 group 目錄屬組 owner 屬主 等,其餘參數經過ansible-doc -s file 獲取 示例1:建立目錄 [root@ansible ~]# ansible all -m file -a "path=/var/tmp/hello.dir state=directory" 172.16.3.152 | SUCCESS => { "changed": true, "gid": 0, "group": "root", "mode": "0755", "owner": "root", "path": "/var/tmp/hello.dir", "size": 6, "state": "directory", "uid": 0 } 172.16.3.216 | SUCCESS => { "changed": true, .....省略..... 示例2:建立軟件連接 [root@ansible ~]# ansible all -m file -a "src=/tmp/hi.txt path=/var/tmp/hi.link state=link" 172.16.3.152 | SUCCESS => { "changed": true, "dest": "/var/tmp/hi.link", "gid": 0, "group": "root", "mode": "0777", "owner": "root", "size": 11, "src": "/tmp/hi.txt", "state": "link", "uid": 0 } 172.16.3.216 | SUCCESS => { "changed": true, .....省略.....
六、cron模塊
經過cron模塊對目標主機生成計劃任務 經常使用參數: 除了分(minute)時(hour)日(day)月(month)周(week)外 name: 本次計劃任務的名稱 state: present 生成(默認) |absent 刪除 (基於name) 示例:對各主機添加每隔3分鐘從time.windows.com同步時間 [root@ansible ~]# ansible all -m cron -a "minute=*/3 job='/usr/sbin/update time.windows.com &>/dev/null' name=update_time" 172.16.3.152 | SUCCESS => { "changed": true, "envs": [], "jobs": [ "update_time" ] } 172.16.3.216 | SUCCESS => { "changed": true, "envs": [], "jobs": [ "update_time" ] } #到node1上查看 [root@node1 tmp]# crontab -l #Ansible: update_time */3 * * * * /usr/sbin/update time.windows.com &>/dev/null 示例2:刪除計劃任務 [root@ansible ~]# ansible all -m cron -a "name=update_time state=absent" 172.16.3.152 | SUCCESS => { "changed": true, "envs": [], "jobs": [] } 172.16.3.216 | SUCCESS => { "changed": true, "envs": [], "jobs": [] } #node1上查看 [root@node1 tmp]# crontab -l 會發現已經被刪除了
七、yum模塊
故名思義就是yum安裝軟件包的模塊; 經常使用參數說明: enablerepo,disablerepo表示啓用與禁用某repo庫 name 安裝包名 state (present' orinstalled', latest')表示安裝, (absent' or `removed') 表示刪除 示例:經過安裝epel擴展源並安裝nginx [root@ansible ~]# ansible all -m yum -a "name=epel-release state=installed" [root@ansible ~]# ansible all -m yum -a "name=nginx state=installed"
八、service模塊
服務管理模塊 經常使用參數: name:服務名 state:服務狀態 enabled: 是否開機啓動 true|false runlevel: 啓動級別 (systemed方式忽略) 示例: [root@ansible ~]# ansible all -m service -a "name=nginx state=started enabled=true" 到node1上查看 [root@node1 tmp]# systemctl status nginx ● nginx.service - The nginx HTTP and reverse proxy server Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled) Active: active (running) since 五 2018-02-09 15:54:29 CST; 1min 49s ago Main PID: 10462 (nginx) CGroup: /system.slice/nginx.service ├─10462 nginx: master process /usr/sbin/nginx └─10463 nginx: worker process ......省略......
九、script模塊
把本地的腳本傳到遠端執行;前提是到遠端能夠執行,不要把Linux下的腳本同步到windows下執行; 直接上示例: 本地ansible上的腳本: [root@ansible ~]# cat test.sh #!/bin/bash echo "ansible script test!" > /tmp/ansible.txt [root@ansible ~]# ansible all -m script -a "/root/test.sh" 172.16.3.152 | SUCCESS => { "changed": true, "rc": 0, "stderr": "Shared connection to 172.16.3.152 closed.\r\n", "stdout": "", "stdout_lines": [] } 172.16.3.216 | SUCCESS => { "changed": true, "rc": 0, "stderr": "Shared connection to 172.16.3.216 closed.\r\n", "stdout": "", "stdout_lines": [] } 到node1上查看 [root@node1 tmp]# ls ansible.txt fstab.ansible hi.txt [root@node1 tmp]# cat ansible.txt ansible script test! script模塊這個功能能夠作不少事,就看你怎麼用了~ 以上是經常使用模塊,至於其餘模塊的使用可經過官方模塊列表得到~
playbook
學會了上面的就能夠開始搞playbook了:
開搞以前你須要知道爲何要用playbook?由於咱們到此以前學的都是單個功能,複製個文件什麼的,這些我想說我在CRT下面開個窗口都能作,那麼playbook到底能作什麼呢?
playbook你能夠理解爲一個劇本,就是playbook中,能夠定義哪些主機依次分別該幹哪些事,從而完成一項複雜龐大的任務,一般咱們用它來部署服務,咱們先寫一個簡單的(注意基於yaml語法):
--- - hosts: lb ##指定lb組的主機作如下的事情 remote_user: root ##以哪一個用戶的身份去執行 tasks: ##任務列表 - name: install nginx ##第一步,給這個任務命名爲安裝nginx yum: name=nginx state=installed ##模塊名: 參數 - name: installed nginx config ##第二步,準備配置文件 copy: src=~/playbook/nginx.conf_v2 dest=/etc/redis.conf owner=redis mode=0640 - name: start nginx ##啓動nginx service: name=nginx state=started
如何執行playbook?
[root@node1 np]# ansible-playbook --syntax-check nginx.yml ##沒有錯誤拋出便可 [root@node1 np]# ansible-playbook nginx.yml ##執行以前,準備好playbook中須要的配置文件
好了這就是一個簡單的nginx的playbook,之後你給新機器裝nginx就能夠這麼搞了,把配置文件搞好每次執行這個文件便可
不行了不行了,今天趕火車實在沒時間了,先排版到這吧,下週一給小夥伴補齊playbook和roles