ansible官網模塊自助


ansible命令模塊
ping模塊
功能:檢測
測試連接可通性,沒有參數。通的話返回pong
ansible all -m ping
setup模塊
功能:獲取主機信息(綠色,紅色)
--tree :將所有主機的輸出信息保存到/tmp/目錄下,以/etc/ansible/hosts里的主機名為文件名
filter :過濾關鍵字
ansible all -m setup -a 'filter=ansible_distribution_version' --tree /tmp/xx
#企業需求
1.根據不同主機'不同IP'創建對應IP的目錄
2.根據不同主機不同'主機名'創建對應主機名的目錄
3.自動化運維平台需要自動獲取到主機的'IP地址,內存信息,磁盤信息,主機名'...等
4.如果安裝數據庫,分配內存為物理內存的80%,此時有3台不同物理內存的機器2G、4G、16G
寫一個playbook的情況下,我需要獲取到對應主機的內存並作出計算,寫判斷。
#查看主機所有詳細信息(命令行和劇本中獲取的格式不同)
[root@m01 ~]# ansible web01 -m setup
#獲取ip
[root@m01 ~]# ansible web01 -m setup -a 'filter=ansible_default_ipv4'
#獲取主機名
[root@m01 ~]# ansible web01 -m setup -a 'filter=ansible_fqdn'
#獲取內存信息
[root@m01 ~]# ansible web01 -m setup -a 'filter=ansible_memory_mb'
#獲取磁盤信息
[root@m01 ~]# ansible web01 -m setup -a 'filter=ansible_devices'
#其他信息參數
ansible_all_ipv4_addresses:'僅顯示ipv4的信息'。
ansible_devices:僅顯示磁盤設備信息。
ansible_distribution:'顯示是什么系統',例:centos,suse等。
ansible_distribution_major_version:顯示是系統主版本。
ansible_distribution_version:僅顯示系統版本。
ansible_machine:顯示系統類型,例:32位,還是64位。
ansible_eth0:'僅顯示eth0的信息'。
ansible_hostname:'僅顯示主機名。
ansible_kernel:僅顯示內核版本。
ansible_lvm:顯示lvm相關信息。
ansible_memtotal_mb:'顯示系統總內存'。
ansible_memfree_mb:顯示可用系統內存。
ansible_memory_mb:詳細顯示內存情況。
ansible_swaptotal_mb:顯示總的swap內存。
ansible_swapfree_mb:顯示swap內存的可用內存。
ansible_mounts:'顯示系統磁盤掛載情況'。
ansible_processor:'顯示cpu個數(具體顯示每個cpu的型號)''。
ansible_processor_vcpus:顯示cpu個數(只顯示總的個數)
#取ip
[root@m01 ~]# ansible web01 -m setup -a 'filter=ansible_default_ipv4'|awk -F '["]' '/"address"/{print $4}'
10.0.0.7
[root@m01 ~]# ansible web_group -m setup -a 'filter=ansible_default_ipv4'|awk -F '["]' '/"address"/{print $4}'
10.0.0.7
10.0.0.9
10.0.0.8
#取主機名
[root@m01 ~]# ansible web01 -m setup -a 'filter=ansible_fqdn'|awk -F '["]' '/fqdn/{print $4}'
web01
command模塊
功能:遠程執行簡單的命令
默認模塊(可省略不指定)
作用:執行系統命令(linux windows),不支持變量,"<",">","|",";","&"等符號
[root@m01 ~]# ansible web_group -a 'ls'
[root@m01 ~]# ansible web_group -a 'df -h'
cron模塊
功能:添加定時任務
#使用crontab之前最好同步時間(注意單引號和雙引號的作用)(*有時候需要加'')
[root@m01 ~]# ansible '*' -m cron -a "name=同步時間 minute=*/5 job='/usr/sbin/ntpdate time1.aliyun.com &>/dev/null'"
ansible-doc cron
ansible db -m cron -a 'minute="" hour="" day="" month="" weekday="" job="" name="(必須填寫)" state='
1、定時設置指定值的寫入即可,沒有設置的要刪除
2、name必須寫(創建定時任務或者刪除定時任務的 標志,不能修改注釋)(這一點和yum倉庫名一樣)
3、state有兩個狀態:present(添加(默認值))or absent(移除)
#添加定時任務
ansible db -m cron -a 'minute="*/10" job="/bin/echo hello" name="test cron job" state="present"'
查看定時任務
ansible db -a "crontab -l"
#修改定時任務
ansible db -m cron -a 'minute="*/5" job="/bin/echo hello" name="test cron job" state="present"'
#移除定時任務(根據name來刪除)
ansible db -m cron -a 'minute="*/10" job="/bin/echo hello" name="test cron job" state="absent"'
ansible all -m cron -a "name=test state=absent"
查看定時任務
ansible db -a "crontab -l"
# 注釋相應定時任務,使定時任務失效
ansible web_group -m cron -a "name='ansible cron01' minute=0 hour=0 job='/bin/sh /server/scripts/test.sh' disabled=yes"
ansible yml語法(playbook)
注意:yml語法很嚴格,不能多,漏空格,不能使用TAB
在不同的主機上,創建以主機名命名的目錄
[root@m01 ~]# vim 2.yml
- hosts: web_group
tasks:
- name: 233
file:
path: /root/{{ ansible_fqdn }}
state: directory
owner: root
group: root
mode: 0755
[root@m01 ~]# ansible-playbook 2.yml
[root@web01 ~]# ll
total 8
drwxr-xr-x 2 root root 6 Jun 1 00:41 web01
#查看ansiable-playbook命令
[root@m01 ~]# ll /usr/bin/ansible #TAB
ansible ansible-console-2.7
copy模塊
拷貝, 修改文件或目錄, 修改已經存在的目錄的權限
使用content可以直接在遠端創建文件,同時指定文件內容
使用backup=yes備份配置文件,可以實現配置文件的修改或回滾
該模塊可以直接拷貝鏈接
[root@m01 ~]# ansible-doc copy #查看copy模塊用法
src: #源文件或目錄,要復制到遠程主機的文件在本地的地址,可以是絕對路徑,也可以是相對路徑。如果路徑是一個目錄,它將遞歸復制。在這種情況下,如果路徑使用"/"來結尾,則只復制目錄里的內容,如果沒有使用"/"來結尾,則包含目錄在內的整個內容全部復制,類似於rsync(#)。(src為空目錄是時候是不會拷貝的,一致顯示綠色)
content:用於替代"src",可以在命令行直接設定指定文件的值
dest: #目標目錄
owner: foo #屬主
group: foo #屬組(不能使用gid指定)
mode: '0644' #權限,數字(3位|4位),字母,UGO
backup: yes #當出現同名的文件,直接覆蓋,因為默認是no,指定yes后(文件內容不同會以當前時間戳備份該文件)
force:如果目標主機包含該文件,但內容不同,如果設置為yes,則強制覆蓋,如果為no,則只有當目標主機的目標位置不存在該文件時,才復制。默認為yes(force=no和state=backup可以二選一)
remote_src:
yes #受控端自己玩(可以做批量回滾)
no #默認
--------------------------------------------------
#遠程批量拷貝,相當於scp,rsync
目標目錄下文件存在的話會報錯,被控端主機用戶不存在會報錯(但是它把能做的都做了)
[root@m01 ~]# ansible 'web_group' -m copy -a 'src=/root/hosts dest=/root owner=www group=www mode=0644'
--------------------------------------------
[root@web01 /]# yum install -y httpd
[root@web01 ~]# systemctl start httpd
[root@web01 ~]# echo 233 > /var/www/html/index.html
#瀏覽器訪問
------------------------------------------------------------
#遠程拷貝文件,並且將原來的同名文件備份,如果文件名和文件內容,屬主屬組和權限都一樣就不做拷貝了(綠),backup=no可以省略,屬主屬組是root的時候可以不寫(目的地文件1.同名 2.內容不同 才備份),當dest不存在時,源文件改名
[root@m01 /]# ansible 'web_group' -m copy -a 'src=/root/hosts dest=/root owner=www group=www mode=0644 backup=yes'
----------------------------------------------------------------
#簡單的文件直接可以直接使用content在命令行copy,不需要copy文件(記得在末尾加\n)
[root@m01 ~]# ansible 'nfs_group' -m copy -a 'content="/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)\n" dest=/etc/exports'
--------------------------------------------------------------------------
#遠端的源拷貝到遠端指定的位置
[root@m01 ~]# ansible 'web_group' -m copy -a 'src=/etc/passwd dest=/tmp remote_src=yes'
#配置文件回滾
[root@m01 ~]# ansible web01 -m copy -a 'src=/root/passwd.1811.2020-06-09@18:16:13~ dest=/root/passwd remote_src=yes'
file模塊
功能:創建文件或目錄,修改已經存在的目錄的權限,創建軟硬連接
file:
path: /etc/foo.conf #指定創建的目錄或文件
state:
touch #創建文件
directory #創建目錄
absent #刪除目錄或文件
link #做軟鏈接
owner: foo #屬主
group: foo #屬組
mode: '0644' #權限
recurse #遞歸
1 force:需要在兩種情況下強制創建軟鏈接,一種是源文件不存在但之后會建立的情況下;另一種是目標軟鏈接已存在,需要先取消之前的軟鏈,然后創建新的軟鏈,有兩個選項:yes|no
2 group:定義文件/目錄的屬組
3 mode:定義文件/目錄的權限( 1.一次創建多個目錄的時候才會遞歸授權, 2.recurse=yes也會遞歸授權)
4 owner:定義文件/目錄的屬主
5 path:必選項,定義文件/目錄的路徑(不存在的話可以直接創建)#
6 recurse:'遞歸'的設置文件的屬性,只對'目錄'有效(指定recurce的話,可以修改已經存在的文件或者目錄的權限,默認關閉)(需要配合mode owner group一起使用)
7 src:要被鏈接的源文件的路徑,只應用於state=link的情況
8 dest:被鏈接到的路徑,只應用於state=link的情況
9 state:
directory:如果目錄不存在,創建目錄
file:只能修改文件或目錄的時間 (配合modification_time access_time)
link:創建軟鏈接
hard:創建硬鏈接
touch:如果文件不存在,則會創建一個新的文件,如果文件或目錄已存在,則更新其最后修改時間 (不能在不存在的目錄下創建文件,這一點和touch命令一樣)
absent:刪除目錄、文件或者取消鏈接文件
#遠程批量創建目錄
不指定屬主屬組,默認是root(當前用戶),不指定mode,那么權限為默認
[root@lb01 /code]# ansible 'web_group' -m file -a 'path=/backup state=directory owner=adm group=adm mode=0000'
#創建目錄,同時遞歸授權(不能針對文件)
[root@m01 ~]# ansible 'web01' -m file -a 'path=/1/2/3 state=directory mode=000 recurse=yes'
#當state=touch mode=000同時指定,創建的都是目錄,只指定touch才會創建文件 3
[root@m01 ~]# ansible web01 -m file -a 'path=/1/2/3 state=touch mode=000'
#遠程批量創建文件(上級目錄必須存在)
[root@lb01 /code]# ansible 'web_group' -m file -a 'path=/backup state=touch owner=adm group=adm mode=0000'
--------------------------------------------------------------------
#遠程批量刪除目錄或文件
[root@lb01 ~]# ansible 'web_group' -m file -a 'path=/backup state=absent'
-----------------------------------------------------------------------
#遠程創建軟鏈接,(不指定權限的話,屬主屬組為root,鏈接文件權限是777)
[root@lb01 /code]# ansible 'web_group' -m file -a 'src=/backup/a.txt dest=/b.txt state=link owner=adm group=adm mode=0000'
#遠程創建硬鏈接(可通過ll -i 查看inode號,判斷是否為硬鏈接關系)
[root@lb01 /code]# ansible 'web_group' -m file -a 'src=/backup/a.txt dest=/b.txt state=hard owner=adm group=adm mode=0000'
yum模塊
功能:遠程下載
name #包名,用等於號表示(指定要安裝的軟件包的名稱)
file:// #指定本地安裝路徑,=yum localinstall -y
http:// #指定yum倉庫
state #指定動作,用等於號表示
present #安裝軟件包(默認)(=install)
absent #刪除軟件包(=remove)
latest #安裝最新版本的軟件包或,升級
disable_gpg_check #默認值為 no,表示不禁用驗證,設置為 yes 表示禁用驗證,即不驗證包,直接安裝。
enablerepo #臨時啟用源(無論此源是否開啟)
disablerepo #臨時禁用某個源,這樣設置后,在安裝軟件包時則不會從對應的源中選擇安裝包。
download_only=true #只下載不安裝 yum install [d]
-------------------------------------------------------------
#下載安裝,使用被控端的源安裝軟件包
[root@m01 ~]# ansible 'web_group' -m yum -a 'name=vsftpd'
[root@m01 ~]# ansible 'web_group' -m yum -a 'name=vsftpd state=present'
#下載安裝,指定源的rpm包,相當於wget+localinstall,可以指定包名和協議
[root@m01 ~]# ansible 'web_group' -m yum -a 'name=https://mirrors.aliyun.com/zabbix/zabbix/5.0/rhel/7/x86_64/zabbix-agent-5.0.0-1.el7.x86_64.rpm state=present'
#安裝,前提是客戶端指定目錄下有這個rpm包(相當於yum localinstall)
[root@m01 ~]# ansible 'web_group' -m yum -a 'name=/root/zabbix-agent-5.0.0-1.el7.x86_64.rpm state=present'
--------------------------------------------------------------
#卸載
[root@m01 ~]# ansible 'web_group' -m yum -a 'name=zabbix-agent-5.0.0-1.el7.x86_64 state=absent'
[root@m01 ~]# ansible 'web_group' -m yum -a 'name=zabbix state=absent'
-----------------------------------------------------------------------
#擴展
[root@localhost ~]# ansible all -m yum -a "name=httpd state=latest disable_gpg_check=yes enablerepo=epel"
#升級所有軟件包,排除httpd
[root@Ansible ~]# ansible all -m yum -a "state=latest name='*' exclude='httpd'"
shell模塊
功能:執行復雜的命令
尤其是用到復雜命令時(如帶管道符等等),但是shell模塊不能做mysql的主從復制,但是nginx編譯安裝的時候只能使用shell模塊(一般不用shell模塊,因為還要指定模塊...)
#企業中一般不讓使用shell模塊
#使用ansible批量操作集群的主機
[root@m01 ~]# ansible 'web_group' -m shell -a 'free -m'
[root@m01 ~]# ansible 'web_group' -m conmand -a 'free -m'
[root@m01 ~]# ansible web01 -m shell -a "ps -ef|grep httpd"
命令的最后也可以加 -f number ,表示使用的並發進程數目,默認是5個
ansible webserver -a 'netstat -ulntp' -f 15
/usr/bin/ansible 默認使用當前ansible 服務器登陸的用戶來進行管理,如果你不喜歡這樣,也可以使用 -u username 的方式來指定用戶
[root@docker ~]# ansible webserver -a "ls" -u zhangsan -f 9
script模塊
功能:作用:將本地腳本復制到遠程主機,並執行。(不需要給腳本添加執行權限)
#編輯腳本(只需要放在m01就好)
vim /root/dir.sh
mkdir syy
#執行
absible 'web01' -m script -a '/root/dir.sh'
synchronize模塊
功能:基於rsync命令工具同步目錄和文件
由於synchronize模塊會調用rsync命令,因此首先要記得提前安裝好rsync軟件包
1 archive: 歸檔,相當於同時開啟recursive(遞歸)、links、perms、times、owner、group、-D選項都為yes ,默認該項為開啟(#保證源文件和目標文件屬性一致)
2 checksum: 是否檢測sum值,默認關閉
3 compress:是否開啟壓縮(默認開啟)
4 copy_links:同步的時候是否復制鏈接,默認為no ,注意后面還有一個links參數
links:同步鏈接文件
5 delete: 刪除不存在的文件,delete=yes 使兩邊的內容一樣(即以推送方為主),默認no
6 dest:目錄路徑(絕對路徑或者相對路徑)
7 dest_port:目標主機上的端口 ,默認是22,走的ssh協議
8 dirs:傳送目錄不進行遞歸,默認為no,即進行目錄遞歸(#一般不用指定)
9 rsync_opts:通過傳遞數組來指定其他rsync選項。 #
--exclude=*.txt #排除
10 set_remote_user:主要用於ansible默認使用的用戶與rsync使用的'用戶不同的情況
11 mode: push(默認)或pull 模塊,push模的話,'一般用於從本機向遠程主機上傳文件,pull 模式用於從遠程主機上取文件'
12 src: 要同步到目的地的源主機上的路徑; 路徑可以是絕對的或相對的。如果路徑使用”/”來結尾,則只復制目錄里的內容,如果沒有使用”/”來結尾,則包含目錄在內的整個內容全部復制
ansible 172.25.70.2 -m synchronize -a ' '
#同步目錄(前提是遠程服務器上有rsync這個命令)
src=some/relative/path dest=/some/absolute/path rsync_path="sudo rsync"
#排除(#由於這個是rsync命令的參數,所以必須和rsync_opts一起使用)
src=/tmp/helloworld dest=/var/www/helloword rsync_opts=--exclude=.log
mount模塊
功能:掛載
mount模塊控制/etc/fstab中的活動和配置掛載點
文件系統的類型:C7(xfs),C6(ext4), C5(ext3)
1 fstype:必選項,掛載文件的類型 (nfs文件共享 fstype=nfs)
2 name:必選項,'哪個文件掛載' (可以使用path指定)
3 opts:傳遞給mount命令的參數(rw,ro)
4 src:必選項,'掛載到哪的目錄' (nfs)
5 state:必選項
present:把指定的掛載寫入到fastab中,不會立即掛載,(綠色)
mounted :即寫入文件,又直接掛載(自動創建掛載點並掛載之)(#推薦)
absent:刪除掛載點 (會清理fastab中的開機掛載)(#推薦)
unmounted:卸載(不會清理fastab中的開機掛載)
--------------------------------------------------------------------
1.#服務端和客戶端安裝nfs
[root@m01 ~]# ansible web_group -a 'yum -y install nfs-utils'
[root@m01 ~]# ansible nfs_group -a 'yum -y install nfs-utils'
2.#編輯nfs配置文件
[root@m01 ~]# ansible 'nfs_group' -m copy -a 'content="/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)\n" dest=/etc/exports'
3.創建
[root@m01 ~]# ansible nfs_group -a 'mkdir /data'
[root@m01 ~]# ansible nfs_group -m systemd -a 'name=nfs state=started'
4.啟動並設置開機自啟
[root@m01 ~]# ansible web_group -m systemd -a 'name=nfs state=started'
[root@m01 ~]# ansible web_group -m systemd -a 'name=nfs enabled=yes'
[root@m01 ~]# ansible nfs_group -m systemd -a 'name=nfs enabled=yes'
5.掛載
[root@m01 ~]# ansible web01 -m mount -a ''
path=/mnt src=172.16.1.31:/data fstype=nfs state=mounted
name=/mnt/dvd src=/dev/sr0 fstype=iso9660 opts=ro state=present
name=/srv/disk src='LABEL=SOME_LABEL' state=present
name=/home src='UUID=b3e48f45-f933-4c8e-a700-22a159ec9077' opts=noatime state=present
ansible test -a 'dd if=/dev/zero of=/disk.img bs=4k count=1024'
ansible test -a 'losetup /dev/loop0 /disk.img'
ansible test -m filesystem 'fstype=ext4 force=yes opts=-F dev=/dev/loop0'
ansible test -m mount 'name=/mnt src=/dev/loop0 fstype=ext4 state=mounted opts=rw'
6.取消掛載
[root@m01 ~]# ansible web_group -m mount -a 'path=/mnt src=172.16.1.31:/data fstype=nfs state=unmounted'
7.清理/etc/fstab文件
#UUID就是磁盤的身份證號,不會重復(一般使用UUID的方式掛載)
[root@web ~]# blkid /dev/sda1 查看UUID(xfs文件系統)
/dev/sda1: UUID="12722517-ff26-416b-b535-073a95a7a00e" TYPE="xfs"
[root@web ~]# cat /etc/fstab
UUID=5bf16417-9cb6-40eb-80b9-8cc2f715f79f / (根目錄的UUID) xfs defaults 0 0
UUID=12722517-ff26-416b-b535-073a95a7a00e /boot (/bbot目錄的UUID) xfs defaults 0 0
#把本地的磁盤掛載到遠程主機上
[root@Ansible ~]# ansible all -m mount -a "name=/mnt src=/dev/sda3 fstype=xfs state=mounted opts=rw"
#格式化磁盤:
ansible all -m filesystem -a "fstype=ext4 dev=/dev/sdb1"
get_url模塊
功能:下載
[root@m01 ~]# ansible-doc get_url
url: http://example.com/path/file.conf #自定下載文件的URL
dest: /etc/foo.conf #指定下載的目錄
mode: '0440' #指定下載后的權限
owner
group
force_basic_auth: yes #文件名相同直接覆蓋(默認)
checksum #默認關閉
md5 #md5校驗
sha256 #sha校驗
#遠程連接並下載(串行,速度慢)
[root@m01 ~]# ansible 'web_group' -m get_url -a 'url=http://test.driverzeng.com/Nginx_Code/wordpress-4.9.4-zh_CN.tar.gz dest=/root mode=000'
#校驗MD5並下載(小心等於號,阿里雲不使用md5sum校驗,)
[root@m01 ~]# ansible 'web_group' -m get_url -a 'url=http://test.driverzeng.com/Nginx_Code/wordpress-4.9.4-zh_CN.tar.gz dest=/root mode=000 checksum= md5:b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c'
yum_repository模塊
功能:添加,刪除,修改yum源
[root@m01 ~]# ansible-doc yum_repository
yum_repository:
name: epel #不能省略,指定倉庫文件名和倉庫名,自動添加.repo
description: #相當於倉庫內的name注釋
baseurl: https://download.fedoraproject.org/pub/epel/$releasever/$basearch/
file: #指定倉庫文件名(優先級高),不指定的話倉庫文件名和倉庫名一樣,不能同時在同一個倉庫文件內添加多個倉庫名不同的倉庫,同時指定的話file=倉庫文件名,name=倉庫名
gpgcheck #是否開啟校驗
yes
no
enabled #是否啟用yum倉庫
yes
no
state
present #創建yum倉庫(默認)
absent #刪除yum倉庫
--------------------------------------------------------
#批量添加yum倉庫,不能一次在某一主機添加多個倉庫文件和倉庫,功能有限
[root@m01 ~]# ansible 'web_group' -m yum_repository -a 'name=syy_add_epel description=EEE baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=no enabled=yes file=zdy'
#在客戶端已存在的倉庫文件內添加倉庫(1.指定倉庫文件。2.指定倉庫名,存在即修改,不存在即添加)
[root@m01 ~]# ansible 'web_group' -m yum_repository -a 'name=syy2_add_epel description=EEE baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=no enabled=yes file=zdy'
--------------------------------------------------------------
#批量刪除yum倉庫,只能一個一個刪除倉庫文件(也就是說不能只指定name來批量刪除),file優先級高,可以只指定name,也可以同時指定(視情況而定)
(倉庫文件名和倉庫名要對應,最好都寫上)
[root@m01 ~]# ansible 'web_group' -m yum_repository -a 'name=syy_add_epel file=zdy state=absent'
--------------------------------------------------------------
#修改
不能修改倉庫文件名,也不能修改倉庫名,可以修改URL,gpg,enabled
[root@m01 ~]# ansible 'web_group' -m yum_repository -a 'name=syy_add_epelllll description=EEE baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=no enabled=yes file=1'
也可以修改gpgcheck和enable
[root@m01 ~]# ansible 'web_group' -m yum_repository -a 'name=syy_add_epel description=EEE baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=no enabled=no file=1'
#使用playbook執行yml腳本,可以實現更精確的操作
ansible服務模塊--systemd模塊
功能:遠程啟停,重載服務,
[root@m01 ~]# ansible-doc systemd
systemd: #模塊
state: started #啟動
name: httpd #指定服務名稱
state: stopped #停止
state: restarted #重啟
state: reloaded #重載配置文件
enabled=yes #設置開機自啟
daemon_reload # 讀取配置文件,每次修改了文件,最好都運行一次,確保應用了(systemd)
masked: #是否將服務設置為masked狀態,被mask的服務是無法啟動的(systemd),(yes|no)默認為no
----------------------------------------------------------------
#遠程停止服務
[root@m01 ~]# ansible 'web_group' -m systemd -a 'name=nginx state=stopped '
#遠程啟動服務(並設置開機自啟動)
[root@m01 ~]# ansible 'web_group' -m systemd -a 'name=nginx state=started enabled=yes '
-------------------------------------------------------------
# 先將服務停止
[root@Ansible ~]# ansible web -m systemd -a "name=httpd state=stopped"
#設置masked
[root@Ansible ~]# ansible web -m systemd -a "name=httpd masked=yes"
# 服務已無法啟動
[root@Ansible ~]# ansible web -m systemd -a "name=httpd state=started"
# 撤銷mask
[root@Ansible ~]# ansible web -m systemd -a "name=httpd masked=no"
# 可以啟動成功
[root@Ansible ~]# ansible web -m systemd -a "name=httpd state=started"
service模塊
遠程啟停,重載服務
service模塊(可以跨平台,跨系統) 與systemd模塊作用類似,使用命令類似
1 arguments:給命令行提供一些選項 #
2 enabled:是否開機啟動 yes|no(默認是no)
3 name:必選項,服務名稱
4 pattern:定義一個模式,如果通過status指令來查看服務的狀態時,沒有響應,就會通過ps指令在進程中根據該模式進行查找,如果匹配到,則認為該服務依然在運行 #
5 runlevel:運行級別 #
6 sleep:如果執行了restarted,在則stop和start之間沉睡幾秒鍾
7 state:對當前服務執行啟動,停止、重啟、重新加載等操作(started,stopped,restarted,reloaded)
#保持服務啟動並設置為開機自啟
ansible web_group -m service -a 'enabled=yes name=httpd state=started'
ansible用戶組管理模塊
功能:創建用戶組
[root@m01 ~]# ansible-doc group
name: somegroup #指定組名
state: present #創建(默認,課省略)
state: absent #刪除
gid #指定創建的組的gid
#遠程創建組
[root@m01 ~]# ansible 'web_group' -m group -a 'name=dd gid=233 state=present'
#遠程刪除組
[root@m01 ~]# ansible 'web_group' -m group -a 'name=dd gid=233 state=absent'
ansible用戶管理模塊
功能:管理遠程主機上的用戶,比如創建用戶、修改用戶、刪除用戶、為用戶創建密鑰對等操作
user模塊是請求的是useradd, userdel, usermod三個指令,goup模塊請求的是groupadd, groupdel, groupmod 三個指令。
groups: #修改附加組為
append=no #默認,覆蓋(相當於usermod -G)
append=yes #追加(相當於usermod -aG)
uid: 指定用的uid
group: #指定主組
password: #明文密碼進行哈希后的字符串,你可以在 python 的命令提示符下輸入如下命令,生成明文密碼對應的加密字符串 "import crypt; crypt.crypt('666666')"
update_password:
always: 只有當密碼不相同時才會生效,即修改密碼(默認) #
on_create: 只為新用戶設置密碼
name: 指定用戶名
system: 是否為系統用戶 yes|no(默認是no)
remove: 當state=absent時,remove=yes則表示連同家目錄,郵件目錄一起刪除,等價於userdel -r(默認是no)
state:
absent #刪除用戶
remove=no #默認,刪除用戶時,不會刪除用戶的家目錄等信息
remove=yes #刪除用戶的同時,會刪除用戶的家目錄,郵件目錄
present #創建用戶(默認)
shell: 指定用戶的shell環境(默認是/bin/bash)
expires: 設置用戶的過期時間,值是一個時間戳(轉化命令:date -d 2018-12-31 +%s,命令行設置 expires=)
comment: #創建用戶的時候添加一段注釋
generate_ssh_key: yes #創建公鑰(默認)
ssh_key_bits: 2048 #指定公鑰長度
ssh_key_file: .ssh/id_rsa #創建私鑰(創建用戶的家目錄下)
create_home=false #是否創建家目錄(默認創建true)
------------------------------------------------------------------------
#創建用戶,修改用戶
ansible 'web_group' -m user -a ' '
name=ll
name=hh comment="zhushi" uid=1040 group=adm #該組必須存在
name=hh shell=/bin/bash groups=adm,lp append=yes
name=hh state=absent remove=yes
name=hh expires=1422403387
name=hh generate_ssh_key=yes ssh_key_bits=2048 ssh_key_file=.ssh/id_rsa
name="testops" password="$6$0lwTSmqKOkL.ktgl$OnBexXC7haBf0FRHVMIZM2edDeFWBbpKJ2r9cxVwNvY.vh3IIUzwFz8n7jFglc0CrtQSY12ziDonVL6e71Og2."
--------------------------------------------------------------
#生成密鑰時,只會生成公鑰文件和私鑰文件,和直接使用ssh-keygen指令效果相同,不會生成authorized_keys文件。復制id_rsa.pub粘貼為authorized_keys文件即可使用
name=test generate_ssh_key=yes ssh_key_bits=2048 ssh_key_file=~/.ssh/id_rsa
-----------------------------------------------------------------------
#指定password參數時,不能使用后面這一串密碼會被直接傳送到被管理主機的/etc/shadow文件中,所以需要先將密碼字符串進行加密處理。然后將得到的字符串放到password中即可。
1.加密
[root@ansible-manager ~]# python
>>> import crypt;crypt.crypt('666666')
'$6$ziT/sb5KRtUaxoq7$ulfHVLqVgXfmfFUYY7FppzqBQMUYd.2GLDyQwmKv4dYAd0zpgtt5JDheoO/OvvTvY53x9UShX.PtHykJEvsmG0'
2.創建用戶指定密碼 或 修改用戶密碼
------------------------------------------------------------------
#刪除用戶
注意該用戶下不能有任何進程,否則會報錯(但是能刪除的都刪除了)
ansible 'web_group' -m user -a ' '
name=ll state=absent remove=yes
fetch
[root@m01 ~]# ansible web01 -m fetch -a "src=/root/lol.txt dest=/root"
壓縮解壓unarchive模塊
功能:解壓縮
1、解壓ansible管理機上的壓縮文件到遠程主機:
ansible all -m unarchive -a "src=/tmp/install/zabbix-3.0.4.tar.gz dest=/tmp/ mode=0755 copy=yes"
2、解壓遠程主機上的文件到目錄:
ansible all -m unarchive -a "src=/tmp/install/zabbix-3.0.4.tar.gz dest=/tmp/ mode=0755 copy=no"
copy:默認為yes,當copy=yes,那么拷貝的文件是從ansible主機復制到遠程主機上的,如果設置為copy=no,那么會在遠程主機上尋找src源文件
src:源路徑,可以是ansible主機上的路徑,也可以是遠程主機上的路徑,如果是遠程主機上的路徑,則需要設置copy=no
dest:遠程主機上的目標路徑
selinux
功能:管理selinux
C6想要使用這種方式關閉selinux的話,需要安裝 libselinux-python(改過要重啟生效)
不能使用systemd service模塊來管理selinux systemd
state:
enforcing #永久開啟
permissive #臨時開啟(默認)
disabled #禁用
#修改配置文件關閉selinux(永久關閉),必須重啟
[root@m01 ~]# ansible web_group -m selinux -a 'state=disabled' -i ./hosts
#臨時關閉
[root@m01 ~]# ansible web_group -m shell -a 'setenforce 0' -i ./hosts
#查看
[root@m01 ~]# ansible web_group -m shell -a 'getenforce' -i ./hosts
如果修改了/etc/selinux/config文件的話,需要重啟,如果你只是臨時修改的話,不需要重啟
使用setenforce 可以臨時改變selinux的狀態,不需要重啟系統。但是系統重啟后,配置失效,因為系統重啟后,是根據/var/selinux/config的配置內容進行功能設置的
firewalld
功能:管理firewalld
打開才能關閉
service #指定開放或關閉的服務名稱(http https)
port #指定開放或關閉的端口(-)
permanent #是否添加永久生效(permanent=no即為臨時生效) #
immediate #臨時生效
state
enabled #永久開啟
disabled #永久關閉
zone #指定配置某個區域
rich_rule #配置輔規則
masquerade #開啟地址偽裝
source #指定來源IP
#service指定服務(需要提前開啟防火牆)
[root@m01 ~]# ansible web_group -m firewalld -a 'service=http permanent=yes state=enabled' -i ./hosts
[root@m01 ~]# ansible web_group -m firewalld -a "service=https permanent=yes state=enabled" -i ./hosts
#service指定端口(某些服務系統自動開啟)
[root@m01 ~]# ansible web_group -m firewalld -a "port=8080-8090/tcp permanent=yes state=enabled" -i ./hosts
lineinfile
功能:lineinfile模塊用於確保一個特定的行在一個文件中,或使用一個正則表達式替換現有的行
如果想要改變文件中相似的多行,可以使用replace模塊。如果想要插入、更新、刪除一個行塊,可以使用blockinfile模塊
(1)文本替換
將/etc/selinux/config文件中所有匹配^SELINUX=正則表達式的行中的最后一行使用SELINUX=disabled替換
如果regexp不匹配文件中的任何一行,則將line所指定的行插入到文件的末尾
[root@Ansible ~]# ansible web -m lineinfile -a "path=/etc/selinux/config regexp='^SELINUX=' line='SELINUX=disabled'"
(2)刪除行
將/tmp/test.sh文件中所有匹配^pwd的行刪除
[root@Ansible ~]# ansible web -m lineinfile -a "path=/tmp/test.sh regexp='^pwd' state=absent"
(3)替換行並設置文件權限
[root@Ansible ~]# ansible web -m lineinfile -a "path=/etc/hosts regexp='^127.0.0.1' line='127.0.0.1 localhost' owner=root group=root mode=0644"
stat模塊
功能:stat模塊獲取遠程文件狀態信息,包括atime、ctime、mtime、md5、uid、gid等
(1)顯示文件的所有信息
[root@Ansible ~]# ansible web -m stat -a "path=/etc/sysctl.conf"
(2)顯示MD5值
[root@Ansible ~]# ansible web -m stat -a "path=/etc/sysctl.conf get_md5=yes"
mysql_user模塊
功能:主控端對被控端mysql服務器 添加刪除用戶,授權遠程用戶登錄,訪問
mysql_user模塊參數
login_host=“localhost” 指定本地root用戶登錄本機mysql
login_password=“123.com” root用戶的登錄密碼 #登錄密碼
login_user=“root” 為root用戶或者mysql用戶 #登錄用戶
login_port=“3306” 數據庫端口號
name="" 指定grant授權用戶 #建立使用者的名字或是已存在的使用者
password="" grant授權用戶密碼 #給新用戶設置密碼,或者修改密碼
priv="" 庫名.SQL語句權限,GRANT #資料庫.資料表:權限1,權限2(要用")
host="" 授權遠程登錄的IP地址,一般為 網段.% 或者直接 %
state=“present” 創建授權用戶
state=“absent” 刪除授權用戶
ahdoc模式寫法創建授權用戶,驗證模塊正確時使用
[root@localhost ansible]# ansible mysql -m mysql_user -a "login_host=% login_password=123.com login_user=root login_port=3306 name=ty_user password=1 priv=".:ALL,GRANT" host='%' state=present"
playbook劇本寫法創建授權用戶,執行自動化部署時使用
- hosts: mysql_group
remote_user: root
tasks:
- name: grant mysql user
mysql_user:
login_host: "localhost"
login_user: "root"
login_password: "123.com"
login_port: "3306"
name: "ty"
password: "123.com"
host: "%"
priv: "*.*:ALL,GRANT"
state: "present"
mysql_db模塊
功能:用於建立、刪除、導入和導出數據庫
#建立數據庫
hosts: mysql_group
tasks:
- name: create a database
mysql_db:
login_host: "127.0.0.1"
login_user: "root"
login_password: "mysql@123"
login_port: "3306"
name: "mezz"
encoding: "utf8"
state: "present"
#刪除數據庫
hosts: mysql_group
tasks:
- name: delete a database
mysql_db:
login_host: "127.0.0.1"
login_user: "root"
login_password: "mysql@123"
login_port: "3306"
name: "mezz"
state: "absent"
#導出數據庫
hosts: mysql_group
tasks:
- name: dump a database
mysql_db:
login_host: "127.0.0.1"
login_user: "root"
login_password: "mysql@123"
login_port: "3306"
name: "mezz"
target: "/tmp/mezz.gz"
state: "dump"
#導入數據庫
hosts: mysql_group
tasks:
- name: import a database
mysql_db:
login_host: "127.0.0.1"
login_user: "root"
login_password: "mysql@123"
login_port: "3306"
name: "mezz"
target: "/tmp/mezz.gz"
state: "import"
template模塊
該模塊只能在playbook中運行,不能使用命令行
功能:該模塊和copy模塊作用基本一樣,都是把某個文件復制到遠端主機上,但是區別在於template模塊可以獲取變量的值,而copy則是原封不動的把文件內容復制過去
改變量的調用依賴於facts,關閉fascs的話,該模塊作用將於copy模塊相同
問題:由於每台服務器cpu數量不一樣,沒辦法來靈活配置Nginx最大進程數
– backup: 如果原目標文件存在,則先備份目標文件
– src:在ansible控制器上的Jinja2格式化模板的路徑。 這可以是相對或絕對的路徑。
– dest:將模板渲染到遠程機器上的位置。
force:是否強制覆蓋,默認為yes
– owner:目標文件屬主
– group:目標文件屬組
– mode:目標文件的權限模式
# Example from Ansible Playbooks
- template:
src: /mytemplates/foo.j2
dest: /etc/file.conf
owner: bin
group: wheel
mode: 0644
pam_limits模塊
功能:修改文件描述符
#為用戶joe添加或修改nofile軟限制
- pam_limits:
domain: joe
limit_type: soft
limit_item: nofile
value: 64000
# 為用戶smith添加或修改硬限制。保持或設置最大值。
- pam_limits:
domain: smith
limit_type: hard
limit_item: fsize
value: 1000000
use_max: yes
#為用戶james添加或修改memlock,包括軟硬限制和注釋。
- pam_limits:
domain: james
limit_type: '-'
limit_item: memlock
value: unlimited
comment: unlimited memory lock for james
