配置文件:html
/etc/ansible/ansible.cfg 主配置文件,配置ansible特性node
/etc/ansible/hosts 主機清單linux
/etc/ansible/roles/ 存放角色的目錄nginx
程序web
/usr/bin/ansible 主程序,臨時命令執行工具正則表達式
/usr/bin/ansible-doc 查看配置文檔,模塊功能查看工具shell
/usr/bin/ansible-galaxy 下載/上傳優秀代碼或Roles模塊官網平臺vim
/usr/bin/ansible-playbook 定製自動化任務,編排劇本工具緩存
/usr/bin/ansible-pull 遠程執行命令工具bash
/usr/bin/ansible-vault 文件加密工具
/usr/bin/ansible-console 給予console界面與用戶交互執行工具
主機清單
[root@ansible ~]#vim /etc/ansible/hosts #能夠分組 [websrvs] 192.168.9.101 192.168.9.102 [dbsrvs] 192.168.9.101 192.168.9.103 # 能夠指定連續的iP [appsrvs] 192.168.9.10[1:3] # 能夠指定端口,指定的ssh的端口 [port] 192.168.9.103:2222
主配置文件
[defaults]
#inventory = /etc/ansible/hosts # 主機列表配置文件
#library = /usr/share/my_modules/ # 開文件存放目錄
#remote_tmp = ~/.ansible/tmp # 臨時py命令文件存放在遠程主機目錄
#local_tmp = ~/.ansible/tmp # 本機的臨時命令之星目錄
#forks = 5 # 默認併發數
#sudo_user = root # 默認併發數
#ask_sudo_pass = True # 每次執行ansible命令是否詢問密碼
#ask_pass = True
#remote_port = 22
# host_key_checking = False # 檢查對應服務器的host_key,建議取消註釋
#log_path = /var/log/ansible.log # 日誌文件
ansible命令
(ansible 兼容Centos6和Centos5請看:ansible若是兼容Centos5)
-m:指定模塊 # ansible 192.168.9.101,192.168.9.102 -m ping -u root -k //ip必須在主機清單
-v 詳細過程 -vv -vvv 更詳細
--list-hosts:顯示主機列表
[root@ansible ~]#ansible all --list-hosts
[root@ansible ~]#ansible websrvs --list-hosts
-k,--ask-pass:輸入ssh鏈接密碼,默認key驗證
-K,--ask-become-pass 提示輸入sudo時的口令
-u:用戶名
-T,--timeout=TIMEOUT 執行命令超時時間,默認10s
-u,--user=REMOTE_USER 執行遠程知心的用戶
-b,--become 代替舊版的sudo切換
ansible-doc
-a:列出全部模塊文檔
-l:列出可用模塊
-s 模塊名:簡單顯示模塊的使用
模塊名:查看模塊的幫助文檔
[root@ansible ~]#ansible dbsrvs -m command -a 'ls /root' -u xuan -k -b -K -m command // 使用的command這個模塊 -a 'ls /root' 這個是模塊的參數 -u xuan 指定用戶 -k 使用密碼驗證 -b 使用sudo -K 提示輸入sudo的密碼 [root@ansible ~]#ansible 'all' -m ping //全部主機 [root@ansible ~]#ansible '*' -m ping //全部主機 [root@ansible ~]#ansible 'websrvs:dbsrvs' -m ping //在websrvs組中的和dbsrvs組中的或關係 [root@ansible ~]#ansible 'websrvs:dbsrvs' --list [root@ansible ~]#ansible 'websrvs:&dbsrvs' -m ping //記載websrvs中的又在dbsrvs組中的,與關係 [root@ansible ~]#ansible 'websrvs:&dbsrvs' --list [root@ansible ~]#ansible 'websrvs:!dbsrvs' --list //在websrvs裏邊,可是不在dbsrvs裏邊,此處必須爲單引號 [root@ansible ~]#ansible "~(web|db)srv" -m ping //正則表達式
anseble命令執行過程
ansible命令執行過程
①加載子本身的配置文件,默認/etc/ansible/ansiblecfg
②加載本身對應的模塊文件,如command
③經過ansible將模塊或命令生成對用的臨時py文件,並將該文件傳輸至遠程服務器的對應執行用戶$HOME/ansible/tmp/ansible-tmp-數字/XXX.py文件
④ 給文件x權限
⑤執行並返回結果
⑥刪除臨時py文件,sleep 0 退出
執行狀態,在/etc/ansible/ansible.cfg文件中有說明,475行,[colors]模塊
綠色:執行成功而且不須要作改變的操做
黃色:執行成功並對目標主機作變動
紅色:執行失敗
ansible常見模塊
{ping,command,shell,script,fetch,copy,hostname,cron,file,yum,service,user,group}
command
chdir:切換目錄
[root@ansible ~]#ansible all -a 'chdir=/media ls' //查看/media目錄
creates:後邊的文件存在就不執行
[root@ansible ~]#ansible all -a 'creates=/media/cdrom mkdir /media/cdrom' //若是存在/media/cdrom,就建立/media/cdrom
removes:若是存在就執行
[root@ansible ~]#ansible all -a 'removes=/media/cdrom ls -l -d /media/cdrom/' //若是存在/media/cdrom,就查看該文件
shell模塊:由於command模塊不支持重定向、管道、變量等特殊場景,因此須要shell模塊
chdir:切換目錄
creates:後邊的文件存在就不執行
removes:若是存在就執行
[root@ansible ~]#ansible all -m shell -a 'echo $HOSTNAME' //查看每臺機器的主機名 [root@ansible ~]#ansible all -m shell -a 'echo aptech1! | passwd --stdin root' //批量改密碼
Script:能夠將本地的腳本在全部主機上執行
chdir:切換目錄
creates:後邊的文件存在就不執行
removes:若是存在就執行
[root@ansible ansible]#vim script1 #!/bin/bash hostname [root@ansible ansible]#ansible all -m script -a '/root/ansible/script1'
copy:將本地的文件推送到目標文件
backup:將原有文件備份
content:直接編輯內容
dest:目標文件的位置
mode:權限
owner:全部者
src:源文件
[root@ansible ansible]#ansible all -m copy -a 'src=/root/ansible/selinux dest=/etc/selinux/config backup=yes mode=000 owner=xuan' #content [root@ansible ansible]#ansible all -m copy -a 'content="hello\n軒\n軒" dest=/tmp/f1'
Fetch:從客戶端提取文件至服務器端,與copy相反
dest:目標文件的位置
src:源文件
[root@ansible ~]#ansible all -m fetch -a 'src=/etc/sysconfig/network dest=/data' [root@ansible ~]#tree /data/ /data/ ├── 192.168.9.101 │ └── etc │ └── sysconfig │ └── network ├── 192.168.9.102 │ └── etc │ └── sysconfig │ └── network └── 192.168.9.103 └── etc └── sysconfig └── network 9 directories, 3 files
file:設置文件屬性
[root@ansible ansible]#ansible all -m file -a 'name=/data/f3 state=touch' #在/datax下建立文件f3 [root@ansible ansible]#ansible all -m file -a 'dest=/data/f3 state=absent' #刪除/data/f3 [root@ansible ansible]#ansible all -m file -a 'path=/data/dir1 state=directory' #在/data下建立dir1文件夾 [root@ansible ansible]#ansible all -m file -a 'path=/data/dir1 state=absent' #刪除/data/dir1文件夾 [root@ansible ansible]#ansible all -m file -a 'src=/etc/fstab dest=/data/f.link state=link' #將/etc/fstab軟鏈接到/data/f.link文件 [root@ansible ansible]#ansible all -m file -a 'dest=/data/f.link state=absent' #刪除軟鏈接
hostname:更改主機名,由於每一個主機不該該同樣,因此後期使用變量批量更改
[root@ansible ansible]#ansible 192.168.9.101 -m hostname -a 'name=node01'
Cron:計劃任務
disabled=true、yes、y、fales、no、n.... 禁用或啓用
[root@ansible ansible]#ansible all -m cron -a 'minute=* weekday=2,4,6 job="/usr/bin/wall FBI warning" name=xuan' # 計劃任務,在周2、4、六每分鐘報警一次 [root@ansible ansible]#ansible all -m cron -a 'disabled=true job="/usr/bin/wall FBI warning" name=xuan' # 禁用計劃任務,job不加會報錯,name不加會新建一個計劃任務並註釋,原來的並不會被禁用 [root@ansible ~]#ansible all -m cron -a 'job="/usr/bin/wall" name=xuan state=absent' # 刪除計劃任務
Yum:管理包
state=latest:安裝,默認就是安裝
installed:查看已經安裝過的
removed:卸載
disable_gpg_check=yes:忽略key驗證
update_cache=yes:更新緩存
[root@ansible ~]#ansible all -m yum -a 'name=ftp' #安裝ftp客戶端軟件,默認爲安裝,因此默認不須要state=latest [root@ansible ~]#ansible websrvs -m yum -a 'list=installed' #查看已經安裝過的軟件 [root@ansible ~]#ansible websrvs -m yum -a 'name=ftp state=removed' # 卸載ftp客戶端軟件 # 同時安裝多個包 [root@ansible ~]#ansible websrvs -m yum -a 'name=ftp,vsftpd,httpd' # 同時卸載多個包,absent和removed均可以 [root@ansible ~]#ansible websrvs -m yum -a 'name=ftp,vsftpd,httpd state=absent'
#安裝rpm單個包,先使用copy,在使用yum ①copy複製 [root@ansible ~]#ansible all -m copy -a 'src=/media/cdrom/Packages/dstat-0.7.2-12.el7.noarch.rpm dest=/root' ②yum安裝,而且忽略key驗證 [root@ansible ~]#ansible all -m yum -a 'name=/root/dstat-0.7.2-12.el7.noarch.rpm disable_gpg_check=yes' [root@ansible ~]#ansible websrvs -m yum -a 'update_cache=yes' # 更新緩存
Service
enabled:開機啓動
name:指定服務名
state:started、stopped、restarted、reloaded
[root@ansible ~]#ansible websrvs -m service -a 'state=started enabled=yes name=vsftpd' # 啓動vsftpd,設置爲開機啓動 [root@ansible ~]#ansible websrvs -m service -a 'state=stopped enabled=no name=vsftpd # 關閉vsftpd,取消開機啓動
'
User:管理用戶
comment:註釋
create_home:是否建立家目錄
expires:過時時間
group:主組
groups:附加組
home:家目錄
name:用戶名
password:加密口令
remove:刪除,並且刪除家目錄
system:制定系統帳號
shell:shell類型
[root@ansible ~]#ansible websrvs -m user -a 'name=nginx shell=/sbin/nologin system=yes create_home=no groups=wheel uid=80 comment="Nginx server"' # 建立nginx用戶,shell爲nologin,是一個系統帳戶,不建立家目錄,uid爲80,commend描述 [root@ansible ~]#ansible websrvs -m user -a 'name=nginx shell=/sbin/nologin home=/home/nginx system=yes create_home=yes groups=wheel uid=80 comment="Nginx server"' # home指定家目錄 [root@ansible ~]#ansible websrvs -m user -a 'name=nginx state=absent remove=yes' # 刪除nginx用戶,若是有家目錄,也將家目錄刪除
Group
system:是不是系統組
gid:
state
name
[root@ansible ~]#ansible websrvs -m group -a 'name=nginx system=y gid=80' # 系統組,gid爲80 [root@ansible ~]#ansible websrvs -m group -a 'name=nginx state=absent' # 刪除組
ansible-galaxy
下載galaxy
[root@ansible ~]#ansible-galaxy install geerlingguy.nginx
查看galaxy
[root@ansible ~]#ansible-galaxy list //查看全部角色 [root@ansible ~]#ansible-galaxy list geerlingguy.nginx //查看單個角色 [root@ansible ~]#cp -ar .ansible/roles/{geerlingguy.nginx,xuan.nginx} //就等於又建立了一個角色
刪除galaxy
[root@ansible ~]#ansible-galaxy remove geerlingguy.nginx
ansible-pull(push拉,pull推)
速度較快
ansible-playbook(後邊還有更多介紹)
後綴建議爲yml
#第一個plabook [root@ansible ansible]#vim hello.yml --- //第一行的---是一個習慣 - hosts: websrvs //必需要注意空格,對空格很敏感,hosts表明遠程主機,websrvs是以前建立愛你的主機清單組 remote_user: root // 在遠程使用什麼身份執行 tasks: - name: xuan //playbook的名字 command: hostname //command是模塊,hostname是命令
ansible-vault:用於加密ansible-playbook
[root@ansible ansible]#ansible-vault encrypt hello.yml # 將hello.yml加密 [root@ansible ansible]#ansible-vault view hello.yml # 查看加密後的文件內容,須要輸入解密密碼 [root@ansible ansible]#ansible-vault edit hello.yml # 編輯加密後的文件 [root@ansible ansible]#ansible-vault rekey hello.yml # 修改口令 [root@ansible ansible]#ansible-vault create hello2.yml # 建立一個新的,加密的文件 [root@ansible ansible]#ansible-vault decrypt hello.yml # 將hello.yml解密
ansible-console:2.0+新增,可交互式執行命令,支持tab
[root@ansible ansible]#ansible-console
# 遠程執行命令的用戶@針對的主機 (3個主機) [f:5]表明併發數 root@all (3)[f:5]$ # 切換針對的主機爲websrvs組 root@all (3)[f:5]$ cd websrvs # 修改併發數爲10 root@websrvs (2)[f:5]$ forks 10 # 調用command模塊 root@websrvs (2)[f:10]$ command hostname
Playbook:YAML語言編寫
YAML介紹
YAML語法
Playbood核心元素
Hosts 指定的遠程主機列表(支持)
Tasks 任務集
tasks中的一個name只能對應一個模塊的執行任務,只會執行後邊定義的
Varniables 內置變量或自定義變量在playbook中調用
Tempplates 模板,可替換模板文件中的變量並實現一些簡單邏輯的文件
Handlers 和 notity集合使用,由特定條件觸發的操做,知足條件方執行,不然不執行
[root@ansible ansible]#cat http.yml --- - hosts: websrvs remote_user: root tasks: - name: install httpd Package yum: name=httpd - name: copy conf file copy: src=files/httpd.conf dest=/etc/httpd/conf/ backup=y notify: restart service //當文件發生改變時,使用notify調用handlers的restart server - name: start service service: name=httpd state=started enabled=y handlers: - name: restart service # 這裏的名字用於tasks裏邊的調用 service: name=httpd state=restarted
tags 標籤 指定某條任務執行,用於選擇運行playbook 中的部分代碼
多個name公用一個標籤,執行的那個標籤的時候,都會被執行
[root@ansible ansible]#cat http.yml --- - hosts: websrvs remote_user: root tasks: - name: install httpd Package yum: name=httpd tags: install - name: copy conf file copy: src=files/httpd.conf dest=/etc/httpd/conf/ backup=y - name: start service service: name=httpd state=started enabled=y tags: startservice # 查看文件中定義了哪些模塊 [root@ansible ansible]#ansible-playbook --list-tags http.yml # 使用-t單獨指定執行的tags [root@ansible ansible]#ansible-playbook -t install http.yml
ansible-playbook
-C,--check:不執行,檢查與法
--list-hosts:列出運行任務的主機
--list-tags:列出tags
--list-tasks :列出tasks中定義的內容,列出的同時也會有tags信息
--limit:指定運行的主機,前提是主機必須在文件中定義
-t:指定執行的tahs
-v -vv -vvv
Playbook執行失敗後續怎麼繼續執行
①不管如何返回true方法
tasks:
- name: test1
shell: /aaa || /bin/true
②使用playbook自帶的忽略錯誤
tasks:
- name: test2
shell: /aaa
ignore_errors:True
ShellScripts VS Playbook
Playbook示例
# 相對路徑 [root@ansible ansible]#cat playbook1.yml --- - hosts: websrvs remote_user: root tasks: - name: cppy index copy: src=files/index.html dest=/var/www/html/ # 相對路徑是相對的當前目錄
setup是一個模塊,這個模塊能夠不添加任何參數直接執行,會返回對方主機的不少信息,而且使用變量進行保存
# 顯示全部變量 [root@ansible ~]#ansible websrvs -m setup # 也可使用-a 加參數,過濾其中的某些參數 [root@ansible ~]#ansible websrvs -m setup -a 'filter=ansible_fqdn' //顯示FQDN主機名 [root@ansible ~]#ansible websrvs -m setup -a 'filter=*address*' //顯示地址,會顯示包含address關鍵字的相關信息 [root@ansible ~]#ansible websrvs -m setup -a 'filter=ansible_eth*' //也能夠看某個網卡的參數
setup在playbook中的示例
[root@ansible ansible]#cat var4.yml --- - hosts: websrvs remote_user: root tasks: - name: create log file file: name=/data/{{ansible_fqdn}}.log state=touch mode=600 owner=xuan # ansible_fqdn就是一個setup中的變量
②在主機清單中定義
普通變量:主機組中主機單獨定義,優先級高於公共變量
公共(組)變量:針對主機組中全部主機定義統一變量
[root@ansible ansible]#cat /etc/ansible/hosts [websrvs] 192.168.9.101 host_port=81 # 普通變量 192.168.9.102 host_port=82 [websrvs:vars] # 公共(組)變量 nodename=www domainname=p-pp.cn # 在playbook中調用 [root@ansible ansible]#cat var3.yml --- - hosts: websrvs remote_user: root tasks: - name: set hostname hostname: name={{nodename}}{{host_port}}.{{domainname}}
[root@ansible ~]#cat ansible/var1.yml --- - hosts: websrvs remote_user: root tasks: - name: install package yum: name={{ pkname1 }} - name: install package yum: name={{ pkname2 }} # 在執行時定義 [root@ansible ansible]#ansible-playbook -e "pkname1=httpd pkname2=vsftpd" var1.yml -C
[root@ansible ansible]#cat var2.yml --- - hosts: websrvs remote_user: root vars: - pkname1: httpd - pkname2: vsftpd tasks: - name: install package1 yum: name={{ pkname1 }} - name: install package2 yum: name={{ pkname2 }}
[root@ansible ansible]#cat vars.yml var1: httpd var2: vsftpd [root@ansible ansible]#cat var5.yml --- - hosts: websrvs remote_user: root vars_files: //調用文件中的變量 - vars.yml //vars.yml是文件的名字 tasks: - name: install package yum: name={{var1}},{{var2}} - name: create file file: name=/data/{{var2}}.log state=touch
⑥在rule中定義
命令行變量 > playbook > 主機清單