Ansible自动化运维工具使用
生活随笔
收集整理的這篇文章主要介紹了
Ansible自动化运维工具使用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
概述
本文描述自動化運維工具 Ansible 的安裝及基礎使用方法,包含: Centos 下的安裝
主機配置
Ad-Hoc command(命令行執行)
Playbook (任務劇本)
Ansible 和 Saltstack 是目前主流的兩個自動化運維工具,都可以用于同時對大量主機進行系統配置,應用部署等工作,利用這種集成化的自動運維工具最大的優勢在于運維體系結構的持續可維護性。本文先著眼于 Ansible 的基礎使用,不會進行太多擴展,通過本文可以快速上手使用 Ansible。 安裝
Ansible 的一大特點是 agentless,可以通過 SSH 來對服務器進行管理,意味著只需要將 Ansible 部署到一臺服務器。 Ansible 并非一定使用 ssh 來與服務器進行通信,它也支持 ZeroMq 的擴展。事實上,如果不是總要同時對一個龐大主機群進行操作,通過 ssh 進行通信在效率上的損失還是可以接受的。 在 Centos 系統上,Ansible 可以用過 yum 來進行安裝,前提是需要 EPEL 的源。 以 Centos7 為例執行下列命令安裝 EPEL 源: rpm -Uvh http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
1
安裝 Ansible yum install ansible
1
通常情況下,Ansible 可以部署到登錄服務器上,登錄服務器存放 ssh 私鑰,這樣在對操作主機群時就無需每次輸入密碼。 主機配置
Ansible 默認主機配置文件在 /etc/ansible/hosts,你也可以創建新的配置文件來管理主機,如果使用其他主機配置,在執行命令行時就需要通過 -i <path> 參數指定主機配置。 下邊是一個主機配置的例子,foo.example.com 這些就是主機的定義,webservers 是主機組的定義,在使用 Ansible 時,可以通過主機組對一組服務器進行操作。 [webservers]
foo.example.com
bar.example.com
1
2
3
Ad-Hoc Command
Ad-Hoc Command 指那些希望立即執行對一組服務器進行操作,而這個操作過程不需要進行保存的方式。例如臨時需要對 webservers 這組主機下的 /opt/testfile 文件進行刪除,而這種操作是沒有必要保存成 Playbook (劇本模式,稍后會說到)的。 $ ansible webservers -m command -a "rm -f /opt/testfile"
1
參數 -m 指定使用的功能模塊是 command,-a 設置模塊所需參數隊列,對于 command 模塊來講,這個參數就是你需要執行的命令。 事實上,command 模塊也有幾個參數,當需要指定多個參數時,就需要使用 arg1=value1 arg2=value2 這樣的鍵值對方式指定,當沒有指定參數時,在這里實際上使用 command 的是 free_form 參數。 Ansible 默認使用的模塊是 command,這意味著上述命令行并不需要顯式指定功能模塊,可以直接使用下列命令行
ansible webservers -a "rm -f /opt/testfile" 再舉個簡單的例子,批量文件分發: $ ansible webservers -m copy -a "src=/etc/hosts dest=/tmp/hosts"
1
上述命令將本地 /etc/hosts 分發到 webservers 的 /tmp/hosts。 使用 ansible-doc -l 可以查看 Ansible 支持哪些模塊,也可以直接前往 這里 去查看。 使用 ansible-doc -s module_name 可以獲取模塊的使用幫助。 Playbook
Playbook 可以稱之為任務劇本,它允許你按照劇本的方式編排需要完成的任務,使用 YAML 的語法格式。 早期,我們可能使用腳本來完成一些流程相對繁多的任務,腳本可以很好的執行,但可讀性差。YAML 這種配置性的語法格式則可讀性很好,并且對于沒有編程基礎的運維人員來講,它也更容易上手。 看一個 playbook 的例子: ---
- hosts: webservers
? remote_user: root
? tasks:
? - name: ensure apache is at the latest version
??? yum: name=httpd state=latest
? - name: write the apache config file
??? template: src=/srv/httpd.j2 dest=/etc/httpd.conf
??? notify:
??? - restart apache
? - name: ensure apache is running (and enable it at boot)
??? service: name=httpd state=started enabled=yes
? handlers:
??? - name: restart apache
????? service: name=httpd state=restarted
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
這個簡單的例子完成的任務是部署或更新 webservers 這一組主機的 apache。 hosts:定義操作的主機組 remote_user:使用的用戶 task:任務步驟,共分為三步: 1 通過 yum 模塊確認 apache 是否安裝以及是否是最新版本,如果不是則安裝或更新;
2 通過 template 模塊來設置配置文件,如果配置有更新則通知 handler 重啟 apache;
3 通過 service 模塊來判斷 apache 是否在運行,如果沒有則啟動 apache。
handlers:事件處理,處理任務中的 notify Playbook 完成后,執行就可以完成對一組服務器的操作 ansible-playbook playbook.yml
1
以上就是 Ansible 的基礎使用方法,更多的可以去參考 Ansible 的文檔。
--------------------- 一 Ansible簡介
? ?1.absible定義
? ?ansible是一個輕量級的運維管理工具,基于Python研發。可實現對系統的批量管理配置、程序的批量部署、批量的運行命令等功能。僅需在任意管理主機安裝ansible程序即可實現批量管理被管控主機且被管控的主機無需客戶端。
? ?2.ansible特性
? ?1、no agents:不需要在被管控主機上安裝任何客戶端;
? ?2、no server:無服務器端,使用時直接運行命令即可; 3、modules in any languages:基于模塊工作,可使用任意語言開發模塊; 4、yaml,not code:使用yaml語言定制劇本playbook; 5、ssh by default:基于SSH工作; 6、strong multi-tier solution:可實現多級指揮。 3.優點 1、輕量級,無需在客戶端安裝agent,更新時,只需在操作機上進行一次更新即可; 2、批量任務執行可以寫成腳本,而且不用分發到遠程就可以執行; 3、使用python編寫,維護更簡單,ruby語法過于復雜; 4、支持sudo 4.基本架構 Modules:模塊化?
? ?Core Modules 核心模塊?
? ?Customed Modules 自定義模塊?
? ?Host Iventory 主機庫清單,定義要管理的主機?
? ?Files 可以通過配置文件來實現?
? ?CMDB 也可以通過外部存儲來實現?
? ?PlayBooks 劇本,定義每個主機所扮演的角色?
? ?Connection Plugins:連接插件,主要連接各管控主機?
? ?5.工作機制 二 Ansible安裝
? ?1.ansible需python2.6以上版本
[root@test1 ~]# python -V
Python2.7.5
# 安裝python驅動(不然下面會報錯)
yum install python-devel -y
? ?2.安裝ansible
#setuptools安裝
cd
wget https://pypi.python.org/packages/source/s/setuptools/setuptools-7.0.tar.gz
tar xvzf setuptools-7.0.tar.gz
cd setuptools-7.0
python setup.py install
#pycrypto模塊安裝
wget https://pypi.python.org/packages/source/p/pycrypto/pycrypto-2.6.1.tar.gz
tar -xzf pycrypto-2.6.1.tar.gz
cd pycrypto-2.6.1
python setup.py install
#PyYAML模塊安裝
cd
wget http://pyyaml.org/download/libyaml/yaml-0.1.5.tar.gz
tar -xzf yaml-0.1.5.tar.gz
cd yaml-0.1.5
./configure --prefix=/usr/local
make -j `grep processor /proc/cpuinfo| wc -l` && make install
cd
wget https://pypi.python.org/packages/source/P/PyYAML/PyYAML-3.11.tar.gz
tar -xzf PyYAML-3.11.tar.gz
cd PyYAML-3.11
python setup.py install
#Jinja2模塊安裝
cd
wget https://pypi.python.org/packages/source/M/MarkupSafe/MarkupSafe-0.9.3.tar.gz
tar -xzf MarkupSafe-0.9.3.tar.gz
cd MarkupSafe-0.9.3
python setup.py install
cd
wget https://pypi.python.org/packages/source/J/Jinja2/Jinja2-2.7.3.tar.gz
tar xvzf Jinja2-2.7.3.tar.gz
cd Jinja2-2.7.3
python setup.py install
#paramiko模塊安裝
cd
wget https://pypi.python.org/packages/source/e/ecdsa/ecdsa-0.11.tar.gz
tar xvzf ecdsa-0.11.tar.gz
cd ecdsa-0.11
python setup.py install
cd
wget https://pypi.python.org/packages/source/p/paramiko/paramiko-1.15.1.tar.gz
tar xvzf paramiko-1.15.1.tar.gz
cd paramiko-1.15.1
python setup.py install
#ansible 2.2.2安裝
cd
wget http://releases.ansible.com/ansible/ansible-2.2.2.0.tar.gz
tar -xzf ansible-2.2.2.0.tar.gz
cd ansible-2.2.2.0
python setup.py install
mkdir /etc/ansible
cp -rp examples/* /etc/ansible/
? ?3.yum安裝
yum install epel-release -y
yum install ansible -y
三 Ansible相關配置
? ?1.ansible相關文件及命令
主程序目錄:/etc/ansible/
主配置文件:/etc/ansible/ansible.cfg
默認主機清單:/etc/ansible/hosts
插件目錄:/usr/share/ansible_plugins
主要命令:/usr/bin/ansible
/usr/bin/ansible-console
/usr/bin/ansible-doc
/usr/bin/ansible-galaxy
/usr/bin/ansible-playbook
/usr/bin/ansible-pull
/usr/bin/ansible-vault
#常用格式
ansible <host-pattern>[-f forks][-m module][-a args]
host-pattern # 可以是all,或者配置文件中的主機組名
-v,–verbose 詳細模式,如果命令執行成功,輸出詳細的結果(-vv –vvv -vvvv)
-i PATH,–inventory=PATH 指定host文件的路徑,默認是在/etc/ansible/hosts
-f NUM,–forks=NU NUM是指定一個整數,默認是5,指定fork開啟同步進程的個數。
-m NAME,–module-name=NAME 指定使用的module名稱,默認是command
-m DIRECTORY,–module-path=DIRECTORY 指定module的目錄來加載module,默認是/usr/share/ansible,
-a,MODULE_ARGS 指定module模塊的參數
-k,-ask-pass 提示輸入ssh的密碼,而不是使用基于ssh的密鑰認證
-sudo 指定使用sudo獲得root權限
-K,-ask-sudo-pass 提示輸入sudo密碼,與–sudo一起使用
-u USERNAME,-user=USERNAME 指定移動端的執行用戶
-C,-check 測試此命令執行會改變什么內容,不會真正的去執行
#查看各模塊
ansible-doc [options][modules]
# 主要選項有:
-l或--list # 列出可用的模塊
-s或--snippet #顯示指定模塊的簡略使用方法
? ?2.配置文件介紹
? ?配置文件:/etc/ansible/ansible.cfg
hostfile=/etc/ansible/hosts #指定默認hosts配置的位置
host_key_checking =False#不進行host_key檢查,省去目標key發生變化時輸入(yes/no)的步驟
ask_pass=True# 每次執行ansible命令是否詢問ssh密碼
ask_sudo_pass=True# 每次執行ansible命令時是否詢問sudo密碼
? ?配置文件:/etc/ansible/hosts
# Ex 1: Ungrouped hosts, specify before any group headers.
直接給出主機,IP主機名都可以
## 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 ...
## 192.168.1.100 ...
# If you have multiple hosts following a pattern you can specify
對主機進行通配001:006表示到一個范圍
## www[001:006].example.com
# Ex 3: A collection of database servers in the 'dbservers' group
定義一組數據庫服務器
## [dbservers]
## db02.intranet.mydomain.net ...
## 10.25.1.56 ...
#參數解釋
1, ansible_ssh_host :
指定主機別名對應的真實 IP,如:100 ansible_ssh_host=192.168.1.100,隨后連接該主機無須指定完整 IP,只需指定251就行
2, ansible_ssh_port :
指定連接到這個主機的 ssh 端口,默認22
3, ansible_ssh_user:
連接到該主機的 ssh 用戶
4, ansible_ssh_pass:
連接到該主機的ssh密碼(連-k 選項都省了),安全考慮還是建議使用私鑰或在命令行指定-k 選項輸入
5, ansible_sudo_pass: sudo 密碼
6, ansible_sudo_exe: sudo 命令路徑
7, ansible_connection :
連接類型,可以是local、ssh 或 paramiko,ansible1.2之前默認為 paramiko
8, ansible_ssh_private_key_file :私鑰文件路徑
9, ansible_shell_type :
目標系統的 shell 類型,默認為 sh,如果設置 csh/fish,那么命令需要遵循它們語法
10, ansible_python_interpreter :
python 解釋器路徑,默認是/usr/bin/python,但是如要要連BSD系統的話,就需要該指令修改 python 路徑
11, ansible__interpreter :
這里的"*"可以是 ruby 或 perl 或其他語言的解釋器,作用和 ansible_python_interpreter 類似
? ?3.主機與被控機建立ssh公私匙連接
? ?1.主機配置文件添加被控端
cat >>/etc/ansible/hosts <<EOF
[web]
192.168.1.168
192.168.1.186
EOF
? ?2.配置ssh無密碼登錄
#1.主機生成ssh密鑰
[root@test1 ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in/root/.ssh/id_rsa.
Your public key has been saved in/root/.ssh/id_rsa.pub.
The key fingerprint is:
e4:99:c4:17:c9:68:86:3c:ac:1b:20:19:c4:36:c1:fe root@test1
The key's randomart image is:
+--[ RSA 2048]----+
|==. o . o.. |
|o=. =.+ o. |
|o... . ++ . |
| . o + + |
| . o S |
| E. |
| |
| |
| |
+-----------------+
#2.將公鑰發到被管理節點用戶的.ssh目錄
[root@test1 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.168
The authenticity of host '192.168.1.168(192.168.1.168)' can't be established.
ECDSA key fingerprint is 80:a7:8d:c6:6c:14:27:5c:2b:dd:17:5e:ec:60:33:1c.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO:1 key(s) remain to be installed --if you are prompted now it is to install the new keys
root@192.168.1.168's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'root@192.168.1.168'"
and check to make sure that only the key(s) you wanted were added.
#3.驗證無密碼配置是否成功
[root@test1 ~]# ssh root@192.168.1.168
Last login: Wed Apr 12 11:02:08 2017 from 192.168.1.110
[root@test2 ~]#
#192.168.186執行2,3步即可
? ? 3.測試主機連通性
#測試web組中機器聯通性(測試所有用all)
[root@test1 ~]# ansible web -m ping
192.168.1.168| SUCCESS =>{
"changed": false,
"ping":"pong"
}
192.168.1.186| SUCCESS =>{
"changed": false,
"ping":"pong"
}
? ?4.常見模塊
ping:探測目標主機是否存活;
舉例: ansible all -m ping
command:在遠程主機執行命令;
舉例:ansible all -m command -a "ifconfig"
舉例:ansible all -m command -a "useradd centos"
shell:在遠程主機上調用shell解釋器運行命令,支持shell的各種功能,如管道等
舉例:ansible all -m shell -a "echo centos |passwd --stdin centos"
copy:復制文件,給定內容生成文件,mode, owner, group,follow,...
拷貝文件
舉例:ansible all -m copy -a "src=/etc/fstab dest=/tmp/fstab.ansible mode=640"
生成文件
舉例:ansible all -m copy -a "content='hell\nworld\n' dest=/tmp/fstab.ansible mode=640"
file:設置文件屬性
更改文件屬主
舉例:ansible all -m file -a "path=/tmp/fstab.ansible owner=centos"
刪除文件
舉例:ansible all -m file -a "path=/tmp/fstab.ansible state=absent"
state 用來定義目標文件狀態的
創建指定文件空目錄
舉例:ansible all -m file -a "path=/tmp/dir.ansible state=directory"
鏈接文件
舉例:ansible all -m file -a "path=/tmp/test.ansible.link src=/tmp/test.ansible
state=link"
fetch:從遠程主機拉取一個文件
ansible是用來管理多節點的,從遠程拉取多個文件到目標主機顯然不近乎仁義。所以用scp就能搞定。略過
cron:用來管理crontab的周期性任務
定義一個任務
舉例:ansible all -m cron -a "minute'*/5' job='/usr/sbin/ntpdate 10.1.0.1 &>/dev/null'
name='sync time'"
crontab -l
刪除一個任務
舉例:ansible all -m cron -a "name='sync time' state=absent"
只刪除用ansible定義的名
hostname:定義主機名
舉例:
yum:使用yum包管理器,完成程序包管理
舉例:ansible all -m yum -a "name=httpd"安裝
舉例:ansible all -m yum -a "name=httpd state=absent"刪除
service:控制服務,控制服務是否開機自動啟動
舉例:ansible all -m service -a "name=httpd state=started enbaled=true"
script模塊:
目的:在指定節點上執行/root/a.sh腳本(該腳本是在ansible主控端)
命令:ansible 10.1.1.113-m script -a ‘/root/a.sh‘
group:添加或者刪除組
舉例:
user:管理組賬號
舉例:
setup:收集遠程各主機的各種屬性之和
舉例:ansible all -m setup 5.PlayBook(各角色定義)(官方實例:https://github.com/ansible/ansible-examples)
? ?playbook是由一個或多個"play"組成的列表。play的主要功能在于將事先歸為一組的主機裝扮成事先通過ansible中的task定義好的角色。從根本上來將,所謂的task無非是調用ansible的一個module。將多個paly組織在一個playbook中,即可以讓他們聯通起來按事先編排的機制同唱一臺大戲。
playbook核心元素:
Tasks:任務,由模塊定義的操作的列表;
Variables:變量
Templates:模板,即使用了模板語法的文本文件;
Handlers:由特定條件觸發的Tasks;
Roles:角色;自包含,有完整獨立實體
playbook的基礎組件:
Hosts:運行指定任務的目標主機,可多個;
remote_user:在遠程主機以哪個用戶身份執行;
sudo_user:非管理員需要擁有sudo權限;
tasks:給出任務列表,執行完一個,執行第二個
模塊,模塊參數:
格式:
(1) action: module arguments //任務執行過程
(2) module name: arguments //指定運行的模塊
? ?playbook實例1(指揮web組內主機安裝httpd并監聽8080端口)
- hosts: web
remote_user: root
tasks:
- name: install httpd package
yum: name=httpd state=latest
tags: installpkg #指明跑某個標簽 -t installpkg
- name: install conf file
copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf
tags: installconf #指明跑某個標簽 -t installconf
notify: restart httpd service
- name: start httpd service
service: name=httpd state=started
handlers:#處理器,也是任務,在一定條件觸發
- name: restart httpd service
service: name=httpd state=restarted
#檢查語法,測試執行
ansible-playbook --syntax-check -t installconf --list-tags httpd.yaml
ansible-playbook --syntax-check httpd.yaml
ansible-playbook --list-hosts --list-tasks httpd.yaml
注意:
handlers:是指在一定條件下觸發,指明在一個需要讓別人重啟服務才生效的任務上使用notify,通知一定是handlers名字
tags:只執行playbook中指定的tags標簽,滿足部分需要,多個任務可指明一個同tags
也可以一次調用兩個標簽,如下
annsible-playbook -t installconf,installpkg httpd.yaml
? ?playbook實例2(自定義變量Varable,可自定義安裝任意程序包)
vim name.yaml
- hosts: web
remote_user: root
vars:
- pkgname: memcached #playbook中使用變量Variables
tasks:
- name: install a package
yum: name={{ pakgname }} state=present #自定義變量
#語法測試
ansible-playbook --syntax-check name.yaml
ansible-playbook -e pkgname=httpd/vsftpd/ name.yaml
#對應配置文件hosts設置
vim /etc/ansible/hosts
[web]
192.168.1.168 pkgname=nginx
192.168.1.186 pkgname=httpd
[web:vars]#為一個內不同主機定義相同變量,效果同上
#web組內有一組變量vars,其中變量pkgname值是memcaches
pkgname=memcached
Inventory還可以使用參數:
用于定義ansible遠程連接目標主機使用的屬性,而非傳遞給playbook的變量
如:[webserver]
192.168.1.168 ansible_ssh_user= ansible_ssh_pass ansible_sudo_pass
不再是傳遞給playbook變量,而是主機本身。
? ??when條件判斷
- name: start nginx service on CentOS6
shell: service nginx start
when: ansible_distribution =="CentOS" and ansible_distribution_major_version =="6"
- name: start nginx service
shell: systemctl start nginx.service
when: ansible_distribution =="CentOS" and ansible_distribution_major_version =="7"
? ?基于字符串列表給出元素?循環:迭代,需要重復執行的任務;
- name: install package
yum: name={{ item }} state=latest
with_items:
- httpd
- php
- php-mysql
- php-mbstring
- php-gd
? ?基于字典列表出元素?循環:迭代,需要重復任務;
- name: creat groups //第一個任務
yum: name={{ item }} state=latest
with_items:
- groupx1
- groupx2
- groupx3
- name: creat users //第二個任務
user: name={{ item.name }} group={{ item.group }} state=present
with_items://元素列表
-{name:'userx1', group:'groupx1'}//name鍵值隊
-{name:'userx1', group:'groupx1'}//name鍵值隊
-{name:'userx1', group:'groupx1'}//name鍵值隊
? ?
角色(自包含,按照目錄結構來組織) 指定由哪些主機去對應的完成哪個已定義好的角色
roles是以特定的層級目錄結構進行組織的tasks、variables、handlers、templates…
role_name/
files/:存儲由copy或script等模塊調用的文件;
tasks/:核心配置,分發資源和安裝軟件
handlers/: 發生改變則執行的操作(notify觸發)
vars/:?定義變量
templates/:存儲由template模塊調用的模板文本;
meta/: 說明信息,角色依賴等,一般不用
default/:此目錄中至少應該有一個名為main.yml的文件,用于設定默認變量;
Ansible官方文檔:http://www.ansible.com.cn/docs/playbooks_intro.html?
學習博客:http://guoxh.blog.51cto.com/10976315/1914287??
學習博客:http://zyxjohn.blog.51cto.com/5313197/1886251?
學習博客:http://51eat.blog.51cto.com/11892702/1891709? ---------------------
原文:https://blog.csdn.net/HzSunshine/article/details/70227803
本文描述自動化運維工具 Ansible 的安裝及基礎使用方法,包含: Centos 下的安裝
主機配置
Ad-Hoc command(命令行執行)
Playbook (任務劇本)
Ansible 和 Saltstack 是目前主流的兩個自動化運維工具,都可以用于同時對大量主機進行系統配置,應用部署等工作,利用這種集成化的自動運維工具最大的優勢在于運維體系結構的持續可維護性。本文先著眼于 Ansible 的基礎使用,不會進行太多擴展,通過本文可以快速上手使用 Ansible。 安裝
Ansible 的一大特點是 agentless,可以通過 SSH 來對服務器進行管理,意味著只需要將 Ansible 部署到一臺服務器。 Ansible 并非一定使用 ssh 來與服務器進行通信,它也支持 ZeroMq 的擴展。事實上,如果不是總要同時對一個龐大主機群進行操作,通過 ssh 進行通信在效率上的損失還是可以接受的。 在 Centos 系統上,Ansible 可以用過 yum 來進行安裝,前提是需要 EPEL 的源。 以 Centos7 為例執行下列命令安裝 EPEL 源: rpm -Uvh http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
1
安裝 Ansible yum install ansible
1
通常情況下,Ansible 可以部署到登錄服務器上,登錄服務器存放 ssh 私鑰,這樣在對操作主機群時就無需每次輸入密碼。 主機配置
Ansible 默認主機配置文件在 /etc/ansible/hosts,你也可以創建新的配置文件來管理主機,如果使用其他主機配置,在執行命令行時就需要通過 -i <path> 參數指定主機配置。 下邊是一個主機配置的例子,foo.example.com 這些就是主機的定義,webservers 是主機組的定義,在使用 Ansible 時,可以通過主機組對一組服務器進行操作。 [webservers]
foo.example.com
bar.example.com
1
2
3
Ad-Hoc Command
Ad-Hoc Command 指那些希望立即執行對一組服務器進行操作,而這個操作過程不需要進行保存的方式。例如臨時需要對 webservers 這組主機下的 /opt/testfile 文件進行刪除,而這種操作是沒有必要保存成 Playbook (劇本模式,稍后會說到)的。 $ ansible webservers -m command -a "rm -f /opt/testfile"
1
參數 -m 指定使用的功能模塊是 command,-a 設置模塊所需參數隊列,對于 command 模塊來講,這個參數就是你需要執行的命令。 事實上,command 模塊也有幾個參數,當需要指定多個參數時,就需要使用 arg1=value1 arg2=value2 這樣的鍵值對方式指定,當沒有指定參數時,在這里實際上使用 command 的是 free_form 參數。 Ansible 默認使用的模塊是 command,這意味著上述命令行并不需要顯式指定功能模塊,可以直接使用下列命令行
ansible webservers -a "rm -f /opt/testfile" 再舉個簡單的例子,批量文件分發: $ ansible webservers -m copy -a "src=/etc/hosts dest=/tmp/hosts"
1
上述命令將本地 /etc/hosts 分發到 webservers 的 /tmp/hosts。 使用 ansible-doc -l 可以查看 Ansible 支持哪些模塊,也可以直接前往 這里 去查看。 使用 ansible-doc -s module_name 可以獲取模塊的使用幫助。 Playbook
Playbook 可以稱之為任務劇本,它允許你按照劇本的方式編排需要完成的任務,使用 YAML 的語法格式。 早期,我們可能使用腳本來完成一些流程相對繁多的任務,腳本可以很好的執行,但可讀性差。YAML 這種配置性的語法格式則可讀性很好,并且對于沒有編程基礎的運維人員來講,它也更容易上手。 看一個 playbook 的例子: ---
- hosts: webservers
? remote_user: root
? tasks:
? - name: ensure apache is at the latest version
??? yum: name=httpd state=latest
? - name: write the apache config file
??? template: src=/srv/httpd.j2 dest=/etc/httpd.conf
??? notify:
??? - restart apache
? - name: ensure apache is running (and enable it at boot)
??? service: name=httpd state=started enabled=yes
? handlers:
??? - name: restart apache
????? service: name=httpd state=restarted
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
這個簡單的例子完成的任務是部署或更新 webservers 這一組主機的 apache。 hosts:定義操作的主機組 remote_user:使用的用戶 task:任務步驟,共分為三步: 1 通過 yum 模塊確認 apache 是否安裝以及是否是最新版本,如果不是則安裝或更新;
2 通過 template 模塊來設置配置文件,如果配置有更新則通知 handler 重啟 apache;
3 通過 service 模塊來判斷 apache 是否在運行,如果沒有則啟動 apache。
handlers:事件處理,處理任務中的 notify Playbook 完成后,執行就可以完成對一組服務器的操作 ansible-playbook playbook.yml
1
以上就是 Ansible 的基礎使用方法,更多的可以去參考 Ansible 的文檔。
--------------------- 一 Ansible簡介
? ?1.absible定義
? ?ansible是一個輕量級的運維管理工具,基于Python研發。可實現對系統的批量管理配置、程序的批量部署、批量的運行命令等功能。僅需在任意管理主機安裝ansible程序即可實現批量管理被管控主機且被管控的主機無需客戶端。
? ?2.ansible特性
? ?1、no agents:不需要在被管控主機上安裝任何客戶端;
? ?2、no server:無服務器端,使用時直接運行命令即可; 3、modules in any languages:基于模塊工作,可使用任意語言開發模塊; 4、yaml,not code:使用yaml語言定制劇本playbook; 5、ssh by default:基于SSH工作; 6、strong multi-tier solution:可實現多級指揮。 3.優點 1、輕量級,無需在客戶端安裝agent,更新時,只需在操作機上進行一次更新即可; 2、批量任務執行可以寫成腳本,而且不用分發到遠程就可以執行; 3、使用python編寫,維護更簡單,ruby語法過于復雜; 4、支持sudo 4.基本架構 Modules:模塊化?
? ?Core Modules 核心模塊?
? ?Customed Modules 自定義模塊?
? ?Host Iventory 主機庫清單,定義要管理的主機?
? ?Files 可以通過配置文件來實現?
? ?CMDB 也可以通過外部存儲來實現?
? ?PlayBooks 劇本,定義每個主機所扮演的角色?
? ?Connection Plugins:連接插件,主要連接各管控主機?
? ?5.工作機制 二 Ansible安裝
? ?1.ansible需python2.6以上版本
[root@test1 ~]# python -V
Python2.7.5
# 安裝python驅動(不然下面會報錯)
yum install python-devel -y
? ?2.安裝ansible
#setuptools安裝
cd
wget https://pypi.python.org/packages/source/s/setuptools/setuptools-7.0.tar.gz
tar xvzf setuptools-7.0.tar.gz
cd setuptools-7.0
python setup.py install
#pycrypto模塊安裝
wget https://pypi.python.org/packages/source/p/pycrypto/pycrypto-2.6.1.tar.gz
tar -xzf pycrypto-2.6.1.tar.gz
cd pycrypto-2.6.1
python setup.py install
#PyYAML模塊安裝
cd
wget http://pyyaml.org/download/libyaml/yaml-0.1.5.tar.gz
tar -xzf yaml-0.1.5.tar.gz
cd yaml-0.1.5
./configure --prefix=/usr/local
make -j `grep processor /proc/cpuinfo| wc -l` && make install
cd
wget https://pypi.python.org/packages/source/P/PyYAML/PyYAML-3.11.tar.gz
tar -xzf PyYAML-3.11.tar.gz
cd PyYAML-3.11
python setup.py install
#Jinja2模塊安裝
cd
wget https://pypi.python.org/packages/source/M/MarkupSafe/MarkupSafe-0.9.3.tar.gz
tar -xzf MarkupSafe-0.9.3.tar.gz
cd MarkupSafe-0.9.3
python setup.py install
cd
wget https://pypi.python.org/packages/source/J/Jinja2/Jinja2-2.7.3.tar.gz
tar xvzf Jinja2-2.7.3.tar.gz
cd Jinja2-2.7.3
python setup.py install
#paramiko模塊安裝
cd
wget https://pypi.python.org/packages/source/e/ecdsa/ecdsa-0.11.tar.gz
tar xvzf ecdsa-0.11.tar.gz
cd ecdsa-0.11
python setup.py install
cd
wget https://pypi.python.org/packages/source/p/paramiko/paramiko-1.15.1.tar.gz
tar xvzf paramiko-1.15.1.tar.gz
cd paramiko-1.15.1
python setup.py install
#ansible 2.2.2安裝
cd
wget http://releases.ansible.com/ansible/ansible-2.2.2.0.tar.gz
tar -xzf ansible-2.2.2.0.tar.gz
cd ansible-2.2.2.0
python setup.py install
mkdir /etc/ansible
cp -rp examples/* /etc/ansible/
? ?3.yum安裝
yum install epel-release -y
yum install ansible -y
三 Ansible相關配置
? ?1.ansible相關文件及命令
主程序目錄:/etc/ansible/
主配置文件:/etc/ansible/ansible.cfg
默認主機清單:/etc/ansible/hosts
插件目錄:/usr/share/ansible_plugins
主要命令:/usr/bin/ansible
/usr/bin/ansible-console
/usr/bin/ansible-doc
/usr/bin/ansible-galaxy
/usr/bin/ansible-playbook
/usr/bin/ansible-pull
/usr/bin/ansible-vault
#常用格式
ansible <host-pattern>[-f forks][-m module][-a args]
host-pattern # 可以是all,或者配置文件中的主機組名
-v,–verbose 詳細模式,如果命令執行成功,輸出詳細的結果(-vv –vvv -vvvv)
-i PATH,–inventory=PATH 指定host文件的路徑,默認是在/etc/ansible/hosts
-f NUM,–forks=NU NUM是指定一個整數,默認是5,指定fork開啟同步進程的個數。
-m NAME,–module-name=NAME 指定使用的module名稱,默認是command
-m DIRECTORY,–module-path=DIRECTORY 指定module的目錄來加載module,默認是/usr/share/ansible,
-a,MODULE_ARGS 指定module模塊的參數
-k,-ask-pass 提示輸入ssh的密碼,而不是使用基于ssh的密鑰認證
-sudo 指定使用sudo獲得root權限
-K,-ask-sudo-pass 提示輸入sudo密碼,與–sudo一起使用
-u USERNAME,-user=USERNAME 指定移動端的執行用戶
-C,-check 測試此命令執行會改變什么內容,不會真正的去執行
#查看各模塊
ansible-doc [options][modules]
# 主要選項有:
-l或--list # 列出可用的模塊
-s或--snippet #顯示指定模塊的簡略使用方法
? ?2.配置文件介紹
? ?配置文件:/etc/ansible/ansible.cfg
hostfile=/etc/ansible/hosts #指定默認hosts配置的位置
host_key_checking =False#不進行host_key檢查,省去目標key發生變化時輸入(yes/no)的步驟
ask_pass=True# 每次執行ansible命令是否詢問ssh密碼
ask_sudo_pass=True# 每次執行ansible命令時是否詢問sudo密碼
? ?配置文件:/etc/ansible/hosts
# Ex 1: Ungrouped hosts, specify before any group headers.
直接給出主機,IP主機名都可以
## 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 ...
## 192.168.1.100 ...
# If you have multiple hosts following a pattern you can specify
對主機進行通配001:006表示到一個范圍
## www[001:006].example.com
# Ex 3: A collection of database servers in the 'dbservers' group
定義一組數據庫服務器
## [dbservers]
## db02.intranet.mydomain.net ...
## 10.25.1.56 ...
#參數解釋
1, ansible_ssh_host :
指定主機別名對應的真實 IP,如:100 ansible_ssh_host=192.168.1.100,隨后連接該主機無須指定完整 IP,只需指定251就行
2, ansible_ssh_port :
指定連接到這個主機的 ssh 端口,默認22
3, ansible_ssh_user:
連接到該主機的 ssh 用戶
4, ansible_ssh_pass:
連接到該主機的ssh密碼(連-k 選項都省了),安全考慮還是建議使用私鑰或在命令行指定-k 選項輸入
5, ansible_sudo_pass: sudo 密碼
6, ansible_sudo_exe: sudo 命令路徑
7, ansible_connection :
連接類型,可以是local、ssh 或 paramiko,ansible1.2之前默認為 paramiko
8, ansible_ssh_private_key_file :私鑰文件路徑
9, ansible_shell_type :
目標系統的 shell 類型,默認為 sh,如果設置 csh/fish,那么命令需要遵循它們語法
10, ansible_python_interpreter :
python 解釋器路徑,默認是/usr/bin/python,但是如要要連BSD系統的話,就需要該指令修改 python 路徑
11, ansible__interpreter :
這里的"*"可以是 ruby 或 perl 或其他語言的解釋器,作用和 ansible_python_interpreter 類似
? ?3.主機與被控機建立ssh公私匙連接
? ?1.主機配置文件添加被控端
cat >>/etc/ansible/hosts <<EOF
[web]
192.168.1.168
192.168.1.186
EOF
? ?2.配置ssh無密碼登錄
#1.主機生成ssh密鑰
[root@test1 ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in/root/.ssh/id_rsa.
Your public key has been saved in/root/.ssh/id_rsa.pub.
The key fingerprint is:
e4:99:c4:17:c9:68:86:3c:ac:1b:20:19:c4:36:c1:fe root@test1
The key's randomart image is:
+--[ RSA 2048]----+
|==. o . o.. |
|o=. =.+ o. |
|o... . ++ . |
| . o + + |
| . o S |
| E. |
| |
| |
| |
+-----------------+
#2.將公鑰發到被管理節點用戶的.ssh目錄
[root@test1 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.168
The authenticity of host '192.168.1.168(192.168.1.168)' can't be established.
ECDSA key fingerprint is 80:a7:8d:c6:6c:14:27:5c:2b:dd:17:5e:ec:60:33:1c.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO:1 key(s) remain to be installed --if you are prompted now it is to install the new keys
root@192.168.1.168's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'root@192.168.1.168'"
and check to make sure that only the key(s) you wanted were added.
#3.驗證無密碼配置是否成功
[root@test1 ~]# ssh root@192.168.1.168
Last login: Wed Apr 12 11:02:08 2017 from 192.168.1.110
[root@test2 ~]#
#192.168.186執行2,3步即可
? ? 3.測試主機連通性
#測試web組中機器聯通性(測試所有用all)
[root@test1 ~]# ansible web -m ping
192.168.1.168| SUCCESS =>{
"changed": false,
"ping":"pong"
}
192.168.1.186| SUCCESS =>{
"changed": false,
"ping":"pong"
}
? ?4.常見模塊
ping:探測目標主機是否存活;
舉例: ansible all -m ping
command:在遠程主機執行命令;
舉例:ansible all -m command -a "ifconfig"
舉例:ansible all -m command -a "useradd centos"
shell:在遠程主機上調用shell解釋器運行命令,支持shell的各種功能,如管道等
舉例:ansible all -m shell -a "echo centos |passwd --stdin centos"
copy:復制文件,給定內容生成文件,mode, owner, group,follow,...
拷貝文件
舉例:ansible all -m copy -a "src=/etc/fstab dest=/tmp/fstab.ansible mode=640"
生成文件
舉例:ansible all -m copy -a "content='hell\nworld\n' dest=/tmp/fstab.ansible mode=640"
file:設置文件屬性
更改文件屬主
舉例:ansible all -m file -a "path=/tmp/fstab.ansible owner=centos"
刪除文件
舉例:ansible all -m file -a "path=/tmp/fstab.ansible state=absent"
state 用來定義目標文件狀態的
創建指定文件空目錄
舉例:ansible all -m file -a "path=/tmp/dir.ansible state=directory"
鏈接文件
舉例:ansible all -m file -a "path=/tmp/test.ansible.link src=/tmp/test.ansible
state=link"
fetch:從遠程主機拉取一個文件
ansible是用來管理多節點的,從遠程拉取多個文件到目標主機顯然不近乎仁義。所以用scp就能搞定。略過
cron:用來管理crontab的周期性任務
定義一個任務
舉例:ansible all -m cron -a "minute'*/5' job='/usr/sbin/ntpdate 10.1.0.1 &>/dev/null'
name='sync time'"
crontab -l
刪除一個任務
舉例:ansible all -m cron -a "name='sync time' state=absent"
只刪除用ansible定義的名
hostname:定義主機名
舉例:
yum:使用yum包管理器,完成程序包管理
舉例:ansible all -m yum -a "name=httpd"安裝
舉例:ansible all -m yum -a "name=httpd state=absent"刪除
service:控制服務,控制服務是否開機自動啟動
舉例:ansible all -m service -a "name=httpd state=started enbaled=true"
script模塊:
目的:在指定節點上執行/root/a.sh腳本(該腳本是在ansible主控端)
命令:ansible 10.1.1.113-m script -a ‘/root/a.sh‘
group:添加或者刪除組
舉例:
user:管理組賬號
舉例:
setup:收集遠程各主機的各種屬性之和
舉例:ansible all -m setup 5.PlayBook(各角色定義)(官方實例:https://github.com/ansible/ansible-examples)
? ?playbook是由一個或多個"play"組成的列表。play的主要功能在于將事先歸為一組的主機裝扮成事先通過ansible中的task定義好的角色。從根本上來將,所謂的task無非是調用ansible的一個module。將多個paly組織在一個playbook中,即可以讓他們聯通起來按事先編排的機制同唱一臺大戲。
playbook核心元素:
Tasks:任務,由模塊定義的操作的列表;
Variables:變量
Templates:模板,即使用了模板語法的文本文件;
Handlers:由特定條件觸發的Tasks;
Roles:角色;自包含,有完整獨立實體
playbook的基礎組件:
Hosts:運行指定任務的目標主機,可多個;
remote_user:在遠程主機以哪個用戶身份執行;
sudo_user:非管理員需要擁有sudo權限;
tasks:給出任務列表,執行完一個,執行第二個
模塊,模塊參數:
格式:
(1) action: module arguments //任務執行過程
(2) module name: arguments //指定運行的模塊
? ?playbook實例1(指揮web組內主機安裝httpd并監聽8080端口)
- hosts: web
remote_user: root
tasks:
- name: install httpd package
yum: name=httpd state=latest
tags: installpkg #指明跑某個標簽 -t installpkg
- name: install conf file
copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf
tags: installconf #指明跑某個標簽 -t installconf
notify: restart httpd service
- name: start httpd service
service: name=httpd state=started
handlers:#處理器,也是任務,在一定條件觸發
- name: restart httpd service
service: name=httpd state=restarted
#檢查語法,測試執行
ansible-playbook --syntax-check -t installconf --list-tags httpd.yaml
ansible-playbook --syntax-check httpd.yaml
ansible-playbook --list-hosts --list-tasks httpd.yaml
注意:
handlers:是指在一定條件下觸發,指明在一個需要讓別人重啟服務才生效的任務上使用notify,通知一定是handlers名字
tags:只執行playbook中指定的tags標簽,滿足部分需要,多個任務可指明一個同tags
也可以一次調用兩個標簽,如下
annsible-playbook -t installconf,installpkg httpd.yaml
? ?playbook實例2(自定義變量Varable,可自定義安裝任意程序包)
vim name.yaml
- hosts: web
remote_user: root
vars:
- pkgname: memcached #playbook中使用變量Variables
tasks:
- name: install a package
yum: name={{ pakgname }} state=present #自定義變量
#語法測試
ansible-playbook --syntax-check name.yaml
ansible-playbook -e pkgname=httpd/vsftpd/ name.yaml
#對應配置文件hosts設置
vim /etc/ansible/hosts
[web]
192.168.1.168 pkgname=nginx
192.168.1.186 pkgname=httpd
[web:vars]#為一個內不同主機定義相同變量,效果同上
#web組內有一組變量vars,其中變量pkgname值是memcaches
pkgname=memcached
Inventory還可以使用參數:
用于定義ansible遠程連接目標主機使用的屬性,而非傳遞給playbook的變量
如:[webserver]
192.168.1.168 ansible_ssh_user= ansible_ssh_pass ansible_sudo_pass
不再是傳遞給playbook變量,而是主機本身。
? ??when條件判斷
- name: start nginx service on CentOS6
shell: service nginx start
when: ansible_distribution =="CentOS" and ansible_distribution_major_version =="6"
- name: start nginx service
shell: systemctl start nginx.service
when: ansible_distribution =="CentOS" and ansible_distribution_major_version =="7"
? ?基于字符串列表給出元素?循環:迭代,需要重復執行的任務;
- name: install package
yum: name={{ item }} state=latest
with_items:
- httpd
- php
- php-mysql
- php-mbstring
- php-gd
? ?基于字典列表出元素?循環:迭代,需要重復任務;
- name: creat groups //第一個任務
yum: name={{ item }} state=latest
with_items:
- groupx1
- groupx2
- groupx3
- name: creat users //第二個任務
user: name={{ item.name }} group={{ item.group }} state=present
with_items://元素列表
-{name:'userx1', group:'groupx1'}//name鍵值隊
-{name:'userx1', group:'groupx1'}//name鍵值隊
-{name:'userx1', group:'groupx1'}//name鍵值隊
? ?
角色(自包含,按照目錄結構來組織) 指定由哪些主機去對應的完成哪個已定義好的角色
roles是以特定的層級目錄結構進行組織的tasks、variables、handlers、templates…
role_name/
files/:存儲由copy或script等模塊調用的文件;
tasks/:核心配置,分發資源和安裝軟件
handlers/: 發生改變則執行的操作(notify觸發)
vars/:?定義變量
templates/:存儲由template模塊調用的模板文本;
meta/: 說明信息,角色依賴等,一般不用
default/:此目錄中至少應該有一個名為main.yml的文件,用于設定默認變量;
Ansible官方文檔:http://www.ansible.com.cn/docs/playbooks_intro.html?
學習博客:http://guoxh.blog.51cto.com/10976315/1914287??
學習博客:http://zyxjohn.blog.51cto.com/5313197/1886251?
學習博客:http://51eat.blog.51cto.com/11892702/1891709? ---------------------
原文:https://blog.csdn.net/HzSunshine/article/details/70227803
ansible puppet saltstack三款自動化運維工具的對比
轉載于:https://www.cnblogs.com/DataArt/p/10204242.html
總結
以上是生活随笔為你收集整理的Ansible自动化运维工具使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓创建第一个工具类
- 下一篇: 阅读后感