ansible
每臺主機擁有不同的功能,可能同時是http服務器,php-fpm的客戶端,共享存儲的客戶端等,這些功能是單獨定義的,不同主機需要的功能各不相同
應確保目標主機的狀態為事先給他定義的目標狀態
使目標主機達到目標狀態有兩種方法
agentless:由服務端主機通過ssh連接到目標主機執行命令,客戶端不需要額外的客戶端程序,只需有能夠支持ssh,但這樣服務端主機需要有所有目標主機的賬號密碼(但是由泄露的風險sudo是一種解決安全的方式)
agent:在目標主機安裝客戶端程序,以管理員身份運行,服務端主機只需要向客戶端程序發送指令就可以由客戶端執行命令,客戶端和服務端一般通過http,https等運行
agent:基于專用的agent程序完成管理功能,puppet, func, zabbix, …
agentless:基于ssh服務完成管理,ansible, fabric, …
冪等:不論執行多少次結果相等
安裝及程序環境:
程序:
ansible
ansible-playbook
ansible-doc
配置文件:
/etc/ansible/ansible.cfg
主機清單:
/etc/ansible/hosts
插件目錄:
/usr/share/ansible_plugins/
ansible命令:
Usage: ansible <host-pattern> [options](此處的主機名必須是在配置文件中定義過的,使用all則表示所有的主機)
ansible想要使用必須給出ssh使用的用戶名和密碼,或者可以基于秘鑰驗證ssh
通過用戶名密碼驗證則直接將用戶名和密碼寫在/etc/ansible/host定義的主機的后面(較危險)
ansible_ssh_user
ansible_ssh_pass
設置基于秘鑰驗證的方式
1.生成秘鑰 ssh-keygen -t rsa
2.生成的秘鑰默認存放在用戶家目錄的.ssh目錄下,將秘鑰復制到遠程主機
ssh-copy-id -i id_rsa.pub 10.1.252.184
常用選項:
-m MOD_NAME(模塊名) -a MOD_ARGS(模塊的參數)
/etc/ansible/hosts配置主機的三種方式
1.直接給出IP地址或主機名
blue.example.com
192.168.100.1
2.定義一個組名,給出組成員的IP地址或主機名
[webservers]
alpha.example.org
192.168.1.100
3.使用通配的主機名
www[001:006].example.com(表示www001.example.com,www002.example.com….)
ansible-doc -l列出可以使用的模塊
ansible-doc -s 模塊名 獲取模塊使用方式(通常帶=的選項是必須給定的)
注意:參數最好使用‘或“括起來,如果存在空格則此動作為必須
script模塊:將腳本復制到遠程主機執行完成后刪掉
copy: C o p i e s f i l e s t o r e m o t e l o c a t i o n s .
用法:
(1) 復制文件
-a "src= dest= "
ansible all -m copy -a "src=/etc/issue dest=/root mode=777"
(2) 給定內容生成文件(此種模式會在遠程主機創建dest= 指定的文件,內容為content=的內容)
-a "content= dest= "
ansible all -m copy -a "content=hehehe dest=/root/hehe mode=777"
其它參數:mode(指定文件的權限), owner(指定屬主), group(指定屬組), …
file:Sets attributes of files
用法:
(1) 創建目錄:
-a "path= state=directory"
ansible all -m file -a "path=/root/h state=directory"
(2) 創建鏈接文件:
-a "path= src= state=link"
ansible all -m file -a "src=/root/hehe path=/root/j state=link"
(3) 刪除文件:
-a "path= state=absent“
ansible all -m file -a "path=/root/h state=absent"
(4)創建文件
ansible all -m file -a "path=/root/h state=touch"
fetch:Fetches a file from remote nodes
從遠程拉取文件到本地,但是如果同時從所有遠程主機拉取文件會造成覆蓋,所以通常從一臺,但是這樣的話使用scp就能夠完成
cron:Manage cron.d and crontab entries.(計劃任務)
-a ""
minute=
hour=
day=
month=
weekday=
job=
name=
user=
state={present|absent}(創建|刪除)
*/5 * * * * /usr/sbin/ntpdate 10.1.0.1>/dev/null
ansible all -m cron -a "name=hehe state=absent"
hostname:Manage hostname
name=
yum:Manages packages with the I( yum) package manager(安裝或刪除程序包)
-a ""
(1) name= state={present|latest}(安裝)
ansible all -m yum -a name=tree
ansible all -m yum -a name=/path/to/tree可以使用yum模塊安裝本地的程序包
(2) name= state=absent(刪除)
ansible all -m yum -a "name=tree state=absent"
service:M a n a g e s e r v i c e s .(管理服務)
-a ""
name=
state=
started
stopped
restarted
ansible all -m service -a "name=httpd state=started"
enabled=(是否開機自動啟動yse|no,true|false)
runlevel=
group: A d d o r r e m o v e g r o u p s添加或刪除組
-a ""
name=
state=
system=是否添加為系統組
gid=指定gid
user:M a n a g e u s e r a c c o u n t s
-a ""
name=
group=基本組(不指定則為和用戶同名私有組)
groups=附加組
comment=(注釋信息)
uid=
system=(是否為系統用戶)
shell=(shell類型)
expires=(過期時間)
home=(指定家目錄路徑)
setup:Gathers facts about remote hosts(收集遠程主機各種信息)
ansible all -m setup
常用模塊:
ping:探測目標主機是否存活;
command:在遠程主機執行命令;
ansible all -m command -a ifconfig(此處的命令是自己定義的相當于ssh連接到遠程主機所能執行的所有命令)
注意:command模塊不能理解管道格式,要采用復雜格式的命令需要使用shell模塊,command只能識別第一個命令
shell:在遠程主機上調用shell解釋器運行命令,支持shell的各種功能,例如管道等 ;
注意:command和shell模塊的核心參數直接為命令本身;而其它模塊的參數通常為“key=value”格式;
YAML:一種模板語言,數據序列化工具
數據結構:
key:value
兩種數據結構
1. – item1
– item2
– item3
2. {name:jerry, age:21}數據結構:(字典)
PlayBook:以任務為核心,在所有主機完成第一個任務再進行第二個任務
核心元素:
Tasks:任務,由模塊定義的操作的列表;
Variables:變量
Templates:模板,即使用了模板語法的文本文件;
Handlers:由特定條件觸發的Tasks;
Roles:角色;
playbook的基礎組件:
Hosts:運行指定任務的目標主機;
remote_user:在遠程主機以哪個用戶身份執行;
sudo_user:非管理員需要擁有sudo權限;
tasks:任務列表
模塊,模塊參數:
格式:
(1) action: module arguments
(2) module: arguments(使用較廣泛)
playbook使用ansible-playbook命令來執行,用法為 ansible-playbook 文件名稱
ansible-playbook group.yml
ansible-playbook –syntax-check group.yml 對編寫的playbook進行語法檢查
ansible-playbook –syntax-check group.yml
在實際執行之前可以使用 ansible-playbook -C 文件名 來顯示執行效果,但并不會真正執行
ansible-playbook -C group.yml
GATHERING FACTS為收集主機信息,為默認行為,changed為需要執行的,ok的表示已經滿足條件
ansible-playbook -C –list-hosts group.yml 顯示每個play影響到的主機(每個hosts為一個play)
ansible-playbook -C –list-tasks group.yml 顯示每個play執行的任務
只運行部分任務的時候
ansible-playbook /path/to/playbook.yaml
-t TAGS, –tags=TAGS 只運行有此標簽的任務(一個標簽可以對應多個任務,一次執行可以調用多個標簽,通過,分割)
–skip-tags=SKIP_TAGS 只跳過有此標簽的任務
–start-at-task=START_AT 從此標簽開始運行任務
– name: remove
yum: name=tree state=absent
tags: aaa
ansible-playbook -t aaa http.yml
handler:觸發器任務,放置在某任務中時只有該任務執行才會觸發notify執行handler
– name: copy conf
copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf
notify: restart
handlers:
– name: restart
service: name=httpd state=restarted
Variables:變量
內建:可直接調用
自定義:(注意,在命令行中定義的變量優先級比playbook中定義的高)
此處優先級排序:命令行>role>playbool>inventory
(1) 命令行傳遞;
-e VAR=VALUE(可以有多個-e)
– hosts: all
remote_user: root
tasks:
– name: install httpd
yum: name={{name}} state=latest
ansible-playbook –check -e name=vsftpd http.yml
(2) 在hosts Inventory中為每個主機定義專用變量值;
(a) 向不同的主機傳遞不同的變量 ;
IP/HOSTNAME variable_name=value
[web]
10.1.252.38 name=httpd
10.1.252.37 name=nginx
(b) 向組內的所有主機傳遞相同的變量 ;
[groupname:vars](固定寫法)
variable_name=value
[web]
10.1.252.38
10.1.252.37
[web:vars]
name=tree
(3) 在playbook中定義(注意,vars不能定義在tasks或handler中)
vars:
– var_name: value
– var_name: value
– hosts: all
remote_user: root
vars:
– name: vsftpd
tasks:
– name: install httpd
yum: name={{name}} state=latest
(4) Inventory還可以使用參數:
用于定義ansible遠程連接目標主機時使用的屬性,而非傳遞給playbook的變量;
ansible_ssh_host
ansible_ssh_port
ansible_ssh_user
ansible_ssh_pass
ansible_sudo_pass
…
(5) 在角色調用時傳遞
roles:
– { role: ROLE_NAME, var: value, …}
變量調用:
{{ var_name }}
變量調用:
{{ var_name }}
示例:
– hosts: all
remote_user: root
tasks:
– name: create group
group: name=hehe
– hosts: web
remote_user: root
tasks:
– name: install tree
yum: name=tree
示例:- hosts: all
remote_user: root
tasks:
– name: install httpd
yum: name=httpd state=latest
– name: copy conf
copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf
– name: start httpd
service: name=httpd state=started
Templates:模板(將文件中的變量替換成客戶端主機的相關數據)
文本文件,內部嵌套有模板語言腳本(使用模板語言編寫,jinja2)
語法:
字面量:(支持的數據類型)
字符串:使用單引號或雙引號;
數字:整數、浮點數;
列表:[item1, item2, …]
元組:(item1, item2, …)
字典:{key1:value1, key2:value2, …}
布爾型:true/false
示例 – hosts: all
remote_user: root
tasks:
– name: copy
template: src=/root/ceshi.j2 dest=/root/ceshi
cat ceshi.j2
{{ ansible_memfree_mb }}
算術運算:
+, -, *, /, //(整除), %(取模), **(取次方)
比較操作:
==, !=, >, <, >=, <=
邏輯運算:and, or, not
執行模板文件中的腳本,并生成結果數據流,需要使用template模塊;
template:
-a ”“
src=
dest=
mode=
onwer=
group=
注意:此模板不能在命令行使用,而只能用于playbook;
條件測試:
when語句:在tasks中使用,Jinja2的語法格式;(注意,多個變量要用and,or連接,變量和數值要用 ==連接,不能用=)
– hosts: all
remote_user: root
tasks:
– name: copy6
copy: src=/root/centos6 dest=/root/
when: ansible_distribution == "CentOS" and ansible_distribution_major_version == "6"
– name: copy6
copy: src=/root/centos7 dest=/root/
when: ansible_distribution == "CentOS" and ansible_distribution_major_version == "7"
循環:迭代,需要重復執行的任務;
對迭代項的引用,固定變量名為"item”,使用with_item屬性給定要迭代的元素;
元素:列表
字符串
字典
基于字符串列表給出元素示例:
– hosts: all
remote_user: root
tasks:
– name: install
yum: name={{ item }} state=latest
with_items:
– httpd
– tree
– nginx
基于字典列表給元素示例:
– hosts: all
remote_user: root
tasks:
– name: create groups
group: name={{ item }} state=present
with_items:
– groupx1
– groupx2
– groupx3
– name: create users
user: name={{ item.name }} group={{ item.group }} state=present
with_items:
– {name: 'userx1', group: 'groupx1'}
– {name: 'userx2', group: 'groupx2'}
– {name: 'userx3', group: 'groupx3'}
角色:roles(將一個playbook中的內容拆分,角色也可以定義標簽)
以特定的層級目錄結構進行組織的tasks、variables、handlers、templates、files等;(如果沒有的內容可以不創建目錄)
role_name/
files/:存儲由copy或script等模塊調用的文件;
tasks/:此目錄中至少應該有一個名為main.yml的文件,用于定義各task;其它的文件需要由main.yml進行“包含”調用;include
handlers/:此目錄中至少應該有一個名為main.yml的文件,用于定義各handler;其它的文件需要由main.yml進行“包含”調用;
vars/:此目錄中至少應該有一個名為main.yml的文件,用于定義各variable;其它的文件需要由main.yml進行“包含”調用;
在此種結構下變量的定義方法為 變量名:值 前面不需要-
templates/:存儲由template模塊調用的模板文本;
meta/:此目錄中至少應該有一個名為main.yml的文件,定義當前角色的特殊設定及其依賴關系;其它的文件需要由main.yml進行“包含”調用;
default/:此目錄中至少應該有一個名為main.yml的文件,用于設定默認變量;
在main.yml中調用的時候,如果按要求存放在以上目錄則不用寫目錄名,直接寫文件名就可以調用
在playbook中調用角色的方法:
– hosts: HOSTS
remote_user: USERNAME
roles:
– ROLE1
– ROLE2
– { role: ROLE3, VARIABLE: VALUE, …}
– { role: ROLE4, when: CONDITION }
ansible 默認每五個一組進行處理,可以修改配置文件或者使用ansible-playbook -f指定
原創文章,作者:zzzzz1357x1,如若轉載,請注明出處:http://www.www58058.com/57871