10.Python之Ansible自動化運維經常使用模塊

 

Ansible中文權威文檔:http://www.ansible.com.cn/docs/html

Ansible從入門到精通:https://www.bilibili.com/video/av33611758/?p=1python

Ansible工做原理:nginx

1.管理端支持local 、ssh、zeromq 三種方式鏈接被管理端,默認使用基於ssh的鏈接git

2.能夠按應用類型等方式進行Host Inventory(主機羣)分類,管理節點經過各種模塊實現相應的操做---單個模塊,單條命令的批量執行,咱們能夠稱之爲ad-hoc;web

3.管理節點能夠經過playbooks 實現多個task的集合實現一類功能,如web服務的安裝部署、數據庫服務器的批量備份等。playbooks咱們能夠簡單的理解爲,系統經過組合多條ad-hoc操做的配置文件 。正則表達式

Ansible配置文件:shell

/etc/ansible/ansible.cfg 主配置文件,配置ansible工做特性 /etc/ansible/hosts 主機清單 /etc/ansible/roles/ 存放角色的目錄

Ansible免密登錄:數據庫

ansible使用ssh登陸,因此要在二者之間配置祕鑰登陸,這樣才能開始正常的工做apache

ssh-keygen -t rsa -P "" #生成祕鑰/root/.ssh/id_rsa.pub
ssh
-copy-id -i ./.ssh/id_rsa.pub root@192.168.0.1 #將公鑰傳到192.168.0.1上

其中192.168.0.1是要被監控的機器

實現了master與其餘節點之間的鏈接ubuntu

介紹一下Ansible命令:

  • 功能:經過ssh實現配置管理、應用部署、任務執行等功能

  • 建議:配置ansible端能基於密鑰認證的方式聯繫各被管理節點

  • 格式:ansible <host-pattern>  [-m module_name]  [-a args]

  • 經常使用選項:
-m MODULE_NAME, --module-name=MODULE_NAME 要執行的模塊,默認爲 command -a MODULE_ARGS, --args=MODULE_ARGS 模塊的參數 -u REMOTE_USER, --user=REMOTE_USER ssh 鏈接的用戶名,默認用 root,ansible.cfg 中能夠配置 -k, --ask-pass 提示輸入 ssh 登陸密碼,當使用密碼驗證登陸的時候用 -s, --sudo sudo 運行 -U SUDO_USER, --sudo-user=SUDO_USER sudo 到哪一個用戶,默認爲 root -K, --ask-sudo-pass 提示輸入 sudo 密碼,當不是 NOPASSWD 模式時使用 -B SECONDS, --background=SECONDS       run asynchronously, failing after X seconds(default=N/A) -P POLL_INTERVAL, --poll=POLL_INTERVAL      set the poll interval if using
-B (default=15) -C, --check 只是測試一下會改變什麼內容,不會真正去執行 -c CONNECTION   鏈接類型(default=smart) -f FORKS, --forks=FORKS     fork 多少個進程併發處理,默認 5
-i INVENTORY, --inventory-file=INVENTORY      指定hosts文件路徑默認 default =/etc/ansible/hosts -l SUBSET, --limit=SUBSET       指定一個 pattern,對<host_pattern>已經匹配的主機中再過濾一次 --list-hosts 只打印有哪些主機會執行這個 playbook 文件:不是實際執行該 playbook -M MODULE_PATH, --module-path=MODULE_PATH       要執行的模塊的路徑,默認爲/usr/share/ansible/
-o, --one-line 壓縮輸出,摘要輸出 --private-key=PRIVATE_KEY_FILE 私鑰路徑 -T TIMEOUT, --timeout=TIMEOUT   ssh 鏈接超時時間,默認 10-t TREE, --tree=TREE 日誌輸出到該目錄,日誌文件名會以主機名命名 -v, --verbose   verbose mode (-vvv for more, -vvvv to enable connection debugging)

這裏主要講一下<host-pattern>的匹配規則:

ALL 表示列表中的全部主機 例:ansible all -m ping #匹配全部主機 

* 支持通配符
例: ansible "*" -m ping #匹配全部主機
ansible 192.168.1.* -m ping #匹配IP地址以192.168.1開頭的主機
ansible 「*srvs」 -m ping # 匹配分組名 以 srvs結尾的主機

