Ansible 常用模塊(一)


一、Ansible簡介

Ansible是新出現的自動化運維工具,基於python開發,集合了眾多運維工具(puppet(ruby)、cfengine、chef、func、fabric、)的優點,實現了批量系統配置、批量程序部署、批量運行命令等功能。

特性:

  1. no agent:不需要在被管控主機上安裝任何軟件

  2. no server: 無服務器端,使用時直接運行命令即可

  3. modules in any languages: 基於模塊工作,可使用任意語言開發模塊。

  4. Yaml,not code:使用yaml語言定制腳本playbook。

  5. Ssh by default: 基於ssh工作。

優點:

  1. 輕量級,無需在客戶端安裝agent,更新時,只需在操作機上進行一次更新即可。

  2. 批量任務執行可以寫成腳本,而且不用分發到遠程就可以執行。

  3. 使用python編寫,維護簡單,ruby語法過於復雜。

  4. 支持sudo

二、Ansible的基礎架構圖

ansible core ansible 自身核心模塊

host inventory: 主機庫,定義可管控的主機列表

connection plugins: 連接插件,一般默認基於 ssh 協議連接

modulescore modules ( 自帶模塊 ) custom modules ( 自定義模塊 )

playbooks :劇本,按照所設定編排的順序執行完成安排任務

三、安裝Ansible

3.1 Ansible需要epel源來安裝

# uname -r
 3.10.0-327.el7.x86_64
# cat /etc/redhat-release 
 CentOS Linux release 7.2.1511 (Core) 

# yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm -y
# yum install ansible -y

3.2 創建密鑰,並分發公鑰到所有的主機

# ssh-keygen -t rsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1 
# ssh-copy-id -i .ssh/id_dsa.pub root@192.168.5.71
# ssh-copy-id -i .ssh/id_dsa.pub root@192.168.5.72
# ssh-copy-id -i .ssh/id_dsa.pub root@192.168.5.73

 3.3 配置Ansible主機組清單

# vim /etc/ansible/hosts
[test]
192.168.5.71
192.168.5.72
192.168.5.73

主機清單可以包含主機清單,例:
[web]
192.168.5.71
192.168.5.72
[mysql]
192.168.5.73

[online:children]
web
mysql

也可以使用帳號密碼的方式:
[test]
192.168.5.71 ansible_ssh_user=root ansible_ssh_pass=mypawd ansible_ssh_port=22

3.4 查看主機清單

# ansible test --list-hosts
  hosts (8):
    192.168.5.71
    192.168.5.72
    192.168.5.73

四、Ansible ping模塊

ansible 主組組 使用模塊 ping模塊
# ansible test -m ping
192.168.5.73 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
192.168.5.72 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
192.168.5.71 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}

五、Ansible yum模塊

基於yum機制,對遠程主機管理程序包

name                              --- 必須參數,用於指定需要管理的軟件包,比如 nginx。
state                               --- 用於指定軟件包的狀態有installed、latest、absent、removed,其中 installed 與present 等效,latest 表示安裝 yum 中最新的版本,absent 和 removed 等效,表示刪除對應的軟件包。
disable_gpg_check        --- 用於禁用對 rpm 包的公鑰 gpg 驗證。默認值為 no,表示不禁用驗證,設置為 yes 表示禁用驗證,即不驗證包,直接安裝。在對應的 yum 源沒有開啟 gpg 驗證的情況下,需要將此參數的值設置為 yes,否則會報錯而無法進行安裝。
enablerepo                     --- 用於指定安裝軟件包時臨時啟用的 yum 源。假如你想要從A源中安裝軟件,但是你不確定A源是否啟用了,你可以在安裝軟件包時將此參數的值設置為 yes,即使A源的設置是未啟用,也可以在安裝軟件包時臨時啟用A源。
disablerepo                    --- 用於指定安裝軟件包時臨時禁用的 yum 源。某些場景下需要此參數,比如,當多個 yum 源中同時存在要安裝的軟件包時,你可以使用此參數臨時禁用某個源,這樣設置后,在安裝軟件包時則不會從對應的源中選擇安裝包。

