一、Ansible系列命令使用
ansible命令執行過程
- 1 . 加載自己的配置文件 默認/etc/ansible/ansible.cfg
- 2 . 加載自己對應的模塊文件,如command
- 3 . 通過ansible將模塊或命令生成對應的臨時py文件,並將該文件傳輸至遠程服務器的對應執行用戶$HOME/.ansible/tmp/ansible-tmp-數字/XXX.PY文件
- 4 . 給文件+x執行
- 5 . 執行並返回結果
- 6 . 刪除臨時py文件,sleep 0退出
執行狀態:
- 綠色:執行成功並且不需要做改變的操作
- 黃色:執行成功並且對目標主機做變更
- 紅色:執行失敗
1. ansible命令
ansible <host-pattern> [-m module_name] [-a args]
-a //后面跟參數
--version //顯示版本
--m module //指定模塊,默認使用command模塊
-v //顯示詳細過程 -vv -vvv 顯示更詳細
--list-hosts //顯示主機列表,可簡寫-list
-k,--ask-pass //提示連接密碼,默認key驗證
-K,--ask-become-pass //提示輸入sudo
-C,--check //檢查命令,並不執行
-T,--timeout=TIMEOUT //執行命令的超時時間,默認10s
-u,--user=REMOTE_USER //執行遠程操作的 執行的用戶
-b,--become //代替舊版的sudo切換
示例:
ansible all -m command -u yunwei --become-user=root -a 'ls /root' -b -k -K
//以yunwei用戶 sudo 到root用戶 執行 ls /root
-
ansible的host-pattern
//匹配主機的列表
all :表示所有inventory中的所有主機
ansible all -m ping //ping一下主機清單中的所有主機是否能正常登陸,但是不是icmp協議的ping命令
ansible all --list-hosts
*:通配符
ansible "*" -m ping
ansible 172.16.1.* -m ping
ansible "*Server" -m ping
//或關系:
ansible "webServer:appServer" -m ping
ansible "192.168.1.10:192.168.1.20" -m ping
//邏輯與:
ansible "webServer:&mysqlServer" –m ping
在webServer組並且在mysqlServer組中的主機
//邏輯非:
ansible webServer:!mysqlServer' –m ping
在websrvs組,但不在mysqlServer組中的主機
//綜合邏輯:
ansible 'webServer:mysqlServer:&appServer:!ftpServer' –m ping
//正則表達式:
ansible "webServer:&mysqlServer" –m ping
ansible "~(web|wj).*\.bigboss\.com" –m ping
2. ansible常用模塊
1. command 模塊,默認模塊
在遠程主機執行命令,默認模塊,可忽略-m選項
ansible mysqlServer -m command -a 'systemctl restart mysqld'
ansible webServer -m command -a 'echo 123456 |passwd --stdin yunwei'
ansible webServer -m command -a 'echo "123456" >f1'
//顯示已經執行成功,但是遠程主機並沒有產生操作
注意command模塊不支持 變量$VarName > < | ; & 等,可以使用shell模塊實現
2. shell模塊 支持通配符
和command模塊類似,在遠程主機執行命令,支持通配符
ansible webServer -m shell -a 'echo 123456 |passwd --stdin yunwei'
//調用bash執行命令
//類似 cat /tmp/stanley.md | awk -F'|' '{print $1,$2}' &> /tmp/example.txt
//這些復雜命令,即使使用shell也可能會失敗,解決辦法:寫到腳本時,copy到遠程,執行,再把需要的結果拉回執行命令的機器
密碼設置成功
3. script模塊
把腳本復制到遠程節點后,在遠程節點本地運行腳本
ansible webServer -m script -a restart.sh
//如果有返回的內容也會返回 stdout;下圖我cat 一個文件
4. copy模塊
復制文件或目錄到遠程節點;如果目標存在,默認會覆蓋,用此模塊應指定先備份。
ansible webServer -m copy -a "src=/etc/hosts dest=/root/hosts owner=root mode=660 backup=yes"
src //指定源文件在本地主機的地址,可以是絕對路徑,也可以是相對路徑。如果路徑是一個目錄,它將遞歸復制。在這種情況下,如果路徑使用"/"來結尾,則只復制目錄里的內容,如果沒有使用"/"來結尾,則包含目錄在內的整個內容全部復制,類似於rsync。
dest //必選項。要將源文件復制到的遠程主機的絕對路徑,如果源文件是一個目錄,那么該路徑也必須是個目錄
ownr //更改文件所有者
mode //權限更改
directory_mode //遞歸的設定目錄的權限,默認為系統默認權限
backup //再覆蓋之前將源文件備份,備份文件包含時間信息。backup = yes|no ,不使用默認不備份
content //可以編寫 content="xxxxxdfasafsafasfasf" 指定dest文件后,將類似`echo $content > $dest ` 生成指定文件包含指定內容;
5. fetch模塊
從客戶端拖去文件到本地主機,與copy相反,只能抓取文件,抓取目錄可以先 `tar` 打包
默認會以主機清單中的主機名為目錄存放獲取到的文件
ansible all -m fetch -a 'src=/etc/hosts dest=/data/test'
172.16.1.2 | CHANGED => {
"changed": true,
"checksum": "7335999eb54c15c67566186bdfc46f64e0d5a1aa",
"dest": "/data/test/172.16.1.2/etc/hosts",
"md5sum": "54fb6627dbaa37721048e4549db3224d",
"remote_checksum": "7335999eb54c15c67566186bdfc46f64e0d5a1aa",
"remote_md5sum": null
6. archive模塊
將遠程主機的指定文件或目錄,打包成指定壓縮格式的壓縮包,並放到遠程主機的指定位置
ansible all -m archive -a 'path=/etc/rpm dest=/root/rpm.tar format=tar'
path //指定要打包的文件路徑 (Required必須條件)
dest //打包后要放的位置和 命名
format // 指定打包壓縮的格式 有:bz2 ,gz ,tar,xz,zip
可以anible-doc archive 查看模塊幫助
5. cron 計划任務
管理計划任務
//支持時間
day:日(1-31,*,*/2,……)
hour:小時(0-23,*,*/2,……)
minute:分鍾(0-59,*,*/2,……)
month:月(1-12,*,*/2,……)
weekday:周(0-7,*,……)
backup:對遠程主機上的原任務內容修改之前做備份
cron_file:如果指定該選項,則用該文件替換遠程主機的cron.d目錄下的用戶的任務計划
job:要執行的任務
name:該任務描述,任務名
special_time:指定什么時候執行,參數:reboot,yearly,annually,monthly,weekly,daily,hourly
state:確認該任務計划是創建還是刪除 值為absent為刪除
user:執行任務的用戶
ansible all -m cron -a “minute=*/5 job=‘/usr/sbin/ntpdate 172.16.0.1 &>/dev/null’ name=Synctime” //創建任務
ansible all -m cron -a ‘state=absent name=Synctime’ //刪除任務
6. file模塊
設置遠程主機的文件屬性
//參數屬性
path:必選項,定義文件/目錄的路徑
state:操作方法
directory:如果目錄不存在,創建目錄
absent:刪除目錄、文件或者取消鏈接文件。相當於rm -rf
link:創建軟鏈接
hard:創建硬鏈接
file:即使文件不存在,也不會被創建
touch:如果文件不存在,則會創建一個新的文件,如果文件或目錄已存在,則更新時間戳
src:要被鏈接的源文件的路徑,只應用於state=link的情況
dest:被鏈接到的路徑,只應用於state=link的情況
recurse:遞歸的設置文件的屬性,只對目錄有效
owner:定義文件/目錄的屬主
mode:定義文件/目錄的權限
group:定義文件/目錄的屬組
force:需要在兩種情況下強制創建軟鏈接,一種是源文件不存在但之后會建立的情況下;另一種是目標軟鏈接已存在,需要先取消之前的軟鏈,然后創建新的軟鏈,有兩個選項:yes|no
ansible all -m file -a 'name=/app/a.txt state=touch' //創建或者刷新文件
ansible webServer -m file -a "path=/root/a.sh owner=wang mode=755" //修改文件屬性
ansible webServer -m file -a 'src=/app/testfile dest=/app/testfile-link state=link' //創建軟鏈接
7. hostnam模塊
管理遠程主機名
ansible webServer -m hostname -a "web.server"
8. yum模塊
使用yum包管理器來管理軟件包
\\屬性參數
config_file:yum的配置文件
disable_gpg_check:關閉gpg_check
disablerepo:不啟用某個源
enablerepo:啟用某個源
name:要進行操作的軟件包的名字,也可以傳遞一個url或者一個本地的rpm包的路徑
state:安裝 (`present' or `installed', `latest'), 刪除 (`absent' or `removed') . (可選值: present, installed, latest, absent, removed) (默認值 present安裝)
ansible webServer -m yum -a 'name=nginx state=latest' //安裝nginx
ansible webServer -m yum -a 'name=mysql state=absent' //刪除mysql
9. yum_repositoy
配置yum源
reposdir: repo文件存放目錄
file: repo文件名,默認為name的值
name: 唯一的repository ID
gpgkey:設置gpgkey
gpgcheck:設置gpg檢查
enabled:設置開啟關閉
bandwidth:控制帶寬,0為無限
state:狀態(present,absent
description:描述
ansible dns -m yum_repository -a \
'state=present \
name=epel \
enabled=yes \
gpgcheck=yes \
description="Aliyun EPEL" \
baseurl="http://mirrors.aliyun.com/epel/7/$basearch,http://mirrors.aliyuncs.com/centos/$releasever/os/$basearch/" \
gpgkey="https://mirrors.aliyun.com/epel/RPM-GPG-KEY-EPEL-7Server"'
10.service模塊
管理服務
name:服務名
state:動作 started,stopped restarted,reloaded
enabled: yes開機自啟,no不啟動
runlevel:運行級別
pattern:定義一個模式,如果通過status指令來查看服務的狀態時,沒有響應,就會通過ps指令在進程中根據該模式進行查找,如果匹配到,則認為該服務依然在運行
ansible webServer -m service -a 'name=nginx state=started' //一次只能操作一種服務
11.user 模塊
管理用戶
name:用戶名
system:yes是系統用戶,no不是系統用戶
home:設置家目錄
state:設置 創建用戶 還是刪除,present 創建,absent刪除,remove=yes 刪除家目錄數據
ansible mysqlServer -m user -a 'name=user1 comment="test user" uid=2048 home=/app/user1 group=root'
ansible srv -m user -a 'name=sysuser1 system=yes home=/app/sysuser1 '
ansible srv -m user -a 'name=user1 state=absent remove=yes' //刪除用戶及家目錄等數據
12.group模塊
添加組,刪除組
ansible webServer -m group -a "name=testgroup system=yes" //創建組
ansible webServer -m group -a "name=testgroup state=absent" //刪除組
13.setup
收集遠程主機的信息
--tree:將所有主機的輸出信息保存到/tmp/目錄下,以/etc/ansible/hosts里的主機名為文件名
ansible all -m setup -a 'filter=ansible_distribution_version' --tree /tmp/
filter :過濾關鍵字
ansible webServer -m setup -a 'filter=ansible_distribution_version'
關鍵字 | 說明 |
---|---|
ansible_nodename | 節點名 |
ansible_fqdn | FQDN名 |
ansible_hostname | 主機短名稱 |
ansible_domain | 主機域名后綴 |
ansible_memtotal_mb | 總物理內存 |
ansible_swaptotal_mb | SWAP總大小 |
ansible_processor | CPU信息 |
ansible_processor_cores | CPU核心數量 |
ansible_processor_vcpus | CPU邏輯核心數量 |
ansible_all_ipv4_addresses | 有所IPV4地址 |
ansible_all_ipv6_addresses | 所有IPV6地址 |
ansible_default_ipv4 | 默認網關的網卡配置信息 |
ansible_eth2 | 具體某張網卡信息 |
ansible_dns | DNS設置信 |
ansible_architecture | 系統架構 |
ansible_machine | 主機類型 |
ansible_kernel | 內核版本 |
ansible_distribution | 發行版本 |
ansible_distribution_major_version | 操作系統主版本號 |
ansible_distribution_release | 發行版名稱 |
ansible_distribution_version | 完整版本號 |
ansible_pkg_mgr | 軟件包管理方式 |
ansible_service_mgr | 進行服務方式 |
ansible_os_family | 家族系列 |
ansible_cmdline | 內核啟動參數 |
ansible_selinux | SElinux狀態 |
ansible_env | 當前環境變量參數 |
ansible_date_time | 時間相關 |
ansible_python_version | python版本 |
ansible_lvm | LVM卷相關信息 |
ansible_mounts | 所有掛載點 |
ansible_device_links | 所有掛載的設備的UUID和卷標名 |
ansible_devices | 所有/dev/下的正在使用的設備的信息 |
ansible_user_dir | 執行用戶的家目錄 |
ansible_user_gecos | 執行用戶的描述信息 |
ansible_user_gid | 執行用戶的的GID |
ansible_user_id | 執行用戶的的用戶名 |
ansible_user_shell | 執行用戶的shell類型 |
ansible_user_uid | 執行用戶的UID |
更多模塊了解 查看 https://docs.ansible.com/ansible/latest/modules/list_of_all_modules.html