邏輯或:只要存在websrvs或appsrvs組中的主機
例: ansible 「websrvs:appsrvs」 -m ping
ansible 「192.168.1.10:192.168.1.20」 -m ping

邏輯與:同時在websrvs組和dbsrvs組中的主機
ansible 「websrvs:&dbsrvs」 -m ping

邏輯非:在websrvs組,但不在dbsrvs組中的主機
ansible ‘websrvs:!dbsrvs’ -m ping

綜合邏輯:ansible ‘websrvs:dbsrvs:&appsrvs:!ftpsrvs’ -m -ping

正則表達式:ansible 「websrvs:&dbsrvs」 -m ping ansible 「~(web|db).*\.magedu\.com」 -m ping

Ansible執行命令過程:

  • 加載本身的配置文件 默認/etc/ansible/ansible.cfg
  • 加載本身對應的模塊文件,如command
  • 經過ansible將模塊或命令生成對應的臨時py文件,並將該文件傳輸至遠程服務器的對應執行用戶
  • $HOME/.ansible/tmp/ansible-tmp-數字/XXX.PY文件
  • 給文件+x執行
  • 執行並返回結果
  • 刪除臨時py文件,sleep 0退出

Ansible命令工具:

  • ansible主程序,臨時命令執行工具
  • ansible-doc 查看配置文檔,模塊功能查看工具
  • ansible-galaxy 下載/上傳優秀代碼或Roles模塊的官網平臺
  • ansible-playbook 定製自動化任務,編排劇本工具
  • ansible-pull 遠程執行命令的工具
  • ansible-vault 文件加密工具
  • ansible-console 基於Console界面與用戶交互的執行工具

Ansible經常使用模塊:

ansible 默認提供了不少模塊來供咱們使用。在 Linux 中,咱們能夠經過 ansible-doc -l 命令查看到當前 ansible 都支持哪些模塊,經過 ansible-doc -s 模塊名 又能夠查看該模塊有哪些參數可使用。

這裏主要介紹Ansible經常使用模塊:

ping 模塊
yum 模塊
copy 模塊
file 模塊
service 模塊
user 模塊
group模塊
cron 模塊
template 模塊
setup 模塊
fetch 模塊
apt 模塊
command 模塊
shell 模塊
script 模塊

1.ping模塊

檢查指定節點機器是否還能連通,用法很簡單,不涉及參數,主機若是在線,則回覆pong

ansible <host-pattern> -m ping

<host-pattern>匹配規則參考上面

2.yum 安裝包模塊

yum安裝vsftpd包:(默認state=installd) ansible all -m yum -a 'name=vsftpd' 

安裝多個包用逗號隔開: ansible all -m yum -a 'name=vsftpd,httpd'

顯示全部已安裝的包: ansible all -m yum -a 'name=vsftpd list=installd'

卸載vsftpd包: ansible all -m yum -a 'name=vsftpd state=removed'

安裝從互聯網下載的包: ansible srv -m copy -a 'src=/root/package.rpm dest=/data/package' ansible srv -m yum -a 'name=/data/package.rpm'

更新緩存: ansible srv -m yum -a 'update_cache=yes'


更新緩存同時安裝dstat包 ansible srv -m yum -a 'name=dstat update_cache=yes'

參數詳解:

- config_file:yum的配置文件 (optional)

- disable_gpg_check:關閉gpg_check (optional)

- disablerepo:不啓用某個源 (optional)

- enablerepo:啓用某個源(optional)

- name:要進行操做的軟件包的名字,默認最新的程序包,指明要安裝的程序包,能夠帶上版本號,也能夠傳遞一個url或者一個本地的rpm包的路徑

- state:狀態(present,absent,latest),表示是安裝還卸載
       present:默認的,表示爲安裝
       lastest: 安裝爲最新的版本
       absent:表示刪除

3.copy 複製文件模塊

ansible srv -m copy -a "src=/root/f1.sh dest=/tmp/f2.sh mode=600 backup=yes"
如目標存在,默認覆蓋,此處指定先備份

ansible srv -m copy -a "content='test content\n' dest=/tmp/f1.txt"
利用內容,直接生成目標文件

參數詳解:

- update_cache: 更新緩存

- name: 要建立的文件名字

- state: 狀態(present,absent,latest),表示是安裝還卸載
   present:默認的,表示爲安裝
   lastest: 安裝爲最新的版本
   absent:表示刪除
