天天看點

Ansible詳解(二)

一、YAML簡介

二、Ansible元件

三、主機清單Invetory

四、PlayBook介紹

http://www.yaml.org

YAML:可以使用簡單清單,散清單,标題等資料結構。

YAML的文法和其他高階語言類似,并且可以簡單表達清單、散清單、标量等資料結構。其結構(Structure)通過空格來展示,序列(Sequence)裡的項用"-"來代表,Map裡的鍵值對用":"分隔。下面是一個示例。

    yet another markup language //仍是一種标記語言

name: John kona //key為name,value為John,kona

age: 41

gender: Male

spouse: //kv可以嵌套,kev:value(key:value)

    name: Jane Smith  

    age: 37

    gender: Female //k/v可以嵌套

children:

    -   name: Jimmy Smith //-:清單,後面的都是清單元素    

        age: 17        //name和age,gender都是children的鍵key

        gender: Male

    -   name: Jenny Smith

        age 13

        gender: Female

YAML檔案擴充名通常為.yaml,如example.yaml。

1)list

清單的所有元素均使用“-”打頭,例如:

# A list of tasty fruits

- Apple

- Orange

- Strawberry

- Mango

2)dictionary

字典通過key與value進行辨別 //多個key-value聯合起來就叫做字典

例如:

---

# An employee record

name: Example Developer

job: Developer

skill: Elite

也可以将key:value放置于{}中進行表示,例如:

{name: Example Developer, job: Developer, skill: Elite}

Inventory

Modules

Ad Hoc Commands

Playbooks元件:

    Tasks任務

    Variables變量,ansible有自帶的變量,也可以自定義

    Templates模闆,包含了模闆文法的文本檔案;

    Handlers處理器,特定條件下才會被觸發的任務    

    Roles角色

1.主機與組:/etc/ansible/hosts

ansible的預設的inventory file為/etc/ansible/hosts。

inventory file可以有多個,且也可以通過Dynamic Inventory來動态生成。

inventory檔案格式

inventory檔案遵循INI檔案風格,中括号中的字元為組名。可以将同一個主機同時歸并到多個不同的組中;此外,當如若目标主機使用了非預設的SSH端口,還可以在主機名稱之後使用冒号加端口号來标明。

ntp.wolf.com

[webservers]

www1.wolf.com:2222

www2.wolf.com

[dbservers]

db1.wolf.com

db2.wolf.com

db3.wolf.com

如果主機名稱遵循相似的命名模式,還可以使用清單的方式辨別各主機,例如:

www[01:50].example.com

[databases]

db-[a:f].example.com

2.主機變量

可以在inventory中定義主機時為其添加主機變量以便于在playbook中使用。例如:

www1.wolf.com http_port=80 maxRequestsPerChild=808

www2.wolf.com http_port=8080 maxRequestsPerChild=909

3.組變量

組變量是指賦予給指定組内所有主機上的在playbook中可用的變量。例如:

www1.wolf.com

[webservers:vars]

ntp_server=ntp.wolf.com

nfs_server=nfs.wolf.com

4.組嵌套

inventory中,組還可以包含其它的組,并且也可以向組中的主機指定變量。不過,這些變量隻能在ansible-playbook中使用,而ansible不支援。例如:

[apache]

httpd1.wolf.com

httpd2.wolf.com

[nginx]

ngx1.wolf.com

ngx2.wolf.com

[webservers:children]

apache

nginx

5.inventory參數

<code>ansible基于</code><code>ssh</code><code>連接配接inventory中指定的遠端主機時,還可以通過參數指定其互動方式;這些參數如下所示:</code>

<code>ansible_ssh_host </code><code>//</code><code>将要連接配接的遠端主機名.與你想要設定的主機的别名不同的話,可通過此變量設定.</code>

<code>ansible_ssh_port  </code><code>//ssh</code><code>端口号.如果不是預設的端口号,通過此變量設定.</code>

<code>ansible_ssh_user  </code><code>//</code><code>預設的 </code><code>ssh</code> <code>使用者名</code>

<code>ansible_ssh_pass  </code><code>//ssh</code> <code>密碼(這種方式并不安全,我們強烈建議使用 --ask-pass 或 SSH 密鑰)</code>

<code>ansible_sudo_pass  </code><code>//sudo</code> <code>密碼(這種方式并不安全,我們強烈建議使用 --ask-</code><code>sudo</code><code>-pass)</code>

<code>ansible_sudo_exe (new </code><code>in</code> <code>version 1.8)  </code><code>//</code> <code>sudo</code> <code>指令路徑(适用于1.8及以上版本)</code>

