初識ansible

一 . 初識ansible

1 . 準備工做: 

  準備四臺乾淨的虛擬機, node

  192.168.133.129(主控節點,下面三個爲被控節點)python

  192.168.133.130linux

  192.168.133.131web

  192.168.133.132shell

二、安裝ansible(只有主控節點安裝,即地址爲192.168.133.129的服務器安裝)

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的機器
# ......

3. ansible 與 saltstack對比

相同點: 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會好不少)

四、ansible 鏈接並控制被控節點

ssh 的認證方式

  - 密碼鏈接: 即ssh root@192.168.xx.xx  回車而後輸入密碼

  - 祕鑰鏈接

ssh 祕鑰鏈接登陸方式以下:

ssh-keygen       #用來生成ssh的密鑰對,一路回車
ssh-copy-id  192.168.133.130     # 複製祕鑰到遠程主機,回車後輸入"yes",再回車輸入遠程主機登陸密碼
ssh 192.168.133.130      # 而後就能夠經過此命令登陸遠程主機了

五、ansible的命令格式

咱們以前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協議,以下可知:

 

 

 

 

 

七、命令相關模塊(command,shell,script) 

7.一、command模塊

   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組的主機上新建用戶批量設置密碼,以下:

 

 

 

 

 

 

結果是行不通的,查看說明找緣由,以下:

 

 

 

 

 

7.二、shell模塊

首先查看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腳本,文件也必須有執行權限

 

7.三、script模塊

上面學到的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,反之就執行

八、文件相關模塊(copy,file,fetch)

8.一、copy模塊

[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" # 直接將文本內容注入到遠程主機的文件中

8.二、file模塊

[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' # 用來刪除文件或者文件夾

8.三、fetch模塊

  查看fetch模塊的幫助文檔,以下圖:

 

 

 

 

 

 

 

 

 

 

示例:

 

ansible web -m fetch -a 'src=/var/log/cron dest=/tmp'   # 下載被控節點的文件,每臺機器建立一個文件夾,並保留原來的目錄結構
相關文章
相關標籤/搜索