- mode: 目標文件的權限模式,模式能夠被指定爲符號模式(例如,u + rwx 或 u = rw,g = r,o = r)

- backup: 若是原目標文件存在,則先備份目標文件

- force: 是否強制覆蓋,默認爲yes

- owner: 目標文件屬主

- group: 目標文件屬組

4.file 文件操做模塊

建立新文件: ansible all -m file -a 'name=/data/f3 state=touch' 刪除文件: ansible all -m file -a 'name=/data/f3 state=absent' 建立目錄: ansible all -m file -a 'name=/data/dir1 state=directory' 刪除目錄: ansible all -m file -a 'name=/data/dir1 state=absent' 建立軟鏈接: ansible all -m file -a 'src=/etc/fstab dest /data/fstab.link state=link' 刪除軟鏈接: ansible all -m file -a 'dest /data/fstab.link state=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'

參數詳解:

- force:須要在兩種狀況下強制建立軟連接,一種是源文件不存在但以後會創建的狀況下;另外一種是目標軟連接已存在,須要先取消以前的軟鏈,而後建立新的軟鏈,有兩個選項:yes|no

- group:定義文件/目錄的屬組

- mode:定義文件/目錄的權限

- owner:定義文件/目錄的屬主

- path:必選項,定義文件/目錄的路徑

- recurse:遞歸的設置文件的屬性,只對目錄有效

- src:要被連接的源文件的路徑,只應用於state=link的狀況

- dest:被連接到的路徑,只應用於state=link的狀況

- state:
   directory:若是目錄不存在,建立目錄
   file:即便文件不存在,也不會被建立
   link:建立軟連接
   hard:建立硬連接
   touch:若是文件不存在,則會建立一個新的文件,若是文件或目錄已存在,則更新其最後修改時間
   absent:刪除目錄、文件或者取消連接文件

5.service 管理服務模塊

中止httpd服務: ansible srv -m service -a 'name=httpd state=stopped' 

開啓httpd服務: ansible srv -m service -a 'name=httpd state=started’

從新加載httod服務: ansible srv -m service -a 'name=httpd state=reloaded’

重啓httpd服務: ansible srv -m service -a 'name=httpd state=restarted’

開啓ftp服務,同時設置開機自動啓動: ansible srv -m service -a 'name=vsftpd state=started enabled=yes’

重啓ftp服務: ansible srv -m service -a 'name=vsftpd state=restarted'

參數詳解:

- arguments:給命令行提供一些選項

- enabled:是否開機啓動 yes|no, 要求狀態(state)和啓用(enabled)中至少有一個。

- name:必選項,服務名稱

- runlevel:運行級別

- sleep:若是執行了restarted,在則stop和start之間沉睡幾秒鐘

- state:對當前服務執行啓動,中止、重啓、從新加載等操做(started,stopped,restarted,reloaded)

6.user 管理用戶模塊

添加用戶,指定uid、家目錄、主組及註釋: 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' 添加一個nginx用戶: ansible srv -m user -a 'name=nginx shell=/sbin/nologin system=yes home=/var/nginx groups=root,bin uid=80 comment="nginx service" 
 刪除nginx用戶,同時刪除家目錄: ansible srv -m user -a 'name=nginx state=absent remove=yes'

參數詳解:

- home:指定用戶的家目錄,須要與createhome配合使用。

- groups:指定用戶的屬組。

- uid:指定用的uid。

- password:指定用戶的密碼。
注意:指定password參數時,不能使用明文密碼,由於後面這一串密碼會被直接傳送到被管理主機的/etc/shadow文件中,因此須要先將密碼字符串進行加密處理。而後將獲得的字符串放到password中便可。

- name:指定用戶名。

- createhome:是否建立家目錄 yes|no。

- system:是否爲系統用戶。

- remove:當state=absent時,remove=yes則表示連同家目錄一塊兒刪除,等價於userdel -r。

- state:是建立仍是刪除。(present,absent)

- shell:指定用戶的shell環境。

- generate_ssh_key:是否爲相關用戶生成SSH密鑰。 這不會覆蓋現有的SSH密鑰。

- ssh_key_bits:可選擇指定要建立的SSH密鑰中的位數。

- ssh_key_passphrase:設置SSH密鑰的密碼。 若是沒有提供密碼,SSH密鑰將默認沒有密碼。

- ssh_key_file:指定SSH密鑰文件名(可選)。 若是這是一個相對的文件名,那麼它將是相對於用戶的主目錄。

