ansible批量管理

一、ansible簡介

ansible基於python開發的自動化運維工具,其功能實現基於ssh遠程連接服務

ansible可以實現批量系統配置、批量軟件部署、批量文件拷貝、批量運行命令等功能

http://www.ansible.com/   ##幫助手冊

1.1 一些常用的自動化運維工具

        Puppet —基於 Ruby 開發,採用 C/S 架構,擴展性強,基於 SSL,遠程命令執行相對較弱

        SaltStack —基於 Python 開發,採用 C/S 架構,相對 puppet 更輕量級,配置語法使用 YMAL,使得配置 腳本更簡單。

 

1.2  Ansible —基於 Pythonparamiko 開發,分佈式,無需客戶端,輕量級,配置語法使用 YMAL 及 Jinja2 模板語言,

    更強的遠程 命令執行操作 ,Ansible 是一個簡單的自動化運維管理工具,可以用來自動化部署應用、配置、

    編排 task(持續 交 付、無宕機更新等),採用paramiko 協議庫(fabric 也使用這個),通過 SSH 或者 ZeroMQ 等連接主機。

  

1.3  Ansible 工作機制

   Ansible 在管理節點將 Ansible 模塊通過 SSH 協議(或者 Kerberos、LDAP)推送到被管理端執 行,執行完之後自動刪除,

   可以使用SVN 等來管理自定義模塊及編排  

 

1.4  Ansible 的組成由 5 個部分組成:

 

 ①,Ansible:核心引擎(包含2個模塊)

        核心模塊:ansible模塊資源分發到遠程節點使其執行特定任務或匹配一個特定的狀態。

        自定義模塊:如果核心模塊不足以完成某種功能,可以添加自定義模塊。

 ②,Plugins:完成模塊功能的補充,包括連接插件、郵件插件等

 ③,Playbooks:定義ansible任務的配置文件,可以將多個任務定義在一個劇本中,

 ④,由ansible自動執行,劇本執行支持多個任務,可以由控制主機運行多個任務,同時對多臺遠程主機進行管理。

 ⑤,Inventory:定義 Ansible 管理主機的清單    

 

二、特點:

1、不需要單獨安裝客戶端,基於系統自帶的sshd服務,sshd就相當於ansible的客戶端

2、不需要服務端

3、需要依靠大量的模塊實現批量管理

4、配置文件/etc/ansible/ansible.cfg

 

 

 

三、準備環境:

ssh key+ansible (ansible需要先ssh認證)

1、管理機 需要配置好ssh密鑰認證

2、管理機 連接到客戶端1、客戶端2...不需要密碼

3、關閉防火牆

 

四、安裝服務

yum -y install epel-release    ##安裝epel源

yum -y install ansible

 

五、ansible配置文件

[root@test1 ~]# tree -F /etc/ansible/

/etc/ansible/

├── ansible.cfg     ##目前不需要修改,如果所有服務器的ssh端口變了就修改

├── hosts    ##被ansible管理的服務器IP地址列表(也可以是主機名但是主機名必須被解析)

└── roles/    ##目錄下是空的

配置文件詳解:

[defaults]            #通用默認配置段

#inventory = /etc/ansible/hosts                 #被控端IP或者DNS列表

#library = /usr/share/my_modules/             #ansible默認搜尋模塊位置

#module_utils = /usr/share/my_module_utils/        

#remote_tmp = ~/.ansible/tmp            #ansible遠程執行臨時文件;

#local_tmp = ~/.ansible/tmp      

#forks = 5                            #並行進程數

#poll_interval = 15               #回頻率或者輪訓間隔時間

#sudo_user = root               #sudo遠程執行用戶名

#ask_sudo_pass = True            #使用sudo,是夠需要輸入密碼

#ask_pass = True                   #是否需要輸入密碼

#transport = smart                  #通信機制

#remote_port = 22                    #遠程SSH端口

#module_lang = C                   #模塊和系統之間通信語言

#module_set_locale = False     

