真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

自動(dòng)化運(yùn)維工具之a(chǎn)nsible

一、ansiable介紹

合水網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、APP開(kāi)發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開(kāi)發(fā),運(yùn)營(yíng)維護(hù)。成都創(chuàng)新互聯(lián)于2013年成立到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)

ansible的架構(gòu)大致如下

自動(dòng)化運(yùn)維工具之a(chǎn)nsible

ansible是新出現(xiàn)的運(yùn)維工具是基于Python研發(fā)的糅合了眾多老牌運(yùn)維工具的優(yōu)點(diǎn)實(shí)現(xiàn)了批量操作系統(tǒng)配置、批量程序的部署、批量運(yùn)行命令等功能。

運(yùn)維工具常見(jiàn)的工作模式
1、agent模式: 基于ssl實(shí)現(xiàn)。代理工作在被監(jiān)控端。像puppet。
2、agentless模式: 基于ssh服務(wù)實(shí)現(xiàn)工作在被監(jiān)控端。監(jiān)控端是ssh的客戶端。

ansible是工作在agentless模式下具有冪等性。ansible在控制端只需要告訴監(jiān)控端的期望狀態(tài)就可以實(shí)現(xiàn)批量部署。

名詞解釋
冪等性不會(huì)重復(fù)執(zhí)行相同的指令。例如不會(huì)重復(fù)安裝軟件
期望狀態(tài)只需要告訴被監(jiān)控端的期望狀態(tài)

ansible是基于模塊工作的ansible本身沒(méi)有批量部署的能力。真正具有批量部署的是ansible所運(yùn)行的模塊ansible只是提供一種框架。架構(gòu)包括

  1. 連接插件connection plugins負(fù)責(zé)和被監(jiān)控端實(shí)現(xiàn)通信。

  2. Host Inventory:指定操作的主機(jī),是一個(gè)配置文件里面定義監(jiān)控的主機(jī)

  3. 各種模塊核心模塊command模塊自定義模塊

  4. 借助于插件完成記錄日志郵件等功能

  5. PlayBooks:劇本執(zhí)行多個(gè)任務(wù)時(shí)。并非必需可以讓節(jié)點(diǎn)一次性運(yùn)行多個(gè)任務(wù)

二、ansiale的基本使用

安裝ansible

#安裝epel源
[root@ansiable ~]# rpm -ivh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
[root@ansiable ~]# sed -i 's@#b@b@g' /etc/yum.repos.d/epel.repo
[root@ansiable ~]# sed -i 's@mirrorlist@#mirrorlist@g' /etc/yum.repos.d/epel.repo

#安裝ansible
[root@ansiable ~]# yum install ansible -y
[root@ansiable ~]# rpm -ql ansible |head
/etc/ansible
/etc/ansible/ansible.cfg          #ansible的主配置文件
/etc/ansible/hosts                #ansible的Inventory文件
/etc/ansible/roles                
/usr/bin/ansible                
/usr/bin/ansible-doc
/usr/bin/ansible-galaxy
/usr/bin/ansible-playbook
/usr/bin/ansible-pull
/usr/bin/ansible-vault

定義Host Inventory

[root@ansiable ~]# cat /etc/ansible/hosts 
[hosts]
192.168.3.45	ansible_ssh_user=root ansible_ssh_pass=123123
192.168.3.46	ansible_ssh_user=root ansible_ssh_pass=123123
#ansible_ssh_user=root 是ssh登陸用戶
#ansible_ssh_pass=guoting 是ssh登陸密碼3、測(cè)試各個(gè)模塊
# 注意每個(gè)模塊的用法可以使用 ansible-doc MOD 來(lái)查看例如ansible-doc copy
 
#ansible命令最常用的用法
#ansible  -m MOE -a 'MOD_ARV'所支持的模塊可以使用ansible-doc -l來(lái)查看

ansible示例

1、查看時(shí)間信息。command、shell模塊

