Linux-ansible常用模組
阿新 • • 發佈:2022-05-16
常用模組幫助文件參考:
https://docs.ansible.com/ansible/2.9/modules/modules_by_category.html
Command 模組
- 功能:在遠端主機執行命令,此為預設模組,可忽略 -m 選項
- 注意:此命令不支援 $VARNAME < > | ; & 等,可能用shell模組實現
- 注意:此模組不具有冪等性
[root@ansible ~]#ansible websrvs -m command -a 'chdir=/etc cat centos-release' 10.0.0.7 | CHANGED | rc=0 >> CentOS Linux release7.7.1908 (Core) 10.0.0.8 | CHANGED | rc=0 >> CentOS Linux release 8.1.1911 (Core) [root@ansible ~]#ansible websrvs -m command -a 'chdir=/etc creates=/data/f1.txt cat centos-release' 10.0.0.7 | CHANGED | rc=0 >> CentOS Linux release 7.7.1908 (Core) 10.0.0.8 | SUCCESS | rc=0 >> skipped, since /data/f1.txt exists [root@ansible~]#ansible websrvs -m command -a 'chdir=/etc removes=/data/f1.txt cat centos-release' 10.0.0.7 | SUCCESS | rc=0 >> skipped, since /data/f1.txt does not exist 10.0.0.8 | CHANGED | rc=0 >> CentOS Linux release 8.1.1911 (Core)
Shell 模組
- 功能:和command相似,用shell執行命令,支援各種符號,比如:*,$, >
- 注意:此模組不具有冪等性
範例:
[root@ansible ~]#ansible websrvs -m shell -a "echo $HOSTNAME" 10.0.0.7 | CHANGED | rc=0 >> ansible 10.0.0.8 | CHANGED | rc=0 >> ansible [root@ansible ~]#ansible websrvs -m shell -a 'echo $HOSTNAME' 10.0.0.7 | CHANGED | rc=0 >> centos7.wangxiaochun.com 10.0.0.8 | CHANGED | rc=0 >> centos8.localdomain [root@ansible ~]#ansible websrvs -m shell -a 'echo centos | passwd --stdin wang' 10.0.0.7 | CHANGED | rc=0 >> Changing password for user wang. passwd: all authentication tokens updated successfully. 10.0.0.8 | CHANGED | rc=0 >> Changing password for user wang. passwd: all authentication tokens updated successfully. [root@ansible ~]#ansible websrvs -m shell -a 'ls -l /etc/shadow' 10.0.0.7 | CHANGED | rc=0 >> ---------- 1 root root 889 Mar 2 14:34 /etc/shadow 10.0.0.8 | CHANGED | rc=0 >> ---------- 1 root root 944 Mar 2 14:34 /etc/shadow [root@ansible ~]#ansible websrvs -m shell -a 'echo hello > /data/hello.log' 10.0.0.7 | CHANGED | rc=0 >> 10.0.0.8 | CHANGED | rc=0 >> [root@ansible ~]#ansible websrvs -m shell -a 'cat /data/hello.log' 10.0.0.7 | CHANGED | rc=0 >> hello 10.0.0.8 | CHANGED | rc=0 >> hello
- 注意:呼叫bash執行命令 類似 cat /tmp/test.md | awk -F'|' '{print $1,$2}' &> /tmp/example.txt 這些 複雜命令,即使使用shell也可能會失敗,解決辦法:寫到指令碼時,copy到遠端,執行,再把需要的結果 拉回執行命令的機器
Script 模組
- 功能:在遠端主機上執行ansible伺服器上的指令碼(無需執行許可權)
- 注意:此模組不具有冪等性
範例:
ansible websrvs -m script -a /data/test.sh
Copy 模組
- 功能:從ansible伺服器主控端複製檔案到遠端主機
- 注意: src=file 如果是沒指明路徑,則為當前目錄或當前目錄下的files目錄下的file檔案
#如目標存在,預設覆蓋,此處指定先備份 ansible websrvs -m copy -a "src=/root/test1.sh dest=/tmp/test2.sh owner=wang mode=600 backup=yes" #指定內容,直接生成目標檔案 ansible websrvs -m copy -a "content='test line1\ntest line2\n' dest=/tmp/test.txt" #複製/etc目錄自身,注意/etc/後面沒有/ ansible websrvs -m copy -a "src=/etc dest=/backup" #複製/etc/下的檔案,不包括/etc/目錄自身,注意/etc/後面有/ ansible websrvs -m copy -a "src=/etc/ dest=/backup"
Get_url 模組
- 功能: 用於將檔案從http、https或ftp下載到被管理機節點上
常用引數如下:
url: 下載檔案的URL,支援HTTP,HTTPS或FTP協議 dest: 下載到目標路徑(絕對路徑),如果目標是一個目錄,就用伺服器上面檔案的名稱,如果目標設定了名 稱就用目標設定的名稱 owner:指定屬主 group:指定屬組 mode:指定許可權 force: 如果yes,dest不是目錄,將每次下載檔案,如果內容改變,替換檔案。如果否,則只有在目標不存 在時才會下載該檔案 checksum: 對目標檔案在下載後計算摘要,以確保其完整性 示例: checksum="sha256:D98291AC[...]B6DC7B97", checksum="sha256:http://example.com/path/sha256sum.txt" url_username: 用於HTTP基本認證的使用者名稱。 對於允許空密碼的站點,此引數可以不使用 `url_password' url_password: 用於HTTP基本認證的密碼。 如果未指定`url_username'引數,則不會使用 `url_password'引數 validate_certs:如果“no”,SSL證書將不會被驗證。 適用於自簽名證書在私有網站上使用 timeout: URL請求的超時時間,秒為單位
範例:
[root@ansible ~]#ansible websrvs -m get_url -a 'url=http://nginx.org/download/nginx-1.18.0.tar.gz dest=/usr/local/src/nginx.tar.gz checksum="md5:b2d33d24d89b8b1f87ff5d251aa27eb8"'
Fetch 模組
- 功能:從遠端主機提取檔案至ansible的主控端,copy相反,目前不支援目錄
範例:
ansible websrvs -m fetch -a 'src=/root/test.sh dest=/data/scripts'
[root@ansible ~]#ansible all -m fetch -a 'src=/etc/redhat-release dest=/data/os' [root@ansible ~]#tree /data/os/ /data/os/ ├── 10.0.0.6 │ └── etc │ └── redhat-release ├── 10.0.0.7 │ └── etc │ └── redhat-release └── 10.0.0.8 └── etc └── redhat-release 6 directories, 3 files
File 模組
- 功能:設定檔案屬性,建立軟連結等
範例:
#建立空檔案 ansible all -m file -a 'path=/data/test.txt state=touch' ansible all -m file -a 'path=/data/test.txt state=absent' #absent : 刪除 ansible all -m file -a "path=/root/test.sh owner=wang mode=755" #建立目錄 ansible all -m file -a "path=/data/mysql state=directory owner=mysql group=mysql" #建立軟連結 ansible all -m file -a 'src=/data/testfile path|dest|name=/data/testfile-link state=link' #建立目錄 ansible all -m file -a 'path=/data/testdir state=directory' #遞迴修改目錄屬性,但不遞迴至子目錄 ansible all -m file -a "path=/data/mysql state=directory owner=mysql group=mysql" #遞迴修改目錄及子目錄的屬性 ansible all -m file -a "path=/data/mysql state=directory owner=mysql group=mysql recurse=yes"
stat 模組
- 功能:檢查檔案或檔案系統的狀態
- 注意:對於Windows目標,請改用win_stat模組
選項:
path:檔案/物件的完整路徑(必須)
常用的返回值判斷:
exists: 判斷是否存在
isuid: 呼叫使用者的ID與所有者ID是否匹配
範例:
[root@centos7-liyj ~]#ansible 127.0.0.1 -m stat -a 'path=/etc/passwd' 127.0.0.1 | SUCCESS => { "changed": false, "stat": { "atime": 1652698111.826, "attr_flags": "", "attributes": [], "block_size": 4096, "blocks": 8, "charset": "us-ascii", "checksum": "d99e68865343f59b1512f3d313d1eb718ef9dd41", "ctime": 1650287592.0300713, "dev": 2050, "device_type": 0, "executable": false, "exists": true, "gid": 0, "gr_name": "root", "inode": 135574040, "isblk": false, "ischr": false, "isdir": false, "isfifo": false, "isgid": false, "islnk": false, "isreg": true, "issock": false, "isuid": false, "mimetype": "text/plain", "mode": "0644", "mtime": 1650287592.0290713, "nlink": 1, "path": "/etc/passwd", "pw_name": "root", "readable": true, "rgrp": true, "roth": true, "rusr": true, "size": 953, "uid": 0, "version": "1695877110", "wgrp": false, "woth": false, "writeable": true, "wusr": true, "xgrp": false, "xoth": false, "xusr": false } }例子
unarchive 模組
- 功能:解包解壓縮
- 實現有兩種用法:
- 將ansible主機上的壓縮包傳到遠端主機後解壓縮至特定目錄,設定copy=yes,此為預設值,可省略
- 將遠端主機上的某個壓縮包解壓縮到指定路徑下,設定copy=no
常見引數:
copy:預設為yes,當copy=yes,拷貝的檔案是從ansible主機複製到遠端主機上,如果設定為copy=no, 會在遠端主機上尋找src原始檔 remote_src:和copy功能一樣且互斥,yes表示在遠端主機,不在ansible主機,no表示檔案在ansible 主機上 src:源路徑,可以是ansible主機上的路徑,也可以是遠端主機(被管理端或者第三方主機)上的路徑,如果 是遠端主機上的路徑,則需要設定copy=no dest:遠端主機上的目標路徑 mode:設定解壓縮後的檔案許可權
範例:
ansible all -m unarchive -a 'src=/data/foo.tgz dest=/var/lib/foo owner=wang group=bin' ansible all -m unarchive -a 'src=/tmp/foo.zip dest=/data copy=no mode=0777' ansible all -m unarchive -a 'src=https://example.com/example.zip dest=/data copy=no' ansible websrvs -m unarchive -a 'src=https://releases.ansible.com/ansible/ansible-2.1.6.0-0.1.rc1.tar.gz dest=/data/ owner=root remote_src=yes' ansible websrvs -m unarchive -a 'src=http://nginx.org/download/nginx1.18.0.tar.gz dest=/usr/local/src/ copy=no'
Archive 模組
- 功能:打包壓縮儲存在被管理節點
範例:
ansible websrvs -m archive -a 'path=/var/log/ dest=/data/log.tar.bz2 format=bz2 owner=wang mode=0600'
Hostname 模組
- 功能:管理主機名
範例:
ansible node1 -m hostname -a "name=websrv" ansible 10.0.0.18 -m hostname -a 'name=node18.magedu.com'
Cron 模組
- 功能:計劃任務
- 支援時間:minute,hour,day,month,weekday
範例:
#備份資料庫指令碼 [root@centos8 ~]#cat /root/mysql_backup.sh #!/bin/bash mysqldump -A -F --single-transaction --master-data=2 -q -uroot |gzip > /data/mysql_`date +%F_%T`.sql.gz #建立任務 ansible 10.0.0.8 -m cron -a 'hour=2 minute=30 weekday=1-5 name="backup mysql" job=/root/mysql_backup.sh' ansible websrvs -m cron -a "minute=*/5 job='/usr/sbin/ntpdate ntp.aliyun.com &>/dev/null' name=Synctime" #禁用計劃任務 ansible websrvs -m cron -a "minute=*/5 job='/usr/sbin/ntpdate 172.20.0.1 &>/dev/null' name=Synctime disabled=yes" #啟用計劃任務 ansible websrvs -m cron -a "minute=*/5 job='/usr/sbin/ntpdate 172.20.0.1 &>/dev/null' name=Synctime disabled=no" #刪除任務 ansible websrvs -m cron -a "name='backup mysql' state=absent" ansible websrvs -m cron -a 'state=absent name=Synctime'
Yum 和 Apt 模組
- 功能:
- yum 管理軟體包,只支援RHEL,CentOS,fedora,不支援Ubuntu其它版本
- apt 模組管理 Debian 相關版本的軟體包
範例:
ansible websrvs -m yum -a 'name=httpd state=present' #安裝 ansible websrvs -m yum -a 'name=nginx state=present enablerepo=epel' #啟用epel源 進行安裝 ansible websrvs -m yum -a 'name=* state=lastest exclude=kernel*,foo*' #升級除 kernel和foo開頭以外的所有包 ansible websrvs -m yum -a 'name=httpd state=absent' #刪除 [root@ansible ~]#ansible websrvs -m yum -a 'name=sl,cowsay'
yum_repository 模組
- name: Add multiple repositories into the same file (1/2) yum_repository: name: epel description: EPEL YUM repo file: external_repos baseurl: https://download.fedoraproject.org/pub/epel/$releasever/$basearch/ gpgcheck: no - name: Add multiple repositories into the same file (2/2) yum_repository: name: rpmforge description: RPMforge YUM repo file: external_repos baseurl: http://apt.sw.be/redhat/el7/en/$basearch/rpmforge mirrorlist: http://mirrorlist.repoforge.org/el7/mirrors-rpmforge enabled: no - name: Remove repository from a specific repo file yum_repository: name: epel file: external_repos state: absent
Service 模組
- 功能:管理服務
範例:
ansible all -m service -a 'name=httpd state=started enabled=yes' ansible all -m service -a 'name=httpd state=stopped' ansible all -m service -a 'name=httpd state=reloaded' ansible all -m shell -a "sed -i 's/^Listen 80/Listen 8080/' /etc/httpd/conf/httpd.conf" ansible all -m service -a 'name=httpd state=restarted'
User 模組
- 功能:管理使用者
範例:
#建立使用者 ansible all -m user -a 'name=user1 comment="test user" uid=2048 home=/app/user1 group=root'
ansible all -m user -a 'name=nginx comment=nginx uid=88 group=nginx groups="root,daemon" shell=/sbin/nologin system=yes create_home=no home=/data/nginx non_unique=yes'
#remove=yes表示刪除使用者及家目錄等資料,預設remove=no ansible all -m user -a 'name=nginx state=absent remove=yes'
#生成123456加密的密碼 ansible localhost -m debug -a "msg={{ '123456'| password_hash('sha512','salt')}}" localhost | SUCCESS => { "msg": "$6$salt$MktMKPZJ6t59GfxcJU20DwcwQzfMvOlHFVZiOVD71w." }
#用上面建立的密碼建立使用者 ansible websrvs -m user -a 'name=test password="$6$salt$MktMKPZJ6t59GfxcJU20DwcwQzfMvOlHFVZiOVD71w."'
#建立使用者test,並生成4096bit的私鑰 ansible websrvs -m user -a 'name=test generate_ssh_key=yes ssh_key_bits=4096 ssh_key_file=.ssh/id_rsa'
Group 模組
- 功能:管理組
範例:
#建立組 ansible websrvs -m group -a 'name=nginx gid=88 system=yes' #刪除組 ansible websrvs -m group -a 'name=nginx state=absent'
Lineinfile 模組
- ansible在使用sed進行替換時,經常會遇到需要轉義的問題,而且ansible在遇到特殊符號進行替換時, 存在問題,無法正常進行替換 。其實在ansible自身提供了兩個模組:lineinfile模組和replace模組,可 以方便的進行替換
- 一般在ansible當中去修改某個檔案的單行進行替換的時候需要使用lineinfile模組
- regexp引數 :使用正則表示式匹配對應的行,當替換文字時,如果有多行文字都能被匹配,則只有最 後面被匹配到的那行文字才會被替換,當刪除文字時,如果有多行文字都能被匹配,這麼這些行都會被 刪除。
- 如果想進行多行匹配進行替換需要使用replace模組
- 功能:相當於sed,可以修改檔案內容
範例:
ansible websrvs -m lineinfile -a "path=/etc/httpd/conf/httpd.conf regexp='^Listen' line='Listen 80'" ansible all -m lineinfile -a "path=/etc/selinux/config regexp='^SELINUX=' line='SELINUX=disabled'" ansible all -m lineinfile -a 'dest=/etc/fstab state=absent regexp="^#"'
Replace 模組
- 該模組有點類似於sed命令,主要也是基於正則進行匹配和替換,建議使用
範例:
ansible all -m replace -a "path=/etc/fstab regexp='^(UUID.*)' replace='#\1'" ansible all -m replace -a "path=/etc/fstab regexp='^#(UUID.*)' replace='\1'"
SELinux 模組
- 該模組管理 SELInux 策略
範例:
[root@ansible ~]#ansible 10.0.0.8 -m selinux -a 'state=disabled' [WARNING]: SELinux state temporarily changed from 'enforcing' to 'permissive'. State change will take effect next reboot. 10.0.0.8 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": true, "configfile": "/etc/selinux/config", "msg": "Config SELinux state changed from 'enforcing' to 'disabled'", "policy": "targeted", "reboot_required": true, "state": "disabled" } [root@centos8 ~]#grep -v '#' /etc/selinux/config SELINUX=disabled SELINUXTYPE=targeted [root@centos8 ~]#getenforce Permissive
reboot 模組
[root@ansible ~]#ansible websrvs -m reboot
mount 掛載和解除安裝
- 功能: 掛載和解除安裝檔案系統
範例:
#臨時掛載 mount websrvs -m mount -a 'src="UUID=b3e48f45-f933-4c8e-a700-22a159ec9077" path=/home fstype=xfs opts=noatime state=present' #臨時取消掛載 mount websrvs -m mount -a 'path=/home fstype=xfs opts=noatime state=unmounted' #永久掛載 ansible websrvs -m mount -a 'src=10.0.0.8:/data/wordpress path=/var/www/html/wpcontent/uploads opts="_netdev" state=mounted' #永久解除安裝 ansible websrvs -m mount -a 'src=10.0.0.8:/data/wordpress path=/var/www/html/wpcontent/uploads state=absent'
Setup 模組
- 功能: setup 模組來收集主機的系統資訊,這些 facts 資訊可以直接以變數的形式使用,但是如果主機 較多,會影響執行速度
- 可以使用 gather_facts: no 來禁止 Ansible 收集 facts 資訊
範例:
ansible all -m setup ansible all -m setup -a "filter=ansible_nodename" ansible all -m setup -a "filter=ansible_hostname" ansible all -m setup -a "filter=ansible_domain" ansible all -m setup -a "filter=ansible_memtotal_mb" ansible all -m setup -a "filter=ansible_memory_mb" ansible all -m setup -a "filter=ansible_memfree_mb" ansible all -m setup -a "filter=ansible_os_family" ansible all -m setup -a "filter=ansible_distribution_major_version" ansible all -m setup -a "filter=ansible_distribution_version" ansible all -m setup -a "filter=ansible_processor_vcpus" ansible all -m setup -a "filter=ansible_all_ipv4_addresses" ansible all -m setup -a "filter=ansible_architecture" ansible all -m setup -a "filter=ansible_uptime_seconds" ansible all -m setup -a "filter=ansible_processor*" ansible all -m setup -a 'filter=ansible_env'
[root@ansible ~]#ansible all -m setup -a 'filter=ansible_python_version' 10.0.0.7 | SUCCESS => { "ansible_facts": { "ansible_python_version": "2.7.5", "discovered_interpreter_python": "/usr/bin/python" }, "changed": false } 10.0.0.6 | SUCCESS => { "ansible_facts": { "ansible_python_version": "2.6.6", "discovered_interpreter_python": "/usr/bin/python" }, "changed": false } 10.0.0.8 | SUCCESS => { "ansible_facts": { "ansible_python_version": "3.6.8", "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": false } [root@ansible ~]#範例
debug 模組
- 此模組可以用於輸出資訊,並且通過 msg 定製輸出的資訊內容
- 注意: msg後面的變數有時需要加 " " 引起來
範例: debug 模組預設輸出Hello world
[root@ansible ~]#ansible 10.0.0.18 -m debug 10.0.0.18 | SUCCESS => { "msg": "Hello world!" } [root@ansible ansible]#cat debug.yml --- - hosts: websrvs tasks: - name: output Hello world debug: #預設沒有指定msg,預設輸出"Hello world!" [root@ansible ansible]#ansible-playbook debug.yml PLAY [websrvs] ******************************************************************************** *************************************** TASK [Gathering Facts] ******************************************************************************** ******************************* ok: [10.0.0.7] ok: [10.0.0.8] TASK [output variables] ******************************************************************************** ****************************** ok: [10.0.0.7] => { "msg": "Hello world!" } ok: [10.0.0.8] => { "msg": "Hello world!" } PLAY RECAP ******************************************************************************** ******************************************* 10.0.0.7 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 10.0.0.8 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0holleword