ansible的用法

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

(0)
zzzzz1357x1zzzzz1357x1
上一篇 2016-11-11 08:41
下一篇 2016-11-11 08:41

相關推薦

  • linux 學習(2)

    1 linux 常見的文件管理命令都有哪些?其常用的使用方法。 ls 文件列出命令   常見選項  -l 顯示長文本信息          -d 顯示當前目錄信息          -a 顯示所有文件信息     &nb…

    Linux干貨 2016-10-09
  • suid, sgid, sticky簡介

    SUID屬性 passwd命令可以用于更改用戶的密碼,一般用戶可以使用這個命令修改自己的密碼。但是保存用戶密碼的/etc/shadow文件的權限是000,也就是說只有文件的所有者root用戶可以寫入,那為什么其他用戶也可以修改自己的密碼呢?這就是由于Linux的文件系統中的文件有SUID屬性。 [root@centos6 ~]# ll /etc/shadow…

    Linux干貨 2017-07-27
  • 網絡班N22期第二周博客作業

    一、Linux常用文件管理命令及用法。  (1)、cat,由第一行開始顯示內容,并將所有內容輸出     用法:cat [OPTION]… [FILE]…      常用選項:     &nbsp…

    Linux干貨 2016-08-22
  • MySQL常用命令

    本文大綱 MySQL命令             (0%) 交互式CLI工具     服務端命令 mysqld服務器程序 數據類型 DDL語句                 &n…

    Linux干貨 2017-02-16
  • OPenSSL

    OPenSSL   OpenSSL 是一個安全套接字層密碼庫,囊括主要的密碼算法、常用的密鑰和證書封裝管理功能及SSL協議,并提供豐富的應用程序供測試或其它目的使用.   SSL是Secure Sockets Layer(安全套接層協議)的縮寫,可以在Internet上提供秘密性傳輸。Netscape公司在推出第一個Web瀏覽器的同時,提出了SSL協議標準?!?/p>

    Linux干貨 2016-11-07
  • 軟連接與硬鏈接區別

    前言: 今天學習了文件系統,簡單的接觸到文件系統構成的原理。原來我們不管在linux和win上面刪除某個文件只是刪除一個鏈接而已。而linux把鏈接分為軟鏈接和硬鏈接。接下來我們就從文件系統構成的基本原理出發來說明下linux軟鏈接和硬鏈接的區別。 文件系統簡述: linux的哲學就是一切皆文件。為了方便人們的使用,我們可以通過看文件名來區分不同的文件。但作…

    Linux干貨 2016-10-31
欧美性久久久久