<code>ansible_connection  </code><code>//</code> <code>與主機的連接配接類型.比如:</code><code>local</code><code>, </code><code>ssh</code> <code>或者 paramiko. Ansible 1.2 以前預設使用 paramiko.1.2 以後預設使用 </code><code>'smart'</code><code>,</code><code>'smart'</code> <code>方式會根據是否支援 ControlPersist, 來判斷</code><code>'ssh'</code> <code>方式是否可行.</code>

<code>ansible_ssh_private_key_file </code><code>//ssh</code> <code>使用的私鑰檔案.适用于有多個密鑰,而你不想使用 SSH 代理的情況.</code>

<code>ansible_shell_type </code><code>//</code><code>目标系統的shell類型.預設情況下,指令的執行使用 </code><code>'sh'</code> <code>文法,可設定為 </code><code>'csh'</code> <code>或 </code><code>'fish'</code><code>.</code>

<code>ansible_python_interpreter </code>

<code>    </code><code>目标主機的 python 路徑.适用于的情況: 系統中有多個 Python, 或者指令路徑不是</code><code>"/usr/bin/python"</code><code>,比如  \*BSD, 或者 </code><code>/usr/bin/python</code>

<code>    </code><code>不是 2.X 版本的 Python.我們不使用 </code><code>"/usr/bin/env"</code> <code>機制,因為這要求遠端使用者的路徑設定正确,且要求 </code><code>"python"</code> <code>可執行程式名不可為 python以外的名字(實際有可能名為python26).</code>

<code>    </code><code>與 ansible_python_interpreter 的工作方式相同,可設定如 ruby 或 perl 的路徑....</code>

<code>[webservers]  </code><code>//</code><code>組名用[ ] </code>

<code>foo.example.com</code>

<code>bar.example.com</code>

<code>[dbservers]</code>

<code>badwolf.example.com:5309  </code><code>//</code><code>端口号不是預設22</code>

<code>jumper ansible_ssh_port=5555 ansible_ssh_host=192.168.1.50  </code><code>//jumper</code><code>是主機名,ansible_ssh_port和ansible_ssh_port是主機變量,适用于單個主機</code>

<code>other1.example.com     ansible_connection=</code><code>ssh</code>        <code>ansible_ssh_user=mpdehaan </code><code>//</code><code>指定使用者名</code>

<code>localhost              ansible_connection=</code><code>local</code>

<code>[atlanta]</code>

<code>host1 http_port=80 maxRequestsPerChild=808  </code><code>//</code><code>主機變量</code>

<code>host2 http_port=303 maxRequestsPerChild=909</code>

<code>一個系統可以屬于不同的組,比如一台伺服器可以同時屬于 webserver組 和 dbserver組.這時屬于兩個組的變量都可以為這台主機所用,至于變量的優先級關系将于以後讨論.</code>

==============================================================================

Playbook的基礎元件:

    Hosts:運作指定任務的目标主機 //多個冒号分割

    remote_user:在遠端主機上執行任務的使用者

        sudo_user: //指定切換的身份

    tasks:任務清單

        子產品,子產品參數:自上而下運作

        格式:

            action:module arguments

            motuled:arguments //新版本的

        注意:shell和command子產品後面直接跟指令,而非key=value類的參數清單

    1.某任務的狀态在運作後為changed時,可通過notify通知給handlers;

    2.任務可以通過"tags"打标簽,而後在ansible-playbook指令上使用-t指定    

1.第一個playbook

[root@localhost ~]# cat a.yaml //格式嚴格對齊

[root@localhost ~]# cat a.yaml

- hosts: testweb

  remote_user: root

  tasks:

  - name: crete a user3

    user: name=user3 system=true uid=306

-  hosts: testweb2

  - name: crete a user4

    user: name=user4 system=true uid=307

[root@localhost ~]#

//注運作順序:先運作user3,在運作user4 task

//空格,不是tab對齊。

ansible-playbook

    -v verbose

    -s sudo 

    --list-hosts //隻輸出比對到的主機,而不傳回任何指令

    --check //不做修改,僅測試在遠端主機上将會改變什麼,幹跑一遍

ansible-playbook --check a.yaml //格式必須對齊

    //提示OK=3,有一個是遠端主機的facts變量

    ansible-doc -s setup

    ansible 192.168.4.106 -m setup //收集遠端主機的變量資訊

2.tasks示例    

- hosts: websrvs

  - name: install httpd package

    yum: name=httpd state=present

  - name: install configure file

    copy: src=files/httpd.conf dest=/etc/httpd/conf/

  - name: start service httpd

    service: name=httpd state=started

  - name: execute ss command

    shell: ss -tnl |grep 80

ansible all -m yum -a "name=httpd state=absent" //解除安裝目标主機的httpd

ansible websrvs -m shell -a "ss -tnl |grep 80" 

    //ansible 可以與運作多遍,不管目标主機是否已經執行該操作    

