1. 程式人生 > >企業自動化運維ansible

企業自動化運維ansible

自動化運維工具ansible

  • 運維自動化發展歷程及技術應用
  • mark
  • mark

雲端計算工程師核心職能

  • mark
  • Linux運維工程師職能劃分
    mark

自動化動維應用場景

  • 檔案傳輸
  • 命令執行
    • 應用部署
    • 配置管理
    • 任務流編排

企業實際應用場景分析

1 Dev開發環境

使用者:程式設計師
功能:程式設計師開發軟體,測試BUG的環境
管理者:程式設計師

2 測試環境

使用者:QA測試工程師
功能:測試經過Dev環境測試通過的軟體的功能
管理者:運維
說明:測試環境往往有多套,測試環境滿足測試功能即可,不宜過多
(1)測試人員希望測試環境有多套,公司的產品多產品線併發,即多個版本,意味著多個版本同步測試
(2
)通常測試環境有多少套和產品線數量保持一樣

3 釋出環境:程式碼釋出機,有些公司為堡壘機(安全屏障)

使用者:運維
功能:釋出程式碼至生產環境
管理者:運維(有經驗)
釋出機:往往需要有2臺(主備)

4 生產環境

使用者:運維,少數情況開放許可權給核心開發人員,極少數公司將許可權完全開放給開發人員並其維護
功能:對使用者提供公司產品的服務
管理者:只能是運維
生產環境伺服器數量:一般比較多,且應用非常重要。往往需要自動工具協助部署配置應用

5 灰度環境(生產環境的一部分)

使用者:運維
功能:在全量釋出程式碼前將程式碼的功能面向少量精準使用者釋出的環境,可基於主機或使用者執行灰度釋出
案例:共100
臺生產伺服器,先發布其中的10臺伺服器,這10臺伺服器就是灰度伺服器 管理者:運維 灰度環境:往往該版本功能變更較大,為保險起見特意先讓一部分使用者優化體驗該功能,待這部分使用者使用沒有重大問題的時候,再全量釋出至所有伺服器

程式釋出

  • 預釋出驗證
    • 新版本的程式碼先發布到伺服器(跟線上環境配置完全相同,只是未接入到排程器)
  • 程式釋出:
    • 不能導致系統故障或造成系統完全不可用
    • 不能影響使用者體驗
  • 灰度釋出:
  • 釋出路徑:
把原來的舊版本保留
/webapp/tuangou-1.1
/webapp/tuangou
/webapp/tuangou-1.2
  • 釋出過程:在排程器上下線一批主機(標記為maintanance狀態) –> 關閉服務 –> 部署新版本的應用程式 –> 啟動服務 –> 在排程器上啟用這一批伺服器
  • 自動化灰度釋出:指令碼、釋出平臺

常用自動化運維工具

  • Ansible:python,Agentless,中小型應用環境(不需要在客戶端安裝代理程式,基於ssh來管理,300-500臺伺服器)
  • Saltstack:python,一般需部署agent,執行效率更高
  • Puppet:ruby, 功能強大,配置複雜,重型,適合大型環境
  • Fabric:python,agentless
  • Chef: ruby,國內應用少
  • Cfengine
  • func

企業級自動化運維工具應用實戰ansible

  • 公司計劃在年底做一次大型市場促銷活動,全面衝刺下交易額,為明年的上市做準備。公司要求各業務組對年底大促做準備,運維部要求所有業務容量進行三倍的擴容,並搭建出多套環境可以共開發和測試人員做測試,運維老大為了在年底有所表現,要求運維部門同學儘快實現,當你接到這個任務時,有沒有更快的解決方案?

Ansible發展史

  • Ansible
    • 創始人,Michael DeHaan( Cobbler 與 Func 的作者)
    • 2012-03-09,釋出0.0.1版,紅帽收購
    • 2015-10-17,Red Hat宣佈收購
  • 同類自動化工具 GitHub關注程度( 2016- - 07- - 10)
  • mark

特性

  • 模組化:呼叫特定的模組,完成特定任務
  • 有Paramiko,PyYAML,Jinja2(模板語言)三個關鍵模組
  • 支援自定義模組
  • 基於Python語言實現
  • 部署簡單,基於python和SSH(預設已安裝),agentless
  • 安全,基於OpenSSH
  • 支援playbook編排任務
  • 冪等性:一個任務執行1遍和執行n遍效果一樣,不因重複執行帶來意外情況
  • 無需代理不依賴PKI(無需ssl)
  • 可使用任何程式語言寫模組
  • YAML格式,編排任務,支援豐富的資料結構
  • 較強大的多層解決方案

ansible架構

-mark
- ansible是基於key的,所以需要將主機間實現key驗證。當然用密碼也可以,只是比較麻煩

Ansible工作原理

  • mark
    1. 直接使用ansible命令來執行一條命令
    2. 當生產環境穩定後可以用ansible編寫playboot指令碼來執行
    3. 可以使用公有云或私有云
    4. 可以使用CMDB,配置管理資料庫