#運(yùn)行command模塊
[root@ansiable ~]# ansible web -m command -a 'date'
192.168.3.45 | success | rc=0 >>
Thu Jul  2 14:22:27 CST 2015

192.168.3.46 | success | rc=0 >>
Thu Jul  2 14:51:29 CST 2015

#運(yùn)行shell模塊
[root@ansiable ~]# ansible web -m shell -a 'iptables -L -n'
192.168.3.46 | success | rc=0 >>
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22 
REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

192.168.3.45 | success | rc=0 >>
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22 
REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

2、在控制端添加添加用戶。user模塊

#創(chuàng)建用戶密碼
[root@ansiable ~]# echo "hadoop" |openssl passwd -1 -salt `openssl rand -hex 4` -stdin
$1$8710a47e$JMGYiMFd47q7rHO/g99x80

#添加用戶
[root@ansiable ~]# ansible web -m user -a 'name=hadoop comment="ansible add user" uid=1000 password="$1$8710a47e$JMGYiMFd47q7rHO/g99x80"'
192.168.3.45 | success >> {
    "changed": true, 
    "comment": "ansible add user", 
    "createhome": true, 
    "group": 1000, 
    "home": "/home/hadoop", 
    "name": "hadoop", 
    "password": "NOT_LOGGING_PASSWORD", 
    "shell": "/bin/bash", 
    "state": "present", 
    "system": false, 
    "uid": 1000
}

192.168.3.46 | success >> {
    "changed": true, 
    "comment": "ansible add user", 
    "createhome": true, 
    "group": 1000, 
    "home": "/home/hadoop", 
    "name": "hadoop", 
    "password": "NOT_LOGGING_PASSWORD", 
    "shell": "/bin/bash", 
    "state": "present", 
    "system": false, 
    "uid": 1000
}

#查看結(jié)果
[root@ansiable ~]# ansible web -m shell -a 'grep hadoop /etc/passwd'
192.168.3.46 | success | rc=0 >>
hadoop:x:1000:1000:ansible add user:/home/hadoop:/bin/bash

192.168.3.45 | success | rc=0 >>
hadoop:x:1000:1000:ansible add user:/home/hadoop:/bin/bash

三、YAML語(yǔ)言介紹

  1. YAML簡(jiǎn)介

YAML是一個(gè)可讀性高的用來(lái)表達(dá)資料序列的格式。YAML參考了其他多種語(yǔ)言包括XML、C語(yǔ)言、Python、Perl以及電子郵件格式RFC2822等。Clark Evans在2001年在首次發(fā)表了這種語(yǔ)言另外Ingy dtNet與Oren Ben-Kiki也是這語(yǔ)言的共同設(shè)計(jì)者。
YAML Ain't Markup Language即YAML不是XML。不過(guò)在開(kāi)發(fā)的這種語(yǔ)言時(shí)YAML的意思其實(shí)是"Yet Another Markup Language"仍是一種標(biāo)記語(yǔ)言。其特性
    YAML的可讀性好
    YAML和腳本語(yǔ)言的交互性好
    YAML使用實(shí)現(xiàn)語(yǔ)言的數(shù)據(jù)類型
    YAML有一個(gè)一致的信息模型
    YAML易于實(shí)現(xiàn)
    YAML可以基于流來(lái)處理
    YAML表達(dá)能力強(qiáng)擴(kuò)展性好
 
更多的內(nèi)容及規(guī)范參見(jiàn)http://www.yaml.org。
 
##########################YAML語(yǔ)法
 
YAML的語(yǔ)法和其他高階語(yǔ)言類似并且可以簡(jiǎn)單表達(dá)清單、散列表、標(biāo)量等數(shù)據(jù)結(jié)構(gòu)。其結(jié)構(gòu)Structure通過(guò)空格來(lái)展示序列Sequence里的項(xiàng)用"-"來(lái)代表
Map里的鍵值對(duì)用":"分隔。YAML文件擴(kuò)展名通常為.yaml或者.yml。下面是一個(gè)示例。
 