#gathering = implicit             #控制默認facts收集(遠程系統變量)

roles_path= /etc/ansible/roles                     用於playbook搜索Ansible roles;

host_key_checking = False                             檢查遠程主機密鑰;

#sudo_exe = sudo                                      sudo遠程執行命令;

#sudo_flags = -H                                              傳遞sudo之外的參數;

timeout = 10                                                    SSH超時時間;

remote_user = root                                  遠程登陸用戶名;

log_path = /var/log/ansible.log                日誌文件存放路徑;

module_name = command                             Ansible命令執行默認的模塊;

#executable = /bin/sh                             執行的Shell環境,用戶Shell模塊;

#hash_behaviour = replace                             特定的優先級覆蓋變量;

#jinja2_extensions                              允許開啓Jinja2拓展模塊;

#private_key_file = /path/to/file             私鑰文件存儲位置;

#display_skipped_hosts = True                       顯示任何跳過任務的狀態;

#system_warnings = True                               禁用系統運行ansible潛在問題警告;

#deprecation_warnings = True                          Playbook輸出禁用“不建議使用”警告;

#command_warnings = False                       command模塊Ansible默認發出警告;

#nocolor = 1                                                  輸出帶上顏色區別,開啓/關閉:0/1;

pipelining = False                                             開啓pipe SSH通道優化;

[accelerate]                                                      accelerate緩存加速。

accelerate_port = 5099

accelerate_timeout = 30

accelerate_connect_timeout = 5.0

accelerate_daemon_timeout = 30

accelerate_multi_key = yes

 

 

5.1基礎配置

編輯ansible的主機配置文件hosts,添加主機組client

cp /etc/ansible/hosts{,.bak}

cat > /etc/ansible/hosts<<EOF

[client]

192.168.24.131

192.168.24.132

192.168.24.133

EOF
[root@test1 ~]# tail  /etc/ansible/hosts

[client]

192.168.24.131

192.168.24.132

192.168.24.133


 

 

5.2批量運行命令

ansible client -a "uptime"

等於

ansible client -m command -a “uptime”



ansible -vvv -a “hostname”顯示執行過程

-m 指定模塊

-a 後面執行命令

##注:如果執行管道,-m 指定shell模塊

【主要參數如下】

-v,–verbose                                      打印詳細模式;

-i PATH,–inventory=PATH                       指定host文件路徑;

-f NUM,–forks=NUM                             指定fork開啓同步進程的個數,默認5;

-m NAME,–module-name=NAME           指定module名稱,默認模塊command;

-a MODULE_ARGS                       module模塊的參數或者命令;

-k,–ask-pass                           輸入遠程被管理端密碼;

–sudo                               基於sudo用戶執行;

-K,–ask-sudo-pass                      提示輸入sudo密碼與sudo一起使用;

-u USERNAME,–user=USERNAME         指定移動端的執行用戶;

-C,–check                            測試執行過程,不改變真實內容,相當於預演;

-T TIMEOUT,                                           執行命令超時時間,默認爲10秒;

--version                                                  查看Ansible軟件版本信息。

ansible-playbook --syntax-check user.yml #驗證yml語法

[root@jenkins script]# ansible-playbook --syntax-check user.yml
[DEPRECATION WARNING]: ACCELERATE_TIMEOUT option, Removing accelerate as a connection method, settings not needed either. . This feature will be removed in
version 2.5. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.
[DEPRECATION WARNING]: ACCELERATE_DAEMON_TIMEOUT option, Removing accelerate as a connection method, settings not needed either. . This feature will be
removed in version 2.5. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.
[DEPRECATION WARNING]: ACCELERATE_CONNECT_TIMEOUT option, Removing accelerate as a connection method, settings not needed either. . This feature will be
removed in version 2.5. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.
[DEPRECATION WARNING]: ACCELERATE_MULTI_KEY option, Removing accelerate as a connection method, settings not needed either. . This feature will be removed in
version 2.5. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.
[DEPRECATION WARNING]: ACCELERATE_PORT option, Removing accelerate as a connection method, settings not needed either. . This feature will be removed in
version 2.5. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.
 [WARNING]: Could not match supplied host pattern, ignoring: test