- ssh_key_type:指定要生成的SSH密鑰的類型(可選)。 可用的SSH密鑰類型將取決於目標主機上的實現。

7.group管理組模塊

建立一個系統組: ansible srv -m group -a "name=testgroup system=yes"

刪除一個組: ansible srv -m group -a "name=testgroup state=absent"

建立nginx組: ansible srv -m group -a 'name=nginx system=yes gid=80'

刪除nginx組: ansible srv -m group -a 'name=nginx state=absent'

參數詳解:

- gid:指定用的gid。

- name:指定用戶名。

- state:是建立仍是刪除。(present,absent)

- system:若是是,則表示建立的組是系統組。

8.cron 計劃任務模塊

支持時間:minute,hour,day,month,weekday

建立計劃任務:每週1,3,5,每分鐘打印,任務名稱:warningcron 
ansible all -m cron -a 'minute=* weekday=1,3,5 job="/usr/bin/wall FBI warning" name=warningcron'

註釋cronname=waringcron的計劃任務:
ansible all -m cron -a 'disabled=true job="/usr/bin/wall FBI warning" name=warningcron'

給cronname=waringcron的計劃任務去掉註釋:
ansible all -m cron -a 'disabled=true job="/usr/bin/wall FBI warning" name=warningcron'

建立計劃任務:每五分鐘同步一次服務器時間,任務名稱:syntime
ansible srv -m cron -a "minute=*/5 job='/usr/sbin/ntpdate 172.16.0.1 &>/dev/null' name=Synctime"

刪除計劃任務:Synctime
ansible srv -m cron -a 'state=absent name=Synctime'

9.template模塊

基於模板方式生成一個文件複製到遠程主機(template使用Jinjia2格式做爲文件模版,進行文檔內變量的替換的模塊。它的每次使用都會被ansible標記爲」changed」狀態。)

參數詳解:

- backup: 若是原目標文件存在,則先備份目標文件

- src:在ansible控制器上的Jinja2格式化模板的路徑。 這能夠是相對或絕對的路徑。

- dest:將模板渲染到遠程機器上的位置。

- force:是否強制覆蓋,默認爲yes

- owner:目標文件屬主

- group:目標文件屬組

- mode:目標文件的權限模式,模式能夠被指定爲符號模式(例如,u + rwx或u = rw,g = r,o = r)。

10.setup模塊

收集指定服務器的信息,每一個被管理節點在接收並運行管理命令以前,會將本身主機相關信息,如操做系統版本、IP地址等報告給遠程的ansbile主機。在playbooks裏常常會用到的一個參數gather_facts就與該模塊相關。setup模塊下常用的一個參數是filter參數,具體使用示例以下:

ansible all -m setup -a "filter=ansible_os_family"

這裏給出filter經常使用可選項:

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個數(只顯示總的個數)

ansible_python_version:顯示python版本

11.fetch 從客戶端取文件至服務器端

ansible srv -m fetch -a 'src=/root/a.sh dest=/data/scripts'
 例: 打包 /var/log 下全部日誌文件並遠程抓取

  ansible all -m shell -a 'tar Jcf log.tar.xz /var/log/*.log'

  ansible all -m fetch -a 'src=/root/log.tar.xz dest=/data'

經常使用參數:

- src:遠程系統上要獲取的文件。 這必須是一個文件,而不是一個目錄。 後續版本可能會支持遞歸提取。

-dest:保存文件的目錄。 例如,若是dest目錄是/backup,在主機host.example.com上命名爲/ etc/profile的src文件將被保存到/backup/host.example.com/etc/profile。

- flat:容許您覆蓋將目標文件添加到主機名/ path / to / file的默認行爲。

12.apt安裝包模塊

# 在安裝foo軟件包前更新而後安裝foo 
- apt: name=foo update_cache=yes
# 移除foo軟件包
-
apt: name=foo state=absent
# 安裝foo軟件包
- apt: name=foo state=present
# 安裝foo
1.0軟件包
- apt: name=foo=1.00 state=present
# 安裝nginx最新的名字爲squeeze
-backport發佈包,而且安裝前執行更新
- apt: name=nginx state=latest default_release=squeeze-backports update_cache=yes
# 只下載openjdk
-6-jdk最新的軟件包,不安裝
- apt: name=openjdk-6-jdk state=latest install_recommends=no
# 安裝全部軟件包到最新版本
- apt: upgrade=dist
# 更新apt
-get的list
- apt: update_cache=yes
# 3600秒後中止update_cache
- apt: update_cache=yes cache_valid_time=3600
# 安裝遠程節點上的
/tmp/mypackage.deb軟件包
- apt: deb=/tmp/mypackage.deb

