準備四臺乾淨的虛擬機, node
192.168.133.129(主控節點,下面三個爲被控節點)python
192.168.133.130linux
192.168.133.131web
192.168.133.132shell
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 安裝後生成的文件:json
rpm -ql ansible |more # 查看命令 /etc/ansible /etc/ansible/ansible.cfg # 配置文件 /etc/ansible/hosts # 主要文件 /etc/ansible/roles
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的機器 # ......
相同點: bash
都是爲了同時在多臺機器上執行相同的命令服務器
都是python開發併發
不一樣點:
agent (salt 控制節點須要安裝salt-msater, 被控節點須要安裝salt-minion, 而ansible不須要, 它經過ssh 來連接並控制被控節點)
配置(salt配置麻煩,ansible基本不用配置)
學習路線(salt比較陡峭,ansible比較平緩)
第三方工具(salt比較少)
開源社區的對接(salt比較少)
現有用戶(salt仍是比ansible少一些)
二次開發擴展的能力(ansible比較差,尤爲是2.0之後)
大規模併發(200之內同樣,200以上salt會好一些,固然咱們也能夠對ansible作一些配置使其在200以上追上salt)
Windows的支持(salt會好不少)
ssh 的認證方式
- 密碼鏈接: 即ssh root@192.168.xx.xx 回車而後輸入密碼
- 祕鑰鏈接
ssh 祕鑰鏈接登陸方式以下:
ssh-keygen #用來生成ssh的密鑰對,一路回車
ssh-copy-id 192.168.133.130 # 複製祕鑰到遠程主機,回車後輸入"yes",再回車輸入遠程主機登陸密碼
ssh 192.168.133.130 # 而後就能夠經過此命令登陸遠程主機了
咱們以前ping命令能夠測試主機之間是否相通,ansible也爲咱們提供了一個ping模塊,先來看一下ansible都爲咱們提供了哪些命令,以下:
ansible -h # 查看ansible的命令格式,爲 ansible <host-pattern> [options] ,部分命令格式以下:
-a MODULE_ARGS, --args=MODULE_ARGS # 模塊參數 -C, --check # 檢查,測試 -f FORKS, --forks=FORKS # 用來作高併發的,指定一次執行的機器 --list-hosts # 列出主機列表 -m MODULE_NAME # 模塊名稱 --syntax-check # 語法檢查 -k # 輸入密碼方式鏈接 -v # 輸出詳細信息
使用ansible 爲咱們提供的平模塊:
ansible 192.168.133.130 -m ping
這是由於咱們沒有配置ansible的配置文件,提示主機列表爲空,咱們修改ansible的配置文件 /etc/ansible/hosts 以下:
此時,再次執行ansible的ping命令,結果以下:
當咱們在hosts文件中再加入主機192.168.133.131,而後執行ping命令,結果以下,思考這是爲何?
出現上面結果表示咱們沒有複製祕鑰到主機192.168.133.131,所以,要安裝以上方式複製祕鑰(ssh-copy-id 192.168.133.131),也能夠經過密碼的方式登陸(每次都要輸密碼,較麻煩且不安全),以下:
按照上面方式,再將祕鑰複製到被控節點192.168.133.132,且將該主機地址寫入ansible的hosts文件。
上面咱們知道如何使用ansible的ping模塊測試某一臺被控節點,那麼如何執行一條命令測試全部被控節點,以下:
也能夠測試其中兩臺,以下:
實際開發中,咱們能夠按照功能將以上被控節點分組,將分組信息寫入ansible的hosts文件,以下:
接下來就能夠對組進行操做了,以下:
多個組的操做,並集關係,以下:
多個組的操做,交集的關係,以下:
多個組的操做,差集的關係,以下:
上面咱們知道ansible有不一樣模塊,還有模塊參數,那麼如何查看模塊的參數,以下命令可查看:
ansible-doc -h # 查看模塊的幫助信息,查看結果以下:
ansible-doc [-l|-F|-s] [options] [-t <plugin type> ] [plugin] -j # 以json的方式返回ansible的全部模塊 -l, --list # 列出全部的ansible的模塊 -s # 以片斷式顯示ansible的幫助信息
注意:系統自帶的ping走的是ICMP協議,而ansible的ping不是ICMP協議,以下可知:
ansible的默認模塊就是命令(command)模塊,使用命令ansible -h 可查看,以下:
查看command模塊的幫助信息,以下:
示例:
[root@localhost ~]# ansible web -a 'ls /' # 在web組下的主機上執行查看根目錄下文件的命令 [root@localhost ~]# ansible web -a 'pwd' # 在web組下的主機上執行查看當前目錄的命令 [root@localhost ~]# ansible web -a 'chdir=/tmp pwd' # 切換目錄執行命令,使用場景是編譯安裝時使用 [root@localhost ~]# ansible web -a 'creates=/tmp pwd' # 用來判斷/tmp目錄是否存在,存在就不執行操做 [root@localhost ~]# ansible web -a 'creates=/data pwd' # 由於data不存在,全部纔會執行pwd命令 [root@localhost ~]# ansible web -a 'removes=/tmp pwd' # 用來判斷tmp目錄是否存在,存在就執行操做 [root@localhost ~]# ansible web -a 'removes=/data pwd' # 由於data不存在,全部纔不會執行 [root@localhost ~]# ansible web -a 'useradd liu' # 爲 web 組內的主機添加用戶 liu
去web組下的主機上查看用戶liu是否建立成功:
[root@localhost ~]# tail -1 /etc/passwd liu:x:1000:1000::/home/liu:/bin/bash [root@localhost ~]# tail -1 /etc/shadow liu:!!:17946:0:99999:7::: [root@localhost ~]# id liu uid=1000(liu) gid=1000(liu) groups=1000(liu)<br>[root@localhost ~]# echo '123' | passwd --stdin liu # 爲新建立的用戶liu設置密碼
既然命令 echo '123' | passwd --stdin liu 能夠爲用戶設置密碼,那麼咱們可否經過ansible爲web組的主機上新建用戶批量設置密碼,以下:
結果是行不通的,查看說明找緣由,以下:
首先查看shell模塊的幫助文檔,以下
示例一:使用shell模塊解決上面提到的利用ansible批量修改web組下主機上用戶liu的密碼,以下:
示例二:批量在遠程主機上執行腳本
[root@localhost ~]# vi a.sh # 在當前目錄下建立shell腳本a.sh,寫入以下內容 [root@localhost ~]# cat a.sh #!/bin/bash mkdir /movies # 在根目錄下建立目錄movies [root@localhost ~]# bash a.sh # 執行腳本 [root@localhost ~]# ls / # 查看是否生成了文件 bin dev home lib64 mnt proc run srv tmp var boot etc lib media opt root sbin sys usr movies # 以上不經過ansible,直接在本地執行腳本的方式
ansible 192.168.133.130 -m shell -a 'bash a.sh' # 執行遠程文件方式一 ansible 192.168.133.130 -m shell -a '/root/a.sh' # 執行遠程文件方式二,文件必須有執行權限(添加執行權限命令爲 chmod +x a.sh) ansible 192.168.133.130 -m shell -a '/root/a.py' # 執行遠端的Python腳本,文件也必須有執行權限
上面學到的shell腳本是遠端有腳本,咱們經過ansible去執行遠端的腳本,可是若是遠端沒有腳本該怎麼辦呢?接下來學習script腳本。
查看script模塊的幫助信息,以下:
ansible web -m script -a '/root/m.sh' # 執行管控機上的文件 ansible web -m script -a 'remove=/root/a.sh /root/m.sh' # 用來判斷被管控機上是否是存在文件/root/a.sh,若是存在,就執行管控機上的文件/root/m.sh,不存在就不執行 ansible web -m script -a 'creates=/root/a.sh /root/m.sh' # 用來判斷被管控機上是否是存在文件/root/a.sh,若是存在,就不執行管控機上的文件/root/m.sh,反之就執行
[root@localhost ~]# ansible-doc -s copy # 查看copy模塊的幫助文檔,有以下參數:
backup # 備份,以時間戳結尾 dest # 目的地址 group # 文件的屬組 mode # 文件的權限 r-4 w-2 x-1 owner # 文件的屬主 src # 源文件
示例:
ansible db -m copy -a 'src=/root/m.sh dest=/tmp/a.sh' # 複製本地文件的到遠程主機,注意:複製到遠程主機後權限發生了改變,即文件的屬主、屬組、同組用戶都沒有了x權限,這是linux的一個安全機制! 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=liu' # 修改文件在遠程機的屬主 ansible web -m copy -a 'src=/etc/init.d dest=/tmp/ mode=755 owner=liu' # 複製本地目錄到遠程主機,若是改變文件的屬性,則文件夾內的文件也會被改變 ansible web -m copy -a 'src=/etc/init.d/ dest=/tmp/ mode=755 owner=liu' # 複製本地目錄內的全部文件到遠程主機 ansible web -m copy -a "content='大弦嘈嘈如急雨,小弦切切如私語\n' dest=/tmp/b.txt" # 直接將文本內容注入到遠程主機的文件中
[root@localhost ~]# ansible-doc -s file # 查看file模塊的幫助文檔
補充知識點:
inode # 硬盤的地址 id # 獲取到的是內存的地址 ln -s a.py b.py # 爲a.py建立軟鏈接 ln a.py c.py # 爲a.py建立硬連接 # 當 源文件變化時,軟鏈接和硬連接文件都會跟着變化,即a.py變化時,b.py和c.py都會跟着變化
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' # 用來刪除文件或者文件夾
查看fetch模塊的幫助文檔,以下圖:
示例:
ansible web -m fetch -a 'src=/var/log/cron dest=/tmp' # 下載被控節點的文件,每臺機器建立一個文件夾,並保留原來的目錄結構