playbook: user.yml #正常語法

5.3 批量發送文件

copy 模塊

src=從哪裏來

dest=到哪裏去

mode=修改權限

backup=備份

 

本地的/root/1.txt 發送到所有的服務器的/opt下

ansible client -m copy -a "src=/root/1.txt dest=/opt/"

##注:src指從哪裏來,dest指到哪裏去

            新文件是黃色的,再次執行是綠色的

 

ansible client -a "ls -l /opt"     ##驗證文件是否存在

 

ansible client -m copy -a "src=/root/1.txt dest=/opt/test/test1/" 

##自動在opt下創建/test/test1文件,並將1.txt複製到/test/tes1/目錄下

 

ansible client -m copy -a "src=/root/1.txt dest=/opt/2.txt"     ##拷貝且修改文件名

 

ansible client -m copy -a "src=/root/3.txt dest=/opt/2.txt backup=yes" 

##3.txt會覆蓋原2.txt,但在此之前會備份2.txt

 

ansible client -m copy -a "src=/root/4.txt dest=/opt/5.txt owner=test group=test mode=0755"

##修改所有者和文件權限

 

 

 

shell 模塊

運行腳本、命令、特殊符號



創建文件

echo 'yum -y install lrzsz' >/opt/yum.sh



1.先把腳本發送到對應的服務器

ansible client -m copy -a "src=/opt/yum.sh dest=/opt/ mode=755"

ansible client -a "ls -l /opt/yum.sh"



2、運行 /bin/sh

ansible client -m shell -a "/bin/sh /opt/yum.sh"

ansible client -m shell -a "rpm -qa| grep lrzsz"    ##shell支持特殊符號

 

script 腳本模塊

1.把腳本發送到對應服務器(過程不顯示)

2.運行腳本 (過程不顯示)



寫一個腳本 更改所有服務器的yum源

cat>/opt/yuan.sh<<EOF

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

EOF



ansible client -m script -a "/opt/yuan.sh"

ansible client -a "yum repolist"

cron 定時任務模塊

每5分鐘顯示hello到/tmp/test.log

echo '*/5 * * * * echo hello >>/tmp/test.log 2>&1' >>/var/spool/cron/root ##原命令



crond模塊

ansible client -m cron -a 'name=hello minute=*/2 job="echo hello >>/tmp/test.log 2>&1"' ##改造後命令

ansible client -a "crontab -l"

例:時間同步

[root@test1 ~]# ansible client -m cron -a 'name=date minute=*/5 job="/usr/sbing/ntpdate ntp1.aliyun.com >/dev/null 2>&1"'

192.168.24.131 | CHANGED => {

    "changed": true,

    "envs": [],

    "jobs": [

        "date"

    ]

}

[root@test1 ~]# ansible client -a "crontab -l"

192.168.24.131 | CHANGED | rc=0 >>

#Ansible: date

*/5 * * * * /usr/sbing/ntpdate ntp1.aliyun.com >/dev/null 2>&1

 

測試方法:

ansible all -a hostname

ansible -C 操作之前檢查語法,模擬一下命令不會生效,無誤之後可以去掉-C

 

##添加定時任務:

ansible client -m cron -a "name='network restart' minute=00 hour=00 job='network restart >/dev/null 2>&1' state=present" -C

ansible client -m cron -a "name='network restart' minute=00 hour=00 job='network restart >/dev/null 2>&1' state=present"

ansible -a "crontab -l"

##刪除這個定時任務

ansible client -m cron -a "name='network restart' minute=00 hour=00 job='/etc/init.d/network restart' state=absent" -C

ansible client -m cron -a "name='network restart' minute=00 hour=00 job='/etc/init.d/network restart' state=absent"

ansible -a "crontab -l"

 

1.真正運行ansible生效前 檢查語法

ansible -C

2.沒問題就去掉-C

 

 

 