enablerepo 參數和 disablerepo 參數可以同時使用。

# ansible test -m yum -a 'name=net-tools state=installed'

六、Ansible service模塊

用來管理遠程主機上的服務的模塊

 name          --- 被管理的服務名稱(/etc/init.d)

 state           --- startd | stopped | restarted | reloaded  表示啟動、停止、重啟、重新加載。

 enabled      --- yes|no 表示要不要設定該服務開機自啟。

 runleve       ---  如果設定了enabled開機自動啟動,則要定義在哪些運行級別下自動啟動。

# ansible test -m service -a 'name=nginx state=started enabled=yes'

七、Ansible command模塊

執行命令模塊,不支持管道

# ansible test -m command -a 'w'
192.168.5.73 | CHANGED | rc=0 >>
 16:13:01 up  2:35,  2 users,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     tty1                      13:37    2:34m  0.08s  0.08s -bash
root     pts/0    192.168.5.55     16:13    0.00s  0.11s  0.01s w

192.168.5.72 | CHANGED | rc=0 >>
 16:13:01 up  2:36,  1 user,  load average: 0.08, 0.06, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    192.168.5.55     16:13    0.00s  0.11s  0.01s w

192.168.5.71 | CHANGED | rc=0 >>
 16:13:01 up  2:38,  2 users,  load average: 0.04, 0.08, 0.08
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     tty1                      13:34    2:21m  0.73s  0.73s -bash
root     pts/0    192.168.5.55     16:13    0.00s  0.08s  0.00s w

# 默認使用command模板,可以不加 -m command參數 # ansible test
-a 'cat /etc/hosts'

八、Ansible shell模塊

被管理端執行命令支持重定向,管道

# ansible test -m shell -a 'rpm -qa | grep nginx'
# ansible test -m shell -a 'echo password1! | passwd --stdin root'

九、Ansible copy模塊

拷貝ansible管理端的文件到遠程主機的指定位置

src              --- 推送數據的源文件信息
dest            --- 推送數據的目標路徑
backup        --- 對推送傳輸過去的文件,進行備份
content       --- 直接批量在被管理端文件中添加內容
group         --- 將本地文件推送到遠端,指定文件屬組信息
owner         --- 將本地文件推送到遠端,指定文件屬主信息
mode          --- 將本地文件推送到遠端,指定文件權限信息
remote_src ---如果是no它將在ansible主機中搜索src,如果是yes,src將是遠程/目標主機的src目錄

# ansible test -m copy -a 'src=/etc/resolv.conf dest=/etc/resolv.conf'
# ansible test -m copy -a 'content="hehe" dest=/tmp/abc.txt owner=root group=root mode=644 backup=yes'

十、Ansible Scripts模塊

在本地運行模塊,等同於在遠程執行,不需要將腳本文件進行推送目標主機執行

# mkdir scripts
# vim scripts/yum.sh
# ansible test -m script -a '/root/scripts/yum.sh'

十一、Ansible File模塊

一般用於創建目錄和創建文件

path          --- 指定遠程主機目錄或文件信息
recurse     --- 遞歸授權
state         ---
    directory   --- 在遠端創建目錄
    touch        --- 在遠端創建文件
    link           --- link或hard表示創建鏈接文件
    absent      --- 表示刪除文件或目錄
    mode        --- 設置文件或目錄權限
    owner       --- 設置文件或目錄屬主信息
    group       --- 設置文件或目錄屬組信息

# 在遠端創建/backup目錄
# ansible test -m file -a 'path=/backup state=directory'
192.168.5.72 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "gid": 0, 
    "group": "root", 
    "mode": "0755", 
    "owner": "root", 
    "path": "/backup", 
    "size": 6, 
    "state": "directory", 
    "uid": 0
}
......

# ansible test -a 'ls -ld /backup'

192.168.5.72 | CHANGED | rc=0 >>
drwxr-xr-x 2 root root 6 Jul 11 09:52 /backup