name: John Smith
age: 41gender: Male
spouse:
    name: Jane Smith
    age: 37
    gender: Female
children:
    -   name: Jimmy Smith
        age: 17
        gender: Male
    -   name: Jenny Smith
        age 13
        gender: Female
 
YAML 2 個(gè)重要的結(jié)構(gòu)組成部分list和directory
################################# list
 
列表的所有元素均使用“-”打頭例如
# A list of tasty fruits
- Apple
- Orange
- Strawberry
- Mango
 
##############################dictionary
 
字典通過(guò)key與valuef進(jìn)行標(biāo)識(shí)例如
---
# An employee record
name: Example Developer
job: Developer
skill: Elite
 
也可以將key:value放置于{}中進(jìn)行表示例如
---
# An employee record
{name: Example Developer, job: Developer, skill: Elite}
 
多個(gè)映射關(guān)系組成一個(gè)字典一個(gè)列表可以包含多個(gè)字典。

2.YAML中的變量

################################## 變量命名
變量名僅能由字母、數(shù)字和下劃線組成且只能以字母開(kāi)頭。
 
################################## facts
facts是由正在通信的遠(yuǎn)程目標(biāo)主機(jī)發(fā)回的信息這些信息被保存在ansible變量中。要獲取指定的遠(yuǎn)程主機(jī)所支持的所有facts可使用如下命令進(jìn)行
# ansible hostname -m setup 這個(gè)命令可以獲得被監(jiān)控端主機(jī)的各種信息將這些信息得到后保存到變量中。
 
################################ 自定義變量
在 yaml 中可以使用vars關(guān)鍵字來(lái)定義變量
vars:
  var_name: value
 
############################# 變量的引用
{{ var_name }}
 
 
########################### 特殊的變量迭代
當(dāng)有需要重復(fù)性執(zhí)行的任務(wù)時(shí)可以使用迭代機(jī)制。其使用格式為將需要迭代的內(nèi)容定義為item變量引用并通過(guò)with_items語(yǔ)句來(lái)指明迭代的元素列表即可。
 
#######################################示例
例如在被控端添加 2 個(gè)用戶
 
方式1一般做法
- name: add user testuser1
  user: name=testuser1 state=present groups=wheel
- name: add user testuser2
  user: name=testuser2 state=present groups=wheel
 
方式2使用變量方式
- name: add several users
  vars:
   user1: testuser1
   user2: testuser2
  user: name={{ user1 }} state=present groups=wheel
  user: name={{ user2 }} state=present groups=wheel
  
方式3使用迭代方式
- name: add several users
  user: name={{ item }} state=present groups=wheel
  with_items:     
    - testuser1     
    - testuser2
事實(shí)上with_items中可以使用元素還可為hashes例如
- name: add several users
  user: name={{ item.name }} state=present groups={{ item.groups }}
  with_items:
    - { name: 'testuser1', groups: 'wheel' }
    - { name: 'testuser2', groups: 'root' }

3.Inentory文件的格式

inventory文件遵循INI文件風(fēng)格中括號(hào)中的字符為組名。可以將同一個(gè)主機(jī)同時(shí)歸并到多個(gè)不同的組中此外當(dāng)如若目標(biāo)主機(jī)使用了非默認(rèn)的SSH端口還可以在主機(jī)名稱之后使用冒號(hào)加端口號(hào)來(lái)標(biāo)明。
 
[webservers]
www1.magedu.com:2222
www2.magedu.com
[dbservers]
db1.magedu.com
db2.magedu.com
db3.magedu.com
 
如果主機(jī)名稱遵循相似的命名模式還可以使用列表的方式標(biāo)識(shí)各主機(jī)例如
[webservers]
www[01:50].example.com
[databases]
db-[a:f].example.com
 