Ansible主要組成部分

  • ANSIBLE PLAYBOOKS:任務劇本(任務集),編排定義Ansible任務集的配置檔案,由Ansible順序依次執行,通常是JSON格式的YML檔案
  • INVENTORY:Ansible管理主機的清單/etc/anaible/hosts
  • MODULES:Ansible執行命令的功能模組,多數為內建的核心模組,也可自定義
  • PLUGINS:模組功能的補充,如連線型別外掛、迴圈外掛、變數外掛、過濾外掛等,該功能不常用
  • API:供第三方程式呼叫的應用程式程式設計介面
  • ANSIBLE:組合INVENTORY、API、MODULES、PLUGINS的綠框,可以理解為是ansible命令工具,其為核心執行工具
  • Ansible命令執行來源:
    • USER,普通使用者,即SYSTEM ADMINISTRATOR
    • CMDB(資產管理系統) API 呼叫
    • PUBLIC/PRIVATE CLOUD API呼叫
    • USER-> Ansible Playbook -> Ansibile
  • 利用ansible實現管理的方式:
    • Ad-Hoc 即ansible命令,主要用於臨時命令使用場景
    • Ansible-playbook 主要用於長期規劃好的,大型專案的場景,需要有前提的規劃
      -Ansible-playbook(劇本)執行過程:
    • 將已有編排好的任務集寫入Ansible-Playbook
    • 通過ansible-playbook命令分拆任務集至逐條ansible命令,按預定規則逐條執行
  • Ansible主要操作物件:
    • HOSTS主機
    • NETWORKING網路裝置
  • 注意事項
    • 執行ansible的主機一般稱為主控端,中控,master或堡壘機
    • 主控端Python版本需要2.6或以上
    • 被控端Python版本小於2.4需要安裝python-simplejson
    • 被控端如開啟SELinux需要安裝libselinux-python
    • windows不能做為主控端

安裝

rpm包安裝: EPEL源

yum install ansible
ansible不是一個服務/etc/hosts是最重要的檔案
ansible是一個管理端

編譯安裝

yum -y install python-jinja2 PyYAML python-paramiko
python-babel python-crypto
tar xf ansible-1.5.4.tar.gz
cd ansible-1.5.4
python setup.py build
python setup.py install
mkdir /etc/ansible
cp -r examples/* /etc/ansible

Git方式

git clone git://github.com/ansible/ansible.git --
recursive

cd ./ansible
source ./hacking/env-setup

pip安裝: pip是安裝Python包的管理器,類似yum

yum install python-pip python-devel
yum install gcc glibc-devel zibl-devel rpm-bulid openssl-devel
pip install --upgrade pip
pip install ansible --upgrade
  • 確認安裝: ansible –version

相關檔案

配置檔案

/etc/ansible/ansible.cfg 主配置檔案,配置ansible工作特性
/etc/ansible/hosts 主機清單被管理端的主機存放,如果將主機不寫入這個檔案則無法管理這個主機
/etc/ansible/roles/ 存放角色的目錄
  • 如果要管理的ip沒加入到hosts這檔案中則會出現這種錯誤
[[email protected] yum.repos.d]# ansible 192.168.27.101 -m ping
 [WARNING]: Could not match supplied host pattern, ignoring: all

 [WARNING]: provided hosts list is empty, only localhost is available

 [WARNING]: Could not match supplied host pattern, ignoring: 192.168.27.101

 [WARNING]: No hosts matched, nothing to do
  • 將主機加入到hosts檔案中,最簡單的方法是將要管理的主機ip寫進去,推薦,用分類的方式
    -mark
  • 分類的方式
[[email protected] yum.repos.d]# vim /etc/ansible/hosts 
#   - Blank lines are ignored
#   - Groups of hosts are delimited by [header] elements
#   - You can enter hostnames or ip addresses
#   - A hostname/ip can be a member of multiple groups
192.168.27.[101:103]   也可以寫成這種格式這表示192.168.27.101103直接的ip


# Ex 1: Ungrouped hosts, specify before any group headers.

## green.example.com
## blue.example.com
## 192.168.100.1
## 192.168.100.10

# Ex 2: A collection of hosts belonging to the 'webservers' group

## [webservers]
## alpha.example.org
## beta.example.org
## 192.168.1.100
## 192.168.1.110

# If you have multiple hosts following a pattern you can specify
# them like this:

## www[001:006].example.com

# Ex 3: A collection of database servers in the 'dbservers' group

## [dbservers]
## 
## db01.intranet.mydomain.net
## db02.intranet.mydomain.net
## 10.25.1.56
## 10.25.1.57

# Here's another example of host ranges, this time there are no
# leading 0s:

## db-[99:101]-node.example.com
  • 然後在次用ping命令來檢查主機是否活躍
  • mark
  • 因為ansible是基於shh的,第一次連結需要輸入yes/no,不是很方便,想要去掉這個yes/no需要修改配置檔案/etc/ansible/ansible.cfg這個檔案
  • mark
  • 把host_key_checking = False這一行註釋去掉
  • 在重新執行就不會提示這樣第一次yes或no
  • mark
  • 但是報錯,也沒有讓我們輸入密碼,ansible預設是基於key驗證的,如果想使用密碼在後面加-k
  • mark
  • 這樣就成功了,當然我們也可以多臺主機,主機ip之間用逗號隔開
  • mark
  • 當然我們只用輸入一遍密碼兩個主機都成功了,說明如果主機密碼不一樣會報錯
  • mark

用分組的方式將被管理主機寫如/etc/ansible/ansible.cfg檔案中

  • mark
  • 分組就是將一組主機分成一組,並在中括號裡取一個組名,一個主機可以在多個組裡。還有一個預設組就是all,這個組表示在這個檔案中的所有主機
  • mark

建立key驗證

  1. 用ssh-keygen 生成公鑰私鑰對
    • mark
[[email protected] ~]# cd ~
[[email protected] ~]# cd .ssh/
[[email protected] .ssh]# ls
id_rsa  id_rsa.pub  known_hosts
[[email protected] .ssh]# 
  1. 用ssh-copy-id 要連線的ip主機
    • mark
    • 完成key驗證後,就不用加-k選項了
    • mark

由於ansible預設是沒有啟用日誌的,所以我們要在配置檔案中啟用配置檔案

  • mark
    mark
  • 預設也是沒有啟用的,把註釋去掉啟用,當然也可改成其它路徑
  • 執行以下ansible命令,然後看一下日誌檔案
  • mark
  • 這裡面存放著命令的執行結果

程式

/usr/bin/ansible 主程式,臨時命令執行工具
/usr/bin/ansible-doc 檢視配置文件,模組功能檢視工具
/usr/bin/ansible-galaxy 下載/上傳優秀程式碼或Roles模組的官網平臺
/usr/bin/ansible-playbook 定製自動化任務,編排劇本工具
/usr/bin/ansible-pull 遠端執行命令的工具
/usr/bin/ansible-vault 檔案加密工具
/usr/bin/ansible-console 基於Console介面與使用者互動的執行工具

主機清單inventory

  • Inventory 主機清單
    • ansible的主要功用在於批量主機操作,為了便捷地使用其中的部分主機,可以在inventory file中將其分組命名
  • 預設的inventory file為/etc/ansible/hosts
  • inventory file可以有多個,且也可以通過DynamicInventory來動態生成
  • /etc/ansible/hosts檔案格式
  • inventory檔案遵循INI檔案風格,中括號中的字元為組名。可以將同一個主機同時歸併到多個不同的組中;此外,當如若目標主機使用了非預設的SSH埠,還可以在主機名稱之後使用冒號加埠號來標明
ntp.magedu.com
[webservers]
www1.magedu.com:2222
www2.magedu.com
[dbservers]
db1.magedu.com
db2.magedu.com
db3.magedu.com
  • 如果主機名稱遵循相似的命名模式,還可以使用列表的方式標識各主機
    示例
[websrvs]
www[01:100].example.com
[dbsrvs]
db-[a:f].example.com

ansible配置檔案

Ansible 配置檔案/etc/ansible/ansible.cfg (一般保持預設)
[defaults]
#inventory = /etc/ansible/hosts # 主機列表配置檔案
#library = /usr/share/my_modules/ # 庫檔案存放目錄
#remote_tmp = $HOME/.ansible/tmp #臨時py命令檔案存放在遠端主機目錄,就是當我們執行命令是相當於把命令複製到遠端主機中這個目錄下生成一個臨時檔案,執行完後刪除
#local_tmp = $HOME/.ansible/tmp # 本機的臨時命令執行目錄
#forks = 5 # 預設併發數,如果有100臺主機就會5臺5臺的執行,分批次的,也可以調100,要求機器效能好
#sudo_user = root # 預設sudo 使用者,需要在被管理主機上做sudo配置
#ask_sudo_pass = True #每次執行ansible命令是否詢問ssh密碼
#ask_pass = True
#remote_port = 22  因為是基於ssh,ssh預設是22埠,如果ssh埠號改成其它的,這裡也是要改的
#host_key_checking = False # 檢查對應伺服器的host_key,建議取消註釋

ansible系列命令

  • Ansible系列命令
ansible ansible-doc ansible-playbook ansible-vault
ansible-console ansible-galaxy ansible-pull
  • ansible-doc: 顯示模組幫助
    ansible-doc [options] [module...]
    -a 顯示所有模組的文件
    -l, --list 列出可用模組
    -s, --snippet 顯示指定模組的playbook片段

示例

ansible-doc –l 列出所有模組
ansible-doc ping 檢視指定模組幫助用法
ansible-doc –s ping 檢視指定模組幫助用法簡要資訊
  • mark
  • mark
  • ansible通過ssh實現配置管理、應用部署、任務執行等功能,建議配置ansible端能基於金鑰認證的方式聯絡各被管理節點
  • ansible [-m module_name] [-a args]
--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 執行遠端執行的使用者,指定以哪個使用者執行,如果不指定則預設是root
-b, --become 代替舊版的sudo 切換
  • 顯示主機列表
  • mark
  • 指定使用者
  • mark
  • 也可以用sudo,提前是要把對端主機上配置好sudo檔案
    1. 配置sudo檔案,這裡我們直接把使用者加入wheel組中,因為wheel組中在sudo是一個管理員組,擁有root的許可權
  • mark
  • 這裡用command模組是命令模組,加-a是可以後面跟引數,但是這裡報錯,讓我們輸入sudo的密碼加上大K引數
  • mark
  • 這裡會讓輸入兩邊口令,一個是guo使用者ssh的口令,一個sudo的口令,這樣會很麻煩,我們改一下sudo配置檔案設定成不輸入此密碼,在/etc/sudoers
  • mark
  • 這樣就只用輸入一個ssh口令了
    mark

如何將guo使用者也設定成key驗證呢

  1. 用命令ssh-copy-i [email protected]
    -mark
    • 在執行以下就不用輸入密碼了
    • mark
usermod -aG wheel guo

ansible的Host-pattern

  • ansible的Host-pattern
    • 匹配主機的列表
    • All :表示所有Inventory中的所有主機
      • ansible all –m ping
    • *:萬用字元
      • ansible “*” -m ping 這個”*”號相當於all全部主機
        “`bash
      • mark
      • ansible 192.168.1.* -m ping
      • ansible “*srvs” -m ping
    • 或關係
      • ansible “websrvs:appsrvs” -m ping 表示這兩個都執行可以加多個
      • ansible “192.168.1.10:192.168.1.20” -m ping
      • mark
  • 邏輯與
    • ansible ‘websrvs:&dbsrvs’ –m ping 就是取交集
      • 在websrvs組並且在dbsrvs組中的主機
      • mark
  • 邏輯非
    • ansible ‘websrvs:!dbsrvs’ –m ping
    • 在websrvs組,但不在dbsrvs組中的主機
    • mark
  • 綜合邏輯
    • ansible ‘websrvs:dbsrvs:&appsrvs:!ftpsrvs’ –m ping
  • 正則表示式
    • ansible “websrvs:&dbsrvs” –m ping
    • ansible “~(web|db).*.magedu.com” –m ping
    • mark
    • mark
      • 這裡的波浪符表示是一個正則表示式,點在正則表示任意字元,所有要用反向單引號轉義

ansible命令執行過程

  • ansible命令執行過程可以用-vvv來檢視執行過程
  • 可以用-vvv來檢視命令執行的詳細過程[[email protected] ~]# ansible ‘~(web|db|ag)ser’ -m command -a “ls /root” -vvv
    1. 載入自己的配置檔案 預設/etc/ansible/ansible.cfg
    2. 載入自己對應的模組檔案,如command
    3. 通過ansible將模組或命令生成對應的臨時py檔案,並將該 檔案傳輸至遠端伺服器的對應執行使用者$HOME/.ansible/tmp/ansible-tmp-數字/XXX.PY檔案
    4. 給檔案+x執行
    5. 執行並返回結果
    6. 刪除臨時py檔案,sleep 0退出
  • 執行狀態:
    • 顏色的定義在ansible的配置檔案裡定義的
    • mark
    • 綠色:執行成功並且不需要做改變的操作
    • 黃色:執行成功並且對目標主機做變更
    • 紅色:執行失敗

ansible使用示例

  • 以wang使用者執行ping存活檢測
    • ansible all -m ping -u wang -k
  • 以wang sudo至root執行ping存活檢測
    • ansible all -m ping -u wang –b -k
  • 以wang sudo至mage使用者執行ping存活檢測
    • ansible all -m ping -u wang –b -k –become-user mage
  • 以wang sudo至root使用者執行ls
    • ansible all -m command -u wang –become-user=root -a’ls /root’ -b –k -K

ansible常用模組

  • ping :探測對方主機是否在開機,這裡的ping模組並不是用ICMP協議的
    “bash
    將主機設定為禁止ping
    [[email protected] ~]# cat /proc/sys/net/ipv4/icmp_echo_ignore_all
    0
    [[email protected] ~]# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
    現在在測這個主機
    [[email protected] .ssh]# ansible 192.168.27.101 -m ping
    192.168.27.101 | SUCCESS => {
    “changed”: false,
    “ping”: “pong”
    }
    [[email protected] .ssh]# ping 192.168.27.101
    PING 192.168.27.101 (192.168.27.101) 56(84) bytes of data.
    ^C
    — 192.168.27.101 ping statistics —
    6 packets transmitted, 0 received, 100% packet loss, time 5002ms
    如果把ssh服務停了也是可以執行成功的,只有把網路服務停了才會失敗
> Command:在遠端主機執行命令,預設模組,可忽略-m選項  
-a是後面要執行的引數  
- 引數
    + chdir 執行command命令前先cd到這個目錄
    + creates 如果這個引數對應的檔案存在,就不執行command
    + executable 將shell切換為command執行,這裡的所有命令需要使用絕對路徑
    + removes 如果這個引數對應的檔案不存在,就不執行command
```bash  
ansible srvs -m command -a 'service vsftpd start'
ansible srvs -m command -a 'echo magedu |passwd --stdin wang' 不成功
此命令不支援 $VARNAME < > | ; & 等,用shell模組實現
用chdir進入到某個目錄來執行引數
[[email protected] ~]# ansible 'dbser' -m command -a 'chdir=/app/ ls'
192.168.27.102 | SUCCESS | rc=0 >>
123

192.168.27.128 | SUCCESS | rc=0 >>
1
aaa
access_log
awk.txt
dir
f1.txt
f2
lost+found
passwd
[[email protected] ~]# ansible 'dbser' -m command -a 'chdir=/app/ creates=123 ls'  
192.168.27.102 | SUCCESS | rc=0 >>
skipped, since 123 exists  這裡寫著123這個檔案存在就跳過,而另一個主機沒有對應的檔案所有執行ls

192.168.27.128 | SUCCESS | rc=0 >>
1
aaa
access_log
awk.txt
dir
f1.txt
f2
lost+found
passwd




<div class="se-preview-section-delimiter"></div>
  • mark
  • 如果檔案不存在則不執行
    mark

    Shell:和command相似,用shell執行命令

  • 常用引數
    • chdir 跟command一樣的,執行shell之前cd到某個目錄
    • creates 跟command一樣的,如果某個檔案存在則不執行shell
    • remove 跟command一樣的,如果某個檔案不存在則不執行shell
ansible srv -m shell -a 'echo magedu |passwd –stdin wang'
呼叫bash執行命令 類似 cat /tmp/stanley.md | awk -F'|''{print $1,$2}' &> /tmp/example.txt 這些複雜命令,即使使用shell也可能會失敗,解決辦法:寫到指令碼時,copy到遠端,執行,再把需要的結果拉回執行命令的機器
檢視主機名
[[email protected] ~]# ansible 'dbser' -m shell -a  'echo $HOSTNAME'
192.168.27.102 | SUCCESS | rc=0 >>
102

192.168.27.128 | SUCCESS | rc=0 >>
centos6.magedu.com
體驗shell和command的區別,先cd到某個需要編譯的目錄,執行condifgure然後,編譯,然後安裝。
 ansible -i hosts all -m shell -a "./configure && make && make insatll" chdir=/xxx/yyy/
 shell也支援條件判斷&&||
 [[email protected] ~]# ansible 'dbser' -m shell -a 'grep -q root /etc/passwd && ls /app'
192.168.27.102 | SUCCESS | rc=0 >>
123

192.168.27.128 | SUCCESS | rc=0 >>
1
aaa
access_log
awk.txt
dir
f1.txt
f2
lost+found
passwd

[[email protected] ~]# ansible 'dbser' -m shell -a 'grep -q rootsd /etc/passwd && ls /app'
192.168.27.102 | FAILED | rc=1 >>
non-zero return code   如果沒有則會出現非0錯誤碼

192.168.27.128 | FAILED | rc=1 >>
non-zero return code




<div class="se-preview-section-delimiter"></div>

Script:執行指令碼
- 相當於先把指令碼傳到遠方節點,然後在執行
- mark

-a "/PATH/TO/SCRIPT_FILE"
snsible websrvs -m script -a f1.sh




<div class="se-preview-section-delimiter"></div>

Copy:從伺服器複製檔案到客戶端
- 常用引數
+ src
+ 用於定位ansible執行的機器上的檔案,需要絕對路徑。如果拷貝的是資料夾,那麼資料夾會整體拷貝,如果結尾是”/”,那麼只有資料夾內的東西被考過去。一切的感覺很像rsync,源地址
+ content
+ 用來替代src,用於將指定檔案的內容,拷貝到遠端檔案內
+ dest
+ 用於定位遠端節點上的檔案,需要絕對路徑。如果src指向的是資料夾,這個引數也必須是指向資料夾,目標檔案
+ backup
+ 備份遠端節點上的原始檔案,在拷貝之前。如果發生什麼意外,原始檔案還能使用。
+ directory_mode
+ 這個引數只能用於拷貝資料夾時候,這個設定後,資料夾內新建的檔案會被拷貝。而老舊的不會被拷貝
+ follow
+ 當拷貝的資料夾內有link存在的時候,那麼拷貝過去的也會有link
+ force
+ 預設為yes,會覆蓋遠端的內容不一樣的檔案(可能檔名一樣)。如果是no,就不會拷貝檔案,如果遠端有這個檔案
+ group
+ 設定一個群組擁有拷貝到遠端節點的檔案許可權
+ mode
+ 等同於chmod,引數可以為“u+rwx or u=rw,g=r,o=r”
+ owner
+ 設定一個使用者擁有拷貝到遠端節點的檔案許可權
- 把複製selinux配置檔案
- mark
- mark
- 看一下備份檔案
- mark
- 也可以改許可權,所屬組,或所有者
- mark
- mark

也可以把內容複製到指定的檔案中
[[email protected] ~]# ansible cen7 -m copy -a 'content="df-h\nhhhhhhhhhhh\nls\n" dest=/app/f1.sh'
[[email protected] ~]# ansible cen7 -a 'cat /app/f1.sh'
192.168.27.102 | SUCCESS | rc=0 >>
df-h
hhhhhhhhhhh
ls

192.168.27.101 | SUCCESS | rc=0 >>
df-h
hhhhhhhhhhh
ls




<div class="se-preview-section-delimiter"></div>
ansible srv -m copy -a "src=/root/f1.sh dest=/tmp/f2.sh owner=wang mode=600 backup=yes"
如目標存在,預設覆蓋,此處指定先備份
ansible srv -m copy -a "content='test content\n' dest=/tmp/f1.txt" 利用內容,直接生成目標檔案

Cron:計劃任務

支援時間:minute,hour,day,month,weekday
ansible srv -m cron -a "minute=*/5 job='/usr/sbin/ntpdate 172.16.0.1 &>/dev/null'
name=Synctime" 建立任務
ansible srv -m cron -a 'state=absent
name=Synctime' 刪除任務
範例1:每五分鐘週六週日執行
[[email protected] ~]# ansible cen7 -m cron -a 'minute=*/5 weekday=0,6 job="/usr/bin/wall cront job" name="test"'
name就是給這個計劃任務起個名字
job表示要執行的命令或操作但是命令要寫絕對路徑
[[email protected] ~]# ansible cen7 -a 'crontab -l'
192.168.27.102 | SUCCESS | rc=0 >>
#Ansible: test
*/5 * * * 0,6 /usr/bin/wall cront job
範例2:禁用範例1的計劃任務
[[email protected] ~]# ansible cen7 -m cron -a 'disabled=true job="/usr/bin/wall cront job" name=test ' 
必須要job
[[email protected] ~]# ansible cen7 -a 'crontab -l'
192.168.27.101 | SUCCESS | rc=0 >>
#Ansible: test
#* * * * * /usr/bin/wall cront job
開啟是disabled=no

Fetch:從客戶端取檔案至伺服器端,copy相反,目錄可先tar

ansible srv -m fetch -a 'src=/root/a.sh dest=/data/scripts'
  • 範例2,將遠端主機的passwd檔案複製到本機上
[[email protected] ~]# ansible cen7 -m fetch -a 'src=/etc/passwd dest=/app/'
這裡的src是遠端主機的路徑,dest是本地路徑檔案要複製到哪裡
在本機會成一個遠端主機ip名字的一個目錄裡面存放著檔案
[[email protected] ~]# tree /app/
/app/
├── 192.168.27.101
│   └── etc
│       └── passwd
└── 192.168.27.102
    └── etc
        └── passwd
  • 範例3.將日誌檔案打包壓縮,並複製到本地主機上
[[email protected] ~]# ansible cen7 -m shell -a 'tar Jcf /app/log.tar.xz /var/log/*.log' 
[[email protected] ~]# ansible cen7 -m fetch -a 'src=/app/log.tar.xz dest=/app/' 
  • 有專門的tar模組可以將打包並複製

File:設定檔案屬性和管理檔案
- file模組它包含了檔案、資料夾、超級連結類的創立、拷貝、移動、刪除操作。
- 常見引數
+ follow
+ 如果原來的檔案是link,拷貝後依舊是link
+ force
+ 強制執行,沒說的
+ group
+ 設定所屬組許可權
+ mode
+ 等同於chmod,引數可以為“u+rwx or u=rw,g=r,o=r”
+ owner
+ 設定檔案的所有者
+ path
+ 目標路徑,也可以用dest,name代替
+ src
+ 待拷貝檔案/資料夾的原始位置。
+ state = ile/link/directory/hard/touch/absent
+ file代表拷貝後是檔案;link代表最終是個軟連結;directory代表資料夾;hard代表硬連結;touch代表生成一個空檔案;absent代表刪除