# 創建文件,默認touch的權限就是root和644,但是如果文件夾存在則不會創建,然后權限不會變成你想要的。
# ansible test -m file -a 'path=/tmp/connie state=touch mode=644 owner=root group=root'
192.168.5.73 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "dest": "/tmp/connie", 
    "gid": 0, 
    "group": "root", 
    "mode": "0644", 
    "owner": "root", 
    "size": 0, 
    "state": "file", 
    "uid": 0
}

# 遞歸修改權限,將子目錄及文件一並修改
# ansible test -m file -a 'path=/backup state=directory owner=root group=root recurse=yes'

# 創建軟鏈接
# ansible test -m file -a 'src=/usr/local/mysql-5.6.32 path=/usr/local/mysql state=link'

十二、Ansible Group模塊

用來創建用戶組

name            --- 指定創建的組名
gid                --- 指定組的gid
state
    absent      --- 移除遠端主機的組
    present     --- 創建遠端主機的組(默認)

# 創建組指定GID
# ansible test -m group -a 'name=connie gid=1981'

十三、Ansible User模塊

創建指定的用戶

uid                    --- 指定用戶的uid
group                --- 指定用戶組名稱,默認為空
groups              --- 指定附加組名稱
password          --- 給用戶添加密碼
shell                  --- 指定用戶登錄shell
create_home     --- 是否創建家目錄

# 創建connie用戶並加入用戶組connie 設置UID為1981,禁止登錄,不創建家目錄
# ansible test -m user -a 'name=connie group=connie uid=1981 shell=/sbin/nologin create_home=no'
192.168.5.72 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "comment": "", 
    "create_home": false, 
    "group": 1981, 
    "home": "/home/connie", 
    "name": "connie", 
    "shell": "/sbin/nologin", 
    "state": "present", 
    "system": false, 
    "uid": 1981
}
......

# 創建加密的登錄用戶,password參數必須要是經過加密的字符串。-1是MD5加密
# echo 'linzfn' | openssl passwd -1 -stdin
$1$FNGUGf3H$5rfXpwXqlkL9HDC88uWRA1
# ansible test -m user -a 'name=leon password="$1$FNGUGf3H$5rfXpwXqlkL9HDC88uWRA1"'
192.168.5.72 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "comment": "", 
    "create_home": true, 
    "group": 1982, 
    "home": "/home/leon", 
    "name": "leon", 
    "password": "NOT_LOGGING_PASSWORD", 
    "shell": "/bin/bash", 
    "state": "present", 
    "system": false, 
    "uid": 1982
}

十四、Ansible Cron模塊

使用cront服務,如果填寫的時候不寫分時日月周,則默認都是'*'

# 設置定時任務注釋信息,防止重復,name設定
# ansible test -m cron -a 'name="ntpdate" minute=*/5 hour=* month=* weekday=* job="/usr/sbin/ntpdate time1.aliyun.com"'
192.168.5.72 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "envs": [], 
    "jobs": [
        "ntpdate"
    ]
}

# 登錄192.168.5.72查看定時任務
# crontab -l
#Ansible: ntpdate
*/5 * * * * /usr/sbin/ntpdate time1.aliyun.com

# 按名稱刪除定時任務
# ansible test -m cron -a 'name="ntpdate" state=absent'

# 注釋相應定時任務,使定時任務失效    
# ansible test -m cron -a 'name="ntpdate" minute=*/5 hour=* month=* weekday=* job="/usr/sbin/ntpdate time1.aliyun.com" disabled=yes'

十五、Ansible Mount模塊

present        --- 開機掛載,僅將掛載配置寫入/etc/fstab
mounted       --- 掛載設備,並將配置寫入/etc/fstab
unmounted   --- 卸載設備,不會清除/etc/fstab寫入的配置
absent          --- 卸載設備,會清理/etc/fstab寫入的配置

# 掛載192.168.5.80:/data目錄到test組中的主機
# ansible test -m mount -a "src=192.168.5.80:/data path=/data fstype=nfs opts=defaults state=mounted"

# 卸載,會直接刪除/data目錄,掛載的時候也不需要創建目標的/data目錄
# ansible test -m mount -a "src=192.168.5.80:/data path=/data fstype=nfs opts=defaults state=absent"

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM