相同點:都是爲了同時在多臺機器上執行相同的命令;node
都是python開發;python
不一樣點:linux
agent(salt 控制節點須要安裝salt-master,被控節點須要安裝salt-minion,而ansible不須要,它經過ssh來鏈接並控制被控節點)nginx
配置(salt配置麻煩,ansible基本不用配置)web
學習路線(salt比較陡峭,ansible比較平緩)redis
第三方工具(salt比較少)docker
開源社區的對接(salt比較少)shell
現有用戶(salt仍是比ansible少一些)編程
二次開發擴展的能力(ansible比較差,尤爲是2.0之後)flask
大規模開發(200之內同樣,200以上salt會好一些,咱們也能夠對ansible作一些配置使其在200以上追上salt)
Windows的支持(salt會很好多)
準備四臺乾淨的虛擬機,以下:
192.168.85.132 (主控節點,下面三個爲被控節點)
192.168.85.133
192.168.85.134
192.168.85.135
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo # 下載epel源,由於ansible須要從epel源下載 yum install -y ansible # 安裝ansible
ansible安裝後有一下文件
hosts文件詳解:
# This is the default ansible 'hosts' file. # # It should live in /etc/ansible/hosts # # - Comments begin with the '#' character # 用#來表示註釋 # - Blank lines are ignored # 空白行被忽略 # - Groups of hosts are delimited by [header] elements # 主機組 須要在【】下面 # - You can enter hostnames or ip addresses #能夠寫主機名或者ip地址 # - A hostname/ip can be a member of multiple groups # 一臺主機能夠在多個組裏面 # ...... # www[001:006].example.com # 表示從www001到www006的機器 # ......
ssh的認證方式
-密碼鏈接:即ssh root@192.168.xx,xxx,而後輸入密碼提交
-祕鑰提交:ssh祕鑰登陸方式以下:
ssh-keygen #用來生成ssh的祕鑰對,一直回車便可 ssh-copy-id 192.168.85.133 #複製祕鑰到遠程主機,回車輸入yes,再回車輸入遠程主機登陸密碼 ssh 192.168.85.85.133 #經過此命令就能夠登陸遠程主機
若是想ssh鏈接被控節點,需在hosts中先添加被控制節點地址
ansible 192.168.85.133 -m ping
當想鏈接操做多臺服務器時,能夠將服務器分組添加到hosts文件中
ansible <host-pattern> [options] -a MODULE_ARGS 模塊參數 -m MODULE_NAME 模塊名稱 -f forks 指定一次執行的機器,用於高併發 -C 測試 --list-host 查看運行的機器 -V 輸出詳情的信息
獲取文檔
ansible-doc --help -s 指定模塊名稱 -l 列出全部的模塊
操做日誌
/var/log/message
執行遠程命令,可是不支持特殊字符 <> |!;$&
ansible web -a 'ls /' ansible web -a 'pwd' ansible wen -a 'chdir=/tmp pwd' #切換目錄執行命令,使用場景是編譯安裝時使用 ansible web -a 'creates=/tmp pwd' #用來判斷/tmp目錄是否存在,存在就不執行操做 ansible web -a 'creates=/data pwd' #由於data不存在,全部纔會執行pwd命令 ansible web -a 'removes=/tmp pwd' #用來判斷tmp目錄是否存在,存在就執行操做 ansible web -a 'removes=/data pwd' #由於data不存在,全部纔不會執行
查看用戶是否建立成功
tail -1 /etc/passwd tail -1 /etc/shadow id wudabing #查看用戶id echo '123'|passwd --stdin wudabing #設置密碼
執行遠程主機的python或shell腳本,支持特殊字符
ansible web -m shell -a 'echo "123" | passwd --stdin wudabing' # 批量建立密碼 ansible 192.168.85.133 -m shell -a 'bash a.sh' # 執行遠程文件方式一 ansible 192.168.85.133 -m shell -a '/root/a.sh' #執行遠程文件方式二,文件必須有執行權限 ansible 192.168.85.133 -m shell -a '/root/a.py' # 執行遠端的Python腳本
在遠程主機執行主控端的shell/python腳本,使用相對路徑
ansible web -m script -a '/root/m.sh' #執行本地的文件,執行管控機上的文件 ansible web -m script -a 'removes=/root/m.sh /root/m.sh' #用來判斷被管控機上是否是存在文件,若是存在就執行,不存在就不執行 ansible web -m script -a 'creates=/root/a.sh /root/m.sh' #用來判斷被管控機上是否是存在文件,若是存在,就不執行
backup 備份,以時間戳結尾 dest 目的地址 group 文件的屬組 mode 文件的權限 r 4 w 2 x 1 owner 文件的屬主 src 源文件 # 經過md5碼來判斷是否須要複製 ansible db -m copy -a 'src=/root/m.sh dest=/tmp/a.sh' #複製本地文件的到遠程主機 ansible db -m copy -a 'src=/root/m.sh dest=/tmp/a.sh mode=755' #修改文件的權限 ansible web -m copy -a 'src=/root/m.sh dest=/tmp/a.sh mode=755 owner=wudabing' 修改文件的屬主 ansible web -m copy -a 'src=/etc/init.d dest=/tmp/ mode=755 owner=wudabing' # 複製本地目錄到遠程主機,若是改變文件的屬性,則文件夾內的文件也會被改變 ansible web -m copy -a 'src=/etc/init.d/ dest=/tmp/ mode=755 owner=wudabing' # 複製本地目錄內的全部文件到遠程主機 ansible web -m copy -a "content='月光光照大牀\n' dest=/tmp/b.txt" # 直接將文本內容注入到遠程主機的文件中
當源文件變化時,軟連接和硬連接文件都會跟着變化
inode #硬盤的地址 id #獲取到的時內存的地址 ln -s a.py b.py #建立軟連接 ln a.py c.py #建立硬連接
file的使用
ansible db -m file -a 'path=/lzmly2 state=directory' #在遠程機器上建立文件夾 ansible db -m file -a 'path=/root/q.txt state=touch' #用來在遠程機器上建立文件 ansible db -m file -a 'path=/tmp/f src=/etc/fstab state=link' #建立軟鏈接src是源地址,path是目標地址 ansible db -m file -a 'path=/tmp/f state=absent' #用來刪除文件或者文件夾
dest 目的地址 src 源地址 ansible web -m fetch -a 'src=/var/log/cron dest=/tmp' # 下載被控節點的文件,每臺機器建立一個文件夾,並保留原來的目錄結構
rpm和yum的區別
rpm:redhat package manage
yum:能夠解決依賴關係
yum源配置
[epel] name=Extra Packages for Enterprise Linux 7 - $basearch #名字 baseurl=http://mirrors.aliyun.com/epel/7/$basearch #rpm源的地址,能夠寫http,https,ftp,Samba,file: failovermethod=priority enabled=1 # 是否開啓,1表明開啓,0表示關閉 gpgcheck=0 #是否校驗簽名,1表明校驗,0表示校驗 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
disablerepo #禁用源 enablerepo #啓用源 name #包名 state install (`present' or `installed', `latest'), or remove (`absent' or `removed') ansible web -m yum -a 'name=wget' # 安裝wget ansible web -m yum -a 'name=python2-pip' # 安裝python2-pip ansible web -m yum -a 'name=wget state=absent' # 卸載軟件包 ansible web -m yum -a 'name="@Development Tools"' # 安裝包組
pip install #安裝包 pip freeze > a.txt #將python的環境打包到文件中 pip install -r a.txt #安裝文件中的包 pip list #查看全部的已安裝成功的包 ansible web -m pip -a 'name=flask' # 安裝flask模塊
ps -ef|grep nginx #查看進程 ss -tnlp #查看端口信息 systemctl start nginx #centos7 service nginx start #centos6 systemctl enable nginx #centos7 開機自啓動 chkconfig nginx on # centos6開機自啓動
ansible web -m service -a 'name=nginx state=started' # 啓動nginx ansible web -m service -a 'name=nginx state=stopped' # 關閉nginx
* * * * * job 分 時 日 月 周 任務 0 */2 * * * job 每隔兩個小時 0 12,13 * * * job 12點和13點 0 12-17 * * * job 12點到17點 0 12-17/2 * * 1,3,6,0 周1,周3,周6,周7 12點到17點每隔兩個小時 crontab -e # 編輯計劃任務 crontab -l # 查看計劃任務 crontab -r # 刪除計劃任務 ***請勿使用*****來表示時間
ansible中cron的參數及使用
day 天 disabled 禁用 hour 小時 job 任務 minute 分鐘 month 月 name 任務名字 weekday 周 ansible db -m cron -a 'minute=26 job="touch /tmp/xzmly.txt" name=touchfile' # 新建一個計劃任務 ansible db -m cron -a 'name=touchfile state=absent' # 刪除一個計劃任務 ansible db -m cron -a 'minute=26 job="touch /tmp/xzmly.txt" name=touchfile disabled=yes' # 禁用計劃任務,以#表示禁用
在linux中的正常運維操做
用戶: 管理員 root 0 普通用戶 系統用戶 不能登陸 1-999 centos7 1-499 centos6 登陸用戶 能夠登陸 1000-65535 centos7 500-65535 centos6 用戶組: 管理員組 root 0 系統用戶組 1-999 centos7 1-499 centos6 登陸用戶組 1000-65535 centos7 500-65535 centos6 -d 指定用戶的家目錄 -g 指定用戶的組 -G 執行用戶的附加組 -s 指定登陸後使用的shell -r 建立一個系統組 useradd -r wusir 建立系統用戶, 從999倒序 useradd -s /sbin/nologin liu 建立的是普通用戶,從1000開始升序 useradd -d /opt/liu liu 建立用戶時指定用戶的家目錄 useradd -u 3000 liu # 建立用戶並指定用戶的uid userdel liu 刪除用戶 userdel -r liu 刪除用戶並刪除用戶的家目錄 groupadd wudabing 建立用戶組 groupdel wudabing 刪除用戶組
group 組 groups 附加組 home 家目錄 name 用戶名 password 密碼 remove ? shell 用戶登陸後使用的shell system 建立一個系統用戶 uid 用來指定用戶的id state 狀態 ansible db -m user -a 'name=wulaoshi uid=4000 home=/opt/wulaoshi groups=root shell=/sbin/nologin' #建立一個用戶,並指定用戶的id,用戶的家目錄,用戶的附加組,用戶的shell ansible db -m user -a 'name=wulaoshi state=absent' #刪除用戶可是不刪除用戶的家目錄 ansible db -m user -a 'name=wulaoshi3 state=absent remove=yes' # 刪除用戶並刪除用戶的家目錄
gid 組的id name 組名 system 系統組 state ansible db -m group -a 'name=wulaoshi system=yes' #建立系統組 ansible db -m group -a 'name=wulaoshi state=absent' # 刪除組
在使用ansible-playbook時,咱們會應用到一個編程語言--yaml,ansible-playbook應用的就是.yanl或.yml的文件,和寫配置文件的xml,ini語言相似.
其中表達字典:key:value;列表:[ ] -
文件執行順序:從上往下
特性:冪等性,無論執行多少遍,結果都是同樣的.
ansible-playbook [options] playbook.yml [playbook2 ...] -C, --check # 檢查,白跑,幹跑 -f FORKS, --forks=FORKS #用來作併發 --list-hosts # 列出主機列表 --syntax-check # 語法檢查
簡單用法
- hosts: web #web爲被控節點機組 tasks: - name: creategroup #任務名 group: name=liuqingyang #此行,group爲模塊名,對應的value爲命令 - name: createuser #任務名 user: name=wudabing #user爲模塊名
vi p1.yml
- hosts: web tasks: - name: create{{ user }} #參數 user: name={{ user}}
ansible-play -e 'user=wudabing' p1.yml #直接傳參運行
[web] 192.168.85.133 user=wudabing1 192.168.85.134 user=wudabing2 #在hosts文件,機組中直接設置參數值
[web;vars] #表示組的參數 user=wudabing3
- hosts: web vars: - user: wudabing4 #在要運行的yml文件中設置參數值 tasks: - name: create{{ user }} #參數 user: name={{ user}}
- hosts: web tasks: - name: sum shell: echo 5 register: user - name: createuser user: name={{user.stdout}} #繼承其餘運行結果做爲參數值
傳參方式的優先級
-e > playbook yum文件 > hosts文件
能夠判斷如下狀況,不一樣條件作出不一樣操做
不一樣的系統; 不一樣的版本; 不一樣的環境; 不一樣的用戶.
- hosts: db remote_user: root tasks: - name: createfile copy: content="寶塔鎮河妖" dest=/tmp/a.txt when: a=="3" - name: cratefile copy: content="月光光,照大牀" dest=/tmp/a.txt when: a=="4"
在anible-playbook -t 指定tag
- hosts: web tasks: - name: installnginx yum: name=nginx tags: installnginx #爲任務添加標籤 - name: copyfile copy: src=/etc/nginx/nginx.conf dest=/etc/nginx/nginx.conf tags: copyfile #爲任務添加標籤 - name: start service: name=nginx state=started tags: start #爲任務添加標籤
ansible-playbook -t copyfile p.yml #只運行標籤爲copyfile的任務
一般你想在一個任務中幹不少事,好比建立一羣用戶,安裝不少包,或者重複一個輪詢步驟直到收到某個特定結果.
- hosts: web tasks: - name: createuser user: name={{item}} with_items: -liu1 -liu2 -liu3 -name: creategroup group: name={{item}} with_items: -wu1 -wu2 -wu3
- hosts: all remote_user: root tasks: - name: add user user: name={{ item[0] }} groups={{ item[1] }} with_items: - ["old1","old2"] - ["nginx,docker"]
- hosts: web tasks: - name: installredis yum: name=redis - name: copyfile template: src=/etc/redis.conf dest=/etc/redis.conf - name: start service: name=redis state=started 配置文件: bind {{ ansible_default_ipv4.address }}
之因此在拷貝配置文件用template模塊不用copy,由於copy模塊不能代替bind後的參數,template模塊能夠代替.
ps:寫相對路徑:在當前目錄下新建一個templates目錄,而後把文件放在templates目錄裏面,好比src=templates.j2
Handlers 也是一些 task 的列表,經過名字來引用,它們和通常的 task 並無什麼區別。
Handlers 是由通知者進行 notify, 若是沒有被 notify,handlers 不會執行。
無論有多少個通知者進行了 notify,等到 play 中的全部 task 執行完成以後,handlers 也只會被執行一次。
Handlers 最佳的應用場景是用來重啓服務,或者觸發系統重啓操做.除此之外不多用到了。
- hosts: web tasks: - name: installredis yum: name=redis - name: copyfile template: src=redis.conf dest=/etc/redis.conf tags: copyfile notify: restart handler: - name: restart service: name=redis state=restarted
特色:目錄清晰;能夠相互調用
roles文件夾:
文件夾裏面要是建立的每個角色,每個角色一個文件夾,每個角色裏面都有tasks(必須的),templates,files,handlers,vars目錄,每一個目錄都要有main.yml文件,經過import_tasks來調用,其中templates文件夾中的文件能夠經過相對路徑來調用.