yum 模塊:

ansible client -m yum -a "name=vim state=installed"

ansible client -m yum -a "name=lrzsz,net-tool" ##yum安裝多個軟件

 

file模塊:

ansible client -m file -a "dest=/tmp/test/ state=directory"  ##創建遠程目錄

ansible client -a "tree -F /tmp/" 

owner 設置複製傳輸後的數據屬主信息

group 設置複製傳輸後的數據屬組信息

mode  設置文件數據權限信息

dest  要創建的文件或目錄命令,以及路徑信息

src   指定要創建軟連接的文件信息

 

 

六、模塊:

 

6.1 ansible如何查詢幫助,查詢模塊的參數

ansible-doc -s copy     ##查看copy模塊幫助

ansible-doc -l ##顯示所有模塊

 

 

 

 

七、通過ansible批量管理服務

1、命令行 各種模塊

2、書寫劇本-playbook

 

ansible部署rsync,nfs,sersync(實踐)

 


 

 

八、基礎補充--ansible-playbook

 

8.1特點:

1.配置管理

2.批量部署

3.ad-hoc 批量執行命令

ansible client -m command -a "hostname"

4.編寫playbook劇本-腳本

 

8.2核心功能:

1.pyYAML-劇本語言

2.paramiko-遠程連接與數據傳輸

3.jinjia2--ansible模板

 

 

8.3準備環境:

1.四臺機器web01 backup nfs01 m01

2.配置好m01與web01 backup nfs的ssh密鑰認證

3.配置好m01通過ansible管理web01 backup nfs01

 

 

 

8.4寫法步驟:

核心:找誰幹啥

 

 

ansible語言是yml,嚴格要求對齊,注意空格

-host:all  ##哪臺服務器

  task:    ##做什麼任務,運行什麼模塊

      - command:ifconfig  

等於

ansible -m command -a "ifconfig"

ansible -m shell -a "echo hello >>/tmp/hello.log"

vim /op/show.yml

---

- hosts: all

  tasks:

    - command: ifconfig

ansible-playbook /op/show.yml -C 運行

[root@test1 ~]# cat /opt/show.yml

---

- hosts: client ##-空格

  tasks:   ##兩個空格

    - command: uptime  ##四個空格-空格

---

- hosts: client

  tasks:

    - shell: ifconfig >/tmp/new.txt

---

- hosts: client

  tasks:

    - name: "show is addr"

      shell: ifconfig >/tmp/new.txt

給所有服務器添加定時任務--變爲劇本

---

- hosts: client

  tasks:

    - name: network restart

      cron: name='network restart' minute=00 hour=00 job='/etc/init.d/network restart >/dev/null 2>&1' state=present

 

刪除定時任務:

---

- hosts: client

  tasks:

    - name: network restart

      cron: name='network restart' minute=00 hour=00 job='/etc/init.d/network restart >/dev/null 2>&1' state=absent

 

多個任務:

---

- hosts: client

  tasks:

    - name: network restart

      cron: name='network restart' minute=00 hour=00 job='/etc/init.d/network restart >/dev/null 2>&1' state=present

    - name: ipaddr

      shell: ifconfig

 

不同機器運行不同命令:

---

- hosts: 192.168.24.131

  tasks:

    - name: ipaddr

      shell: ifconfig

      

- hosts: 192.168.24.132

  tasks:

    - name: network

       cron: name='network restart' minute=00 hour=00 job='/etc/init.d/network restart >/dev/null 2>&1' state=present

 

yum 安裝:

---     

- hosts: all

  tasks:

    - name: yum install

       yum: name=htop,sl,cowsay

批量修改單個用戶:

---
- hosts: client
  gather_facts: false
  tasks:
    - name: Change password
      user: name={{ name1 }}  password={{ chpass | password_hash('sha512') }}  update_password=always
ansible-playbook play1.yml -e "name1=username chpass=admin#123" #name1是用戶名,chpass後面填新密碼,把用戶和密碼傳參進去(適合修改單個用戶)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章