ansible srv -m file -a "path=/root/a.sh owner=wang mode=755"
ansible web -m file -a 'src=/app/testfile dest=/app/testfile-link state=link'
  • 範例1:建立一個空檔案
[[email protected] ~]# ansible cen7 -m file -a 'path=/app/testfile state=touch'
192.168.27.101 | SUCCESS => {
    "changed": true, 
    "dest": "/app/testfile", 
    "gid": 0,   組id
    "group": "root",  所屬組
    "mode": "0644",   檔案許可權
    "owner": "root",  所有者
    "secontext": "unconfined_u:object_r:default_t:s0", 
    "size": 0,  大小
    "state": "file",   
    "uid": 0  
}
  • 範例2:把範例1建立的檔案建立一個軟連線
[[email protected] ~]# ansible cen7 -m file -a 'src=/app/testfile path=/app/testlink state=link'
[[email protected] ~]# ansible cen7 -a 'ls -l /app/'   ansible不支援別名命令
lrwxrwxrwx. 1 root root   13 Jan 14 20:18 testlink -> /app/testfile
  • 範例3:建立一個資料夾,推薦用file模組因為比較穩定
方法一[[email protected] ~]# ansible cen7 -a 'mkdir /app/mk1'
方法二[[email protected] ~]# ansible cen7 -m file -a 'path=/app/mk2 state=directory'
  • 範例4:刪除資料夾或檔案
[[email protected] ~]# ansible cen7 -m file -a 'path=/app/mk1 state=absent'
[[email protected] ~]# ansible cen7 -m file -a 'path=/app/fstab state=absent'
  • 範例5:清空整個資料夾
[[email protected] ~]# ansible cen7 -m shell -a 'rm -rf /app/*'
 ansible cen7 -m file -a 'path=/app state=absent'

Hostname:管理主機名這裡改名是永久改,會把配置檔案改掉

ansible node1 -m hostname -a "name=websrv"
ansible 192.168.27.101 -m hostname -a 'name=g101.com' 

Yum:管理包
- 常用引數
+ disable_gpg_check
+ 在安裝包前檢查包,只會影響state引數為present或者latest的時候
+ name
+ 你需要安裝的包的名字,也能如此使用name=python=2.7安裝python2.7
+ state present/latest/absent
+ 用於描述安裝包最終狀態,present/latest用於安裝包,absent用於remove安裝包
+ update_cache
+ 用於安裝包前執行更新list,只會影響state引數為present/latest的時候
- 範例1:安裝一個包,做這些一定要yum配置好

[[email protected] ~]# ansible cen7 -m yum -a 'name=tree state=present'
name是要安裝的包名,
如果是安裝的話預設可以不寫state=present,預設是安裝
當然也可以用命令模組安裝或解除安裝包
  • 範例2:可以安裝包最新版
[[email protected] ~]# ansible cen7 -m yum -a 'name=dstat state=latest'
  • 範例3:也可以一次性安裝多個包,包之間用逗號隔開
[[email protected] ~]# ansible cen7 -m yum -a 'name=httpd,vsftpd state=present'
ansible srv -m yum -a 'name=httpd state=latest' 安裝
ansible srv -m yum -a 'name=httpd state=absent' 刪除

Service:管理服務
- 常用引數
+ enabled
+ 啟動os後啟動對應service的選項。使用service模組的時候,enabled和state至少要有一個被定義,設定成開機啟動
+ name
+ 需要進行操作的service名字
+ state stared/stoped/restarted/reloaded
+ service最終操作後的狀態。
- 範例1啟動服務並設定開機啟動