#################### 主機(jī)變量
可以在inventory中定義主機(jī)時(shí)為其添加主機(jī)變量以便于在playbook中使用。例如
[webservers]
www1.magedu.com http_port=80 maxRequestsPerChild=808
www2.magedu.com http_port=303 maxRequestsPerChild=909
 
################### 組變量
組變量是指賦予給指定組內(nèi)所有主機(jī)上的在playbook中可用的變量。例如
 
[webservers]
www1.magedu.com
www2.magedu.com
 
[webservers:vars]
ntp_server=ntp.magedu.com
nfs_server=nfs.magedu.com
 
################## 組嵌套
inventory中組還可以包含其它的組并且也可以向組中的主機(jī)指定變量。不過(guò)這些變量只能在ansible-playbook中使用而ansible不支持。例如
 
[apache]
httpd1.magedu.com
httpd2.magedu.com
 
[nginx]
ngx1.magedu.com
ngx2.magedu.com
 
[webservers:children]
apache
nginx
 
[webservers:vars]
ntp_server=ntp.magedu.com
 
######################### inventory參數(shù)
 
ansible基于ssh連接inventory中指定的遠(yuǎn)程主機(jī)時(shí)還可以通過(guò)參數(shù)指定其交互方式常用的參數(shù)如下所示
ansible_ssh_host  # 要連接的主機(jī)名
ansible_ssh_port  # 端口號(hào)默認(rèn)是22
ansible_ssh_user  # ssh連接時(shí)默認(rèn)使用的用戶名
ansible_ssh_pass  # ssh連接時(shí)的密碼
ansible_sudo_pass # 使用sudo連接用戶是的密碼
ansible_ssh_private_key_file # 秘鑰文件如果不想使用ssh-agent管理時(shí)可以使用此選項(xiàng)
ansible_shell_type # shell的類型默認(rèn)sh
#########################################################################################
ansible的循環(huán)機(jī)制還有更多的高級(jí)功能具體請(qǐng)參見(jiàn)官方文檔http://docs.ansible.com/playbooks_loops.html。

4.playbooks

playbook是由一個(gè)或多個(gè)“play”組成的列表。play的主要功能在于將事先歸并為一組的主機(jī)裝扮成事先通過(guò)ansible中的task定義好的角色。
從根本上來(lái)講所謂task無(wú)非是調(diào)用ansible的一個(gè)module。將多個(gè)play組織在一個(gè)playbook中即可以讓它們聯(lián)同起來(lái)按事先編排的機(jī)制同唱一臺(tái)大戲。
 
###########################playbook基礎(chǔ)組件
1、Hosts和Users
 
playbook中的每一個(gè)play的目的都是為了讓某個(gè)或某些主機(jī)以某個(gè)指定的用戶身份執(zhí)行任務(wù)。
hosts用于指定要執(zhí)行指定任務(wù)的主機(jī)其可以是一個(gè)或多個(gè)由冒號(hào)分隔主機(jī)組。
remote_user則用于指定遠(yuǎn)程主機(jī)上的執(zhí)行任務(wù)的用戶。
 
不過(guò)remote_user也可用于各task中。也可以通過(guò)指定其通過(guò)sudo的方式在遠(yuǎn)程主機(jī)上執(zhí)行任務(wù)其可用于play全局或某任務(wù)。
此外甚至可以在sudo時(shí)使用sudo_user指定sudo時(shí)切換的用戶。
 
- hosts: webnodes
  remote_user: mageedu
  tasks:
  - name: test connection   ping:
    remote_user: mageedu    sudo: yes
 
2、任務(wù)列表和action
play的主體部分是task list。task list中的各任務(wù)按次序逐個(gè)在hosts中指定的所有主機(jī)上執(zhí)行即在所有主機(jī)上完成第一個(gè)任務(wù)后再開(kāi)始第二個(gè)。
在運(yùn)行自下而下某playbook時(shí)如果中途發(fā)生錯(cuò)誤所有已執(zhí)行任務(wù)都將回滾因此在更正playbook后重新執(zhí)行一次即可。
task的目的是使用指定的參數(shù)執(zhí)行模塊而在模塊參數(shù)中可以使用變量。模塊執(zhí)行是冪等的這意味著多次執(zhí)行是安全的因?yàn)槠浣Y(jié)果均一致。
每個(gè)task都應(yīng)該有其name用于playbook的執(zhí)行結(jié)果輸出建議其內(nèi)容盡可能清晰地描述任務(wù)執(zhí)行步驟。如果未提供name則action的結(jié)果將用于輸出。
 