參數詳解:

- deb: 用於安裝遠程機器上的.deb後綴的軟件包(optional)

- install_recommends:這個參數能夠控制遠程電腦上是否只是下載軟件包,仍是下載後安裝,默認參數爲true,設置爲false的時候只下載軟件包,不安裝

- update_cache: 當這個參數爲yes的時候等於apt-get update(optional)

- name: apt要下載的軟件包名字,支持name=git=1.6 這種制定版本的模式

- state:狀態(present,absent,latest),表示是安裝還卸載
   present:默認的,表示爲安裝
   lastest: 安裝爲最新的版本
   absent:表示刪除

13.command模塊

command 模塊能夠幫助咱們在遠程主機上執行命令,默認模塊,可忽略-m選項

ansible srvs -m command -a 'service vsftpd start'

注意:

  • 使用 command 模塊在遠程主機中執行命令時,不會通過遠程主機的 shell 處理。
  • 在使用 command 模塊時,若是須要執行的命令中含有重定向、管道符等操做時,這些符號也會失效,好比 "<" , ">", "|", ";" 和 "&"這些符號,若是你須要這些功能,能夠參考後面介紹的 shell 模塊。
  • 若是遠程節點是 windows 操做系統,則須要使用 win_command 模塊

14.shell模塊,和command類似,用shell執行命令

ansible srv -m shell -a 'echo magedu |passwd –stdin wang'

shell 模塊能夠幫助咱們在遠程主機上執行命令。與 command 模塊不一樣的是,shell 模塊在遠程主機中執行命令時,會通過遠程主機上的 /bin/sh 處理。

使用 shell 模塊能夠在遠程服務器上執行命令,它支持管道與重定向等符號

15.script模塊

script 模塊能夠幫助咱們在遠程主機上執行 ansible 管理主機上的腳本,也就是說,腳本一直存在於 ansible 管理主機本地,不須要手動拷貝到遠程主機後再執行。

------------------------------------------

一些簡單的playbook:

1.安裝apache服務

- hosts: ubuntu sudo: yes tasks: - name: 安裝apache 服務 apt: pkg=apache2 state=installed - name: 推送默認的配置 copy: src=files/awesome-app dest=/etc/apache2/sites-available/awesome-app mode=0640 
    - name: 建立文檔根目錄 file: dest=/var/www/awesome-app state=directory - name: 移除默認的虛擬主機 file: dest=/etc/apache2/sites-available/000-default.conf state=absent notify: - restart apache handlers: - name: restart apache service: name=apache2 state=restarted

運行命令:

 ansible-playbook config.yml -K

2.安裝nginx服務

- hosts: ubuntu #這個是你選擇的主機 #這個是變量 vars: work_user: www-data worker_processes: 2 #sudo方式運行 sudo: yes tasks: #利用apt模塊來操做 - name: ensure nginx is installed apt: pkg=nginx state=installed - name: write the nginx config file template: src=templates/nginx.j2 dest=/etc/nginx/nginx.conf #觸發重啓服務器 notify: - restart nginx - name: ensure nginx is running service: name=nginx state=started #這裏的restart nginx 和上面的觸發是配對的。這就是handlers的做用。 handlers: - name: restart nginx service: name=nginx state=restarted

3.根據操做系統判斷

- hosts: ubuntu sudo: yes vars: epic: true tasks: - name: 若是是ubuntu shell: 'touch /tmp/ubuntu.txt' when: ansible_os_family == 'Debian'
     - name: 輸出 shell: echo "aaa" > /tmp/aaa.txt when: epic - name: 安裝ntp 在debian上 apt: name=ntp state=installed when: ansible_os_family == 'Debian'
     - name: 安裝ntp 在RedHat上 yum: name=ntp state=installed when: ansible_os_family == 'RedHat'

 

 

參考連接:

https://blog.csdn.net/lv8549510/article/details/80849326

http://www.javashuo.com/article/p-vffgbsgc-ds.html

https://www.jianshu.com/p/f61fe86a18ed

相關文章
相關標籤/搜索