[[email protected] ~]# ansible cen7 -m service -a 'name=httpd state=started enabled=yes'
這相當於先啟動服務,然後在把服務設定成開機啟動
  • ansible service 模組一條命令只能支援一個服務,name只能寫一個
 ansible srv -m service -a 'name=httpd state=stopped'
 ansible srv -m service -a 'name=httpd state=started'
 ansible srv –m service –a 'name=httpd state=reloaded'
 ansible srv -m service -a 'name=httpd state=restarted'

User:管理使用者
- 常用引數
+ home
+ 指定使用者的家目錄
+ groups
+ 使用者的所屬組可以指定多個用逗號分隔
+ uid
+ 指定使用者uid
+ name
+ 要建立的使用者名稱
+ createhome
+ 是否建立家目錄 yes|no
+ system
+ 是否為系統使用者
+ remove
+ 當state=absent時,remove=yes則表示連同家目錄一起刪除,等價於userdel -r
+ state
+ 是建立還是刪除,預設是建立
+ shell
+ 指定使用者的shell環境
+ password
+ 指定使用者的密碼
- 範例1:建立一個test1使用者,uid=2000,主組是guo,附屬組是root,bin.指定家目錄為根下 還有描述

[[email protected] ~]# ansible cen7 -m user -a 'name=test1 comment="test is user" uid=2000 home=/test group=guo groups=root,bin'
192.168.27.101 | SUCCESS => {
    "changed": true, 
    "comment": "test is user", 
    "createhome": true, 
    "group": 1000, 
    "groups": "root,bin", 
    "home": "/test", 
    "name": "test1", 
    "shell": "/bin/bash", 
    "state": "present", 
    "system": false, 
    "uid": 2000
}
  • 範例2:建立一個系統使用者,系統使用者是沒有家目錄的所以要加上createhome=no不建立家目錄,如果不加這個選項則是預設建立家目錄
[[email protected] ~]# ansible cen7 -m user -a 'name=systemuser system=yes createhome=no' 
192.168.27.102 | SUCCESS => {
    "changed": true, 
    "comment": "", 
    "createhome": false, 
    "group": 996, 
    "home": "/home/systemuser",   雖然這裡顯示是建立的,但是事實是沒有建立
    "name": "systemuser", 
    "shell": "/bin/bash", 
    "state": "present", 
    "system": true, 
    "uid": 998
}
  • 範例3:刪除一個普通使用者,包括家目錄以前刪除當state=absent時remove=yes則表示連同家目錄一起刪除,如果只選state=absent則只刪除使用者,而不會刪除家目錄
[[email protected] ~]# ansible cen7 -m user -a 'name=test1 state=absent remove=yes' 
192.168.27.101 | SUCCESS => {
    "changed": true, 
    "force": false, 
    "name": "test1", 
    "remove": true, 
    "state": "absent"
}
ansible srv -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'
刪除使用者及家目錄等資料

Group:管理組
+ 和user引數一樣
- 範例1:建立組

[[email protected] ~]# ansible cen7 -m group -a 'name=group1'
  • 範例2:刪除一個組
[[email protected] ~]# ansible cen7 -m group -a 'name=group1 state=absent'
 ansible srv -m group -a "name=testgroup system=yes"
 ansible srv -m group -a "name=testgroup state=absent"