3.handler:

    任務,在特定條件下觸發

    接受到其他任務的通知時被觸發

    某任務的狀态為changed時,可通過notify通知相應的handlers

<code>- hosts: websrvs</code>

<code>  </code><code>remote_user: root</code>

<code>  </code><code>tasks:</code>

<code>  </code><code>- name: </code><code>install</code> <code>httpd package</code>

<code>    </code><code>yum: name=httpd state=present</code>

<code>  </code><code>- name: </code><code>install</code> <code>configure </code><code>file</code>

<code>    </code><code>copy: src=files</code><code>/httpd</code><code>.conf dest=</code><code>/etc/httpd/conf/</code>

<code>    </code><code>notify: restart httpd        </code><code>//</code><code>隻有在notify發生改變的時候,重複執行才會觸發handler,</code>

<code>  </code><code>- name: start service httpd</code>

<code>    </code><code>service: name=httpd state=started</code>

<code>  </code><code>handlers:  </code>

<code>  </code><code>- name: restart httpd</code>

<code>    </code><code>service: name=httpd state=restarted</code>

<code>//</code><code>隻有在配置檔案發生改變的時候,handlers才會被觸發    </code>

<code>    </code><code>handlers:--&gt; changed </code><code>//</code><code>發生了改變,實驗隻是修改了httpd.conf檔案</code>

<code>    </code><code>handlers:--&gt;ok </code><code>//</code><code>檔案沒有發生改變</code>

    注:會重複執行這些操作{即使已經操作過了},install ,install和start //重複操作,可以打标簽,指定隻運作哪些操作

        例如:發現目标httpd已經安裝了,不再重新安裝而已

4.tag

    ansible-playboot -t instconf --check a.yaml //-t可以指定多個标簽

<code>[root@localhost ~]</code><code># cat b.yaml </code>

<code>    </code><code>tags: package</code>

<code>    </code><code>tags: package        </code><code>//</code><code>兩個tags可以同名,将會被同時執行上</code>

<code>    </code><code>notify: restart httpd</code>

<code>    </code><code>tags: start</code>

<code>  </code><code>handlers:</code>

ansible-playbook --tag package b.yaml     

5.變量: variables:

變量來源:

來源一.inventory file中定義的變量

來源二.playbook中定義的變量

來源三.include檔案和角色中定義的變量

來源四.系統facts變量,可以通過 ansible hostname -m setup來擷取。當然你也可以通過安裝拓展包來擷取更多的系統變量資訊。例如拓展facter和ohai。

來源五.local facts

    1.facts:由setup子產品提供,可直接調用

        ansible-doc -s setup

        關閉facts:

            - host: all 

              gather_facts: no

        ansible &lt;hostname&gt; -m setup -a "filter=ansible_local"    

        在template和playbook中通路該資料:{{ ansible_local.preferences.general.asdf }} /{{ ansible_eth0.ipv4.address }}

    在ansible中緩存facts使用redis //yum install redis &amp;&amp;start 

        [defaults]

        gathering = smart

        fact_caching = redis

        fact_caching_connection = /path/to/cachedir

        fact_caching_timeout = 86400

        # seconds    

    2.ansible-playbook指令行中的自定義變量

        -e ARGS,--extra-vars=VARS

    3.通過roles傳遞變量

    4.Host Inventory //可以向不同主機傳遞不同的變量

        a.向不同的主機傳遞不同的變量

        b.向組中的主機傳遞相同的變量

            [testvaer] //建立一個新的組,然後添加

            http_port=8080

            192.168.4.100

            192.168.4.112   //這樣這兩個主機使用的變量都一樣了

            注:組可以嵌套    

ansible-playbook -e pkname=memcached --check c.yaml 

<code>[root@localhost ~]</code><code># cat c.yaml </code>

<code>  </code><code>- name: </code><code>install</code> <code>{{ pkname }}</code>

<code>    </code><code>yum: name={{ pkname }} state=present</code>

=========================================

每個主機使用不同的變量,被賦予不同的主機名

ansible-playbook --check c.yaml     

<code>  </code><code>- name: </code><code>install</code> <code>{{ hname }}</code>

<code>    </code><code>hostname</code><code>: name={{ hname }}</code>

[root@localhost ~]# cat /etc/ansible/hosts

# This is the default ansible 'hosts' file.

[websrvs]

192.168.4.110 hname=www1

192.168.4.106 hname=www2

參考:http://www.ansible.com.cn/docs/intro_inventory.html#inventoryformat

注:template和role後再後續介紹

本文轉自MT_IT51CTO部落格,原文連結:http://blog.51cto.com/hmtk520/2058175,如需轉載請自行聯系原作者