定義task的可以使用“action: module options”或“module: options”的格式推薦使用后者以實(shí)現(xiàn)向后兼容。
如果action一行的內(nèi)容過(guò)多也中使用在行首使用幾個(gè)空白字符進(jìn)行換行。
         
tasks:
- name: make sure apache is running
  service: name=httpd state=running
 
在眾多模塊中只有command和shell模塊僅需要給定一個(gè)列表而無(wú)需使用“key=value”格式例如
tasks:
- name: disable selinux
  command: /sbin/setenforce 0如果命令或腳本的退出碼不為零可以使用如下方式替代
tasks:
- name: run this command and ignore the result
  shell: /usr/bin/somecommand || /bin/true        
或者使用ignore_errors來(lái)忽略錯(cuò)誤信息
tasks:
- name: run this command and ignore the result
  shell: /usr/bin/somecommand
  ignore_errors: True    
     
3、handlers
     
用于當(dāng)關(guān)注的資源發(fā)生變化時(shí)采取一定的操作。
 
“notify”這個(gè)action可用于在每個(gè)play的最后被觸發(fā)這樣可以避免多次有改變發(fā)生時(shí)每次都執(zhí)行指定的操作取而代之僅在所有的變化發(fā)生完成后一次性地執(zhí)行指定操作。在notify中列出的操作稱為handler也即notify中調(diào)用handler中定義的操作。
 
- name: template configuration file
  template: src=template.j2 dest=/etc/foo.conf
  notify:
   - restart memcached
   - restart apache    
 
handler是task列表這些task與前述的task并沒(méi)有本質(zhì)上的不同。
 
handlers:
 - name: restart memcached
   service:  name=memcached state=restarted
- name: restart apache
   service: name=apache state=restarted

5.tags

tags用于讓用戶選擇運(yùn)行或路過(guò)playbook中的部分代碼。ansible具有冪等性因此會(huì)自動(dòng)跳過(guò)沒(méi)有變化的部分即便如此有些代碼為測(cè)試其確實(shí)沒(méi)有發(fā)生變化的時(shí)間依然會(huì)非常地長(zhǎng)。此時(shí)如果確信其沒(méi)有變化就可以通過(guò)tags跳過(guò)此些代碼片斷。
 
示例基于playbooks實(shí)現(xiàn)web服務(wù)的部署
1、提供好Inventory文件
# /etc/ansible/hosts基于秘鑰認(rèn)證
[webhosts]
172.16.10.22
172.16.10.33
 
2、編輯 palybooks 劇本
# vim  /root/web.yaml
- name: web service
  remote_user: root
  hosts: webhosts
  vars:
    packages: httpd
  tasks:
    - name: install httpd      yum: name={{ packages }} state=present
      tags: install
    - name: configuration httpd
      copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf
      tags: conf
      notify:
        - restart httpd
    - name: service httpd start
      service: name=httpd enabled=no state=started
      tags: start
    - name: add centos and hadoop user
      user: name={{ item }} state=absent
      tags: adduser
      with_items:
        - centos
        - hadoop
  handlers:
        - name: restart httpd
          service: name=httpd state=restarted
 
3、準(zhǔn)備好配置文件
 將web的配置放到指定目錄 src=/root/httpd.conf
 
4、開(kāi)始部署
ansible-playbooks /root/web.yml


本文名稱:自動(dòng)化運(yùn)維工具之a(chǎn)nsible
本文鏈接:http://weahome.cn/article/psigdd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部