ansible系列命令

  • ansible-galaxy
    • 連線 https://galaxy.ansible.com 下載相應的roles
      • 這個網站是官方的,國外的一些大神做的比較好的playbook,和一些角色,會傳到這裡,可以下載使用或者參考
    • mark
    • 列出所有已安裝的galaxy
      • ansible-galaxy list
    • 安裝galaxy
      • ansible-galaxy install geerlingguy.redis
      • 就將網站上的角色名寫著就可以
        bash
        [[email protected] ~]# ansible-galaxy install geerlingguy.nginx</li>
        <li>downloading role 'nginx', owned by geerlingguy</li>
        <li>downloading role from https://github.com/geerlingguy/ansible-role-nginx/archive/2.5.0.tar.gz</li>
        <li>extracting geerlingguy.nginx to /root/.ansible/roles/geerlingguy.nginx 這裡顯示了下載的位置</li>
        <li>geerlingguy.nginx (2.5.0) was installed successfully
      • 下載完後可以用ansible-galaxy list 檢視
      • 進入目錄看一下里面的內容
        bash
        [

        相關推薦

        3.2 企業自動化ansible

        改變 com 主機 xxx shell 錯誤 之前 python2 awk ansible的Host-pattern ansible的Host-pattern 匹配主機的列表All :表示所有Inventory中的所有主機 ansible all –m ping:通配符

        企業自動化ansible

        自動化運維工具ansible 運維自動化發展歷程及技術應用 雲端計算工程師核心職能 Linux運維工程師職能劃分 自動化動維應用場景 檔案傳輸 命令執行 應用部署 配置管理 任務流編排 企業實際應用場景分析

        自動化 ansible

        style alt 技術 ble 分享 流程 命令詳解 ext ansi 1. 如何添加機器 2.ansible 命令格式 3. 執行 ping 的流程 4. ansible 命令詳解 5. 什麽事Inventory 7

        Linux下的自動化ansible工具

        使用 輕量級 工具輕松 什麽是自動化運維 隨著信息時代的持續發展,IT運維已經成為IT服務內涵中重要的組成部分。面對越來越復雜的業務, 面對越來越多樣化的用戶需求,不斷擴展的IT應用需要越來越合理的模式來保障IT服務能靈活便捷、安 全穩定地持續保障,這種模式中的保障因素就是IT運維(其他因素

        Linux的企業-自動化工具Saltstack(grains、pillar)

        saltstack grains、pillar jinja、haproy+keeplived配置內容接上篇redhat6.5server1 172.25.29.1 salt-master server2 172.25.29.2 salt-minion haproy+keeplivedserver3 172

        自動化Ansible之Playbook劇本(持續更新)

        tar mysqld 單引號 number 雙引號 布爾型 virt 控制 apache 附上前兩篇關於Ansible的博客地址,以供查閱,歡迎學習交流!自動化運維之Ansible概述及Ansible部署Ansible命令應用之常用模塊 Playbook簡介 playb

        自動化Ansible之Playbook劇本

        rep .com ddb res ansible命令 指定 ansible 返回 at-t Playbook介紹 Playbook是由一個或多個play組成的列表,主要功能是將task定義好的角色並為一組進行統一管理,也就是通過task調用Ansible的模板將多個play

        自動化Ansible之Roles部署配置LAMP架構

        -o role yum 基於 eve 介紹 rip enable file Roles介紹 Ansible為了層次化、結構化地組織Playbook,使用了角色(roles)。Roles能夠根據層次型結構自動裝載變量文件、task以及handlers等。簡單來講,roles就

        自動化Ansible之playbook劇本的使用

        就是 version 就會 方法 shel remote httpd服務 template manual YAML簡介 YAML是一種表達資料序列的格式,由於參考了其他多種語言,所以具有很高的可讀性。其特性如下: 具有很好的可讀性,易於實現 表達能力強,擴展性好 和腳本語

        自動化-Ansible(第一部)

        eno 一個 什麽是 準備 vpd -- p地址 自動化運維 cfengine 前言 什麽是自動化運維? 現如今的 IT 運維已經成為IT服務內涵中重要的組成部分。面對越來越復雜的業務,面對越來越多樣化的用戶需求,不斷擴展的IT應用需要越來越合理的模式來保障IT服務能靈活

        自動化-Ansible (第二部)

        get 取值 基本語法 restart mode 自帶 登陸 image war Ansible 命令應用基礎 之前的一篇文章講到了Ansible 的安裝和作用,有興趣的可以看看Ansible 介紹與安裝。學習 ansible 就是重新學習一次命令和語法。 A

        自動化Ansible批量部署服務+shell腳本批量推送公鑰

        大數據平臺 不用 send 指定 主機ip http 產品 oca 負責 一、概述分析 由於互聯網的快速發展導致產品更新換代速度逐漸加快,運維人員每天都要進行大量的維護操作,仍舊按照傳統方式進行維護會使得工作效率低下。這時,部署自動化運維就可以盡可能安全、高效地完成這些工

        自動化-Ansible (第三部:Playbook 介紹)

        blog comm 擴展性 變量 wal ansi .com 基礎 fire 前言 之前有兩篇文章分別講了 Ansible 的部署、Ansible 的 模塊使用,對 Ansible 有了最初的了解,這篇文章最主要是要介紹 Playbook。需要了解 Ansible 的部署請

        自動化Ansible(上)

        一:為什麼選擇Ansible   相對於puppet和saltstack,ansible無需客戶端,更輕量級   ansible甚至都不用啟動服務,僅僅只是一個工具,可以很輕鬆的實現分散式擴充套件   更強的遠端命令執行操作   不輸於puppet和saltstack

        python自動化-Ansible配置執行1

        一 環境準備 Python Setuptools Pip(可選) 二 Ansible快速安裝 1 安裝pip:ease_install pip 2 安裝Ansible:pip install ansible 三 Ansibl

        python自動化-Ansible介紹

        一 Ansible是什麼 Ansible是一個自動化管理IT資源的工具 1 自動化 2 管理 3 IT資源 二 Ansible功能有哪些 1 系統環境配置 2 安裝軟體 3 持續整合

        自動化Ansible實踐(二)

        ack bae syn 如果 ddr help names tro hup 上篇提到了ansible基本安裝、配置及命令行使用,這篇分享下ansible的高級用法即playbook,在生產環境如果需要完成負責任務,如大批量服務安裝配置等,可以采用playbook方式來完成,

        自動化Ansible實踐(一)

        rsync playbook 內容修改 play 密碼認證 自動化 config false 輸出信息 第 1 章 Ansible概述 1.1 IT自動化的好處1.1.1 團隊影響? 節省時間,提高工作效率? 消除重復任務? 更少的錯誤風險? 改善協作和

        自動化Ansible之常用模組

        [TOC] # 0、Ansible模組語法 在ansible中是指需要快速執行一條命令,並且不需要儲存的命令,對於複雜的命令則為playbook 檢視模組幫助:ansible-doc -l ```bash // 統計模組數量 $ ansible-doc -l |wc -l 3387 // ansi

        企業輕量級自動化工具—ansible(常見的錯誤解決,免秘鑰互信,常用的模塊)

        企業 輕量級 自動化 企業輕量級自動化運維工具—ansible1.ansible簡介 ansible是“Ansible is Simple IT Automation”——簡單的自動化IT工具。它可以做到自動化部署APP;自動化管理配置項;自動化的持續交付;自動化的(AWS)雲服務管理。可實