ansible核心模塊playbook介紹


ansible的playbook采用yaml語法,它簡單地實現了json格式的事件描述。yaml之於json就像markdown之於html一樣,極度簡化了json的書寫。在學習ansible playbook之前,很有必要把yaml的語法格式、引用方式做個梳理。

1.1 初步說明

以一個簡單的playbook為例,說明yaml的基本語法。

---
    - hosts: 192.168.100.59,192.168.100.65
      remote_user: root
      pre_tasks:
        - name: set epel repo for Centos 7
          yum_repository:
            name: epel7
            description: epel7 on CentOS 7
            baseurl: http://mirrors.aliyun.com/epel/7/$basearch/
            gpgcheck: no
            enabled: True
      tasks:
# install nginx and run it
        - name: install nginx
          yum: name=nginx state=installed update_cache=yes
        - name: start nginx
          service: name=nginx state=started
      post_tasks:
        - shell: echo "deploy nginx over"
          register: ok_var
        - debug: msg="{{ ok_var.stdout }}"

1、yaml文件以---開頭,以表明這是一個yaml文件,就像xml文件在開頭使用<?xml version="1.0" encoding="utf-8"?>宣稱它是xml文件一樣。但即使沒有使用---開頭,也不會有什么影響。

2、yaml中使用"#"作為注釋符,可以注釋整行,也可以注釋行內從"#"開始的內容。

3、yaml中的字符串通常不用加任何引號,即使它包含了某些特殊字符。但有些情況下,必須加引號,最常見的是在引用變量的時候。具體見后文。

4、關於布爾值的書寫格式,即true/false的表達方式。其實playbook中的布爾值類型非常靈活,可分為兩種情況:

5、模塊的參數: 這時布爾值作為字符串被ansible解析。接受yes/on/1/true/no/off/0/false,這時被ansible解析。例如上面示例中的update_cache=yes。

6、非模塊的參數: 這時布爾值被yaml解釋器解析,完全遵循yaml語法。接受不區分大小寫的true/yes/on/y/false/no/off/n。例如上面的gpgcheck=no和enabled=True。

建議遵循ansible的官方規范,模塊的布爾參數采用yes/no,非模塊的布爾參數采用True/False。

1.2 列表

使用"- "(減號加一個或多個空格)作為列表項,也就是json中的數組。yaml的列表在playbook中極重要,必須得搞清楚它的寫法。

例如:

 - zhangsan

 - lisi

 - wangwu

還支持內聯寫法:使用中括號。

[zhangsan,lisi,wangwu]

它們等價於json格式的:

[

    "zhangsan",

    "lisi",

    "wangwu"

]

再例如:

- 班名: 初中1班

  人數: 35

  班主任: 隔壁老張

  今天的任務: 掃操場

 

- 班名: 初中2班

  人數: 38

  班主任: 隔壁老王

  今天的任務: 搬桌子

具體在ansible playbook中,列表所描述的是局部環境,它不一定要有名稱,不一定要從同一個屬性開始,只要使用"- ",它就表示圈定一個范圍,范圍內的項都屬於該列表。例如:

---
    - name: list1              # 列表1,同時給了個名稱
      hosts: localhost         # 指出了hosts是列表1的一個對象
      remote_user: root        # 列表1的屬性
      tasks:                   # 還是列表1的屬性
    - hosts: 192.168.100.65    # 列表2,但是沒有為列表命名,而是直入主題
      remote_user: root
      sudo: yes
      tasks:

唯一要注意的是,每一個playbook中必須包含"hosts"和"tasks"項。更嚴格地說,是每個play的頂級列表必須包含這兩項。就像上面的例子中,就表示該playbook中包含了兩個play,每個play的頂級列表都包含了hosts和tasks。其實絕大多數情況下,一個playbook中都只定義一個play,所以只有一個頂級列表項。頂級列表的各項,其實可以將其看作是ansible-playbook運行時的選項。

另外,playbook中某項是一個動作、一個對象或一個實體時,一般都定義成列表的形式。見下文。

1.3 字典

官方手冊上這么稱呼,其實就是key=value的另一種寫法。使用"冒號+空格"分隔,即key: value。它一般當作列表項的屬性。

例如:

- 班名: 初中1班

  人數:

    總數: 35

    男: 19

    女: 16

  班主任:

    大名: 隔壁老張

    這廝多大: 39

    這廝任教多少年: 15

  今天的任務: 掃操場

 

- 班名: 初中2班

  人數:

    總數: 38

    男: 19

    女: 19

  班主任:

    大名: 隔壁老王

    這廝多大: 30

    喜調戲女老師: True

  今天的任務: 搬桌子

     未完成任務怎么辦:

        - 繼續搬,直到完成

        - 寫檢討

具體到playbook中,一般"虛擬性"的內容都可以通過字典的方式書寫,而實體化的、動作性的、對象性的內容則應該定義為列表形式。

---
    - hosts: localhost              # 列表1
      remote_user: root
      tasks:
        - name: test1               # 子列表,下面是shell模塊,是一個動作,所以定義為列表,只不過加了個name
          shell: echo /tmp/a.txt
          register: hi_var
        - debug: var=hi_var.stdout  # 調用模塊,這是動作,所以也是列表
        - include: /tmp/nginx.yml   # 同樣是動作,包含文件
        - include: /tmp/mysql.yml
        - copy:                     # 調用模塊,定義為列表。但模塊參數是虛擬性內容,應定義為字典而非列表
            src: /etc/resolv.conf   # 模塊參數1
            dest: /tmp              # 模塊參數2 

    - hosts: 192.168.100.65           # 列表2
      remote_user: root
      vars:
        nginx_port: 80                # 定義變量,是虛擬性的內容,應定義為字典而非列表
        mysql_port: 3306
      vars_files:
        - nginx_port.yml              # 無法寫成key/value格式,且是實體文件,因此定義為列表
      tasks:
        - name: test2
          shell: echo /tmp/a.txt
          register: hi_var            # register是和最近一個動作綁定的
        - debug: var=hi_var.stdout

從上面示例的copy模塊可以得出,模塊的參數是虛擬性內容,也能使用字典的方式定義。

字典格式的key/value,也支持內聯格式寫法:使用大括號。

{大名: 隔壁老王,這廝多大: 30,喜調戲女老師: True}

{nginx_port: 80,mysql_port: 3306}

這等價於json格式的:

{

    "大名": "隔壁老王",

    "這廝多大": 30,

    "喜調戲女老師": "True"

}

{

    "nginx_port": 80,

    "mysql_port": 3306

}

再結合其父項,於是轉換成json格式的內容:

"班主任": {

    "大名": "隔壁老王",

    "這廝多大": 30,

    "喜調戲女老師": "True"

}

 

"vars": {

    "nginx_port": 80,

    "mysql_port": 3306

}

再加上列表項(使用中括號),於是:

[

  {

    "hosts": "192.168.100.65",

    "remote_user": "root",

    "vars": {

      "nginx_port": 80,

      "mysql_port": 3306

    },

    "vars_files": [

      "nginx_port.yml"

    ],

    "tasks": [

      {

        "name": "test2",

        "shell": "echo /tmp/a.txt",

        "register": "hi_var"

      },

      {

        "debug": "var=hi_var.stdout"

      }

    ]

  }

]

1.4 分行寫

playbook中有3種方式進行續行。

  • 在"key: "的后面使用大於號。
  • 在"key: "的后面使用豎線。這種方式可以像腳本一樣寫很多行語句。
  • 多層縮進。

例如,下面的3中方法。

---
    - hosts: localhost
      tasks:
        - shell: echo 2 >>/tmp/test.txt
            creates=/tmp/haha.txt          # 比模塊shell縮進更多
        - shell: >                         # 在"key: "后使用大於號
            echo 2 >>/tmp/test.txt
            creates=/tmp/haha.txt
        - shell: |                         # 指定多行命令
            echo 2 >>/tmp/test.txt
            echo 3 >>/tmp/test.txt
          args:
            creates: /tmp/haha.txt

1.5 向模塊傳遞參數

模塊的參數一般來說是key=value格式的,有3種傳遞的方式:

  • 直接寫在模塊后,此時要求使用"key=value"格式。這是讓ansible內部去解析字符串。因為可分行寫,所以有多種寫法。
  • 寫成字典型,即"key: value"。此時要求多層縮進。這是讓yaml去解析字典。
  • 使用內置屬性args,然后多層縮進定義參數列表。這是讓ansible明確指定用yaml來解析。

例如:

---
    - hosts: localhost
      tasks:
        - yum: name=unix2dos state=installed    # key=value直接傳遞
        - yum:
            name: unxi2dos
            state: installed            # "key: value"字典格式傳遞
        - yum:
          args:                               # 使用args傳遞
            name: unix2dos
            state:installed

但要注意,當模塊的參數是free_form時,即格式不定,例如shell和command模塊指定要執行的命令,它無法寫成key/value格式,此時不能使用上面的第二種方式。也就是說,下面第一個模塊是正確的,第二個模塊是錯誤的,因為shell模塊的命令"echo haha"是自由格式的,無法寫成key/value格式。

---
    - hosts: localhost
      tasks:
        - yum:
            name: unxi2dos
            state: installed
        - shell:
            echo haha
            creates: /tmp/haha.txt

所以,調用一個模塊的方式就有了多種形式。例如:

---
    - hosts: localhost
      tasks:
        - shell: echo 1 >/tmp/test.txt creates=/tmp/haha.txt
        - shell: echo 2 >>/tmp/test.txt
            creates=/tmp/haha.txt
        - shell: echo 3 >>/tmp/test.txt
          args:
             creates: /tmp/haha.txt
        - shell: >
            echo 4 >>/tmp/test.txt
            creates=/tmp/haha.txt
        - shell: |
            echo 5.1 >>/tmp/test.txt
            echo 5.2 >>/tmp/test.txt
          args:
            creates: /tmp/haha.txt
        - yum: 
            name: dos2unix
            state: installed

1.6 playbookplay的關系

一個playbook中可以包含多個play。每個play都至少包含有tasks和hosts這兩項,還可以包含其他非必須項,如vars,vars_files,remote_user等。tasks中可以通過模塊調用定義一系列的action。只不過,絕大多數時候,一個playbook都只定義一個play。

所以,大致關系為:

  • playbook: [play1,play2,play3]
  • play: [hosts,tasks,vars,remote_user...]
  • tasks: [module1,module2,...]

也就是說,每個頂級列表都是一個play。例如,下面的playbook中包含了兩個play。

---
    - name: list1
      hosts: localhost
      remote_user: root
      tasks:

    - hosts: 192.168.100.65
      remote_user: root
      sudo: yes
      tasks:

需要注意,有些時候play中使用了role,可能看上去沒有tasks,這是因為role本身就是整合playbook的,所以沒有也沒關系。但沒有使用role的時候,必須得包含hosts和tasks。例如:

---
  - hosts: centos
    remote_user: root
    pre_tasks:
        - name: config the yum repo for centos 7
          yum_repository:
              name: epel
              description: epel
              baseurl: http://mirrors.aliyun.com/epel/7/$basearch/
              gpgcheck: no
          when: ansible_distribution_major_version == "7"

        - name: config the yum repo for centos 6
          yum_repository:
              name: epel
              description: epel
              baseurl: http://mirrors.aliyun.com/epel/6/$basearch/
              gpgcheck: no
          when: ansible_distribution_major_version == "6"

    roles:
        - nginx
    post_tasks:
      - shell: echo 'deploy nginx/mysql over'
        register: ok_var
      - debug: msg='{{ ok_var.stdout }}'

1.7 playbook中什么時候使用引號

playbook中定義的都是些列表和字典。絕大多數時候,都不需要使用引號,但有兩個特殊情況需要考慮使用引號。

  • 出現大括號"{}"。
  • 出現冒號加空格時": "。

大括號要使用引號包圍,是因為不使用引號時會被yaml解析成內聯字典。例如要使用大括號引用變量的時候,以及想輸出大括號符號的時候。

---
    - hosts: localhost
      tasks:
        - shell: echo "{{inventory_hostname}}:haha"

冒號尾隨空格時要使用引號包圍,是因為它會被解析為"key: value"的形式。而且包圍冒號的引號還更嚴格。例如下面的debug模塊中即使使用了引號也是錯誤的。

---
    - hosts: localhost
      tasks:
        - shell: echo "{{inventory_hostname}}:haha"
          register: hello
        - debug: msg="{{hello.stdout}}: heihei"

因為它把{{...}}當成key,heihei當成value了。因此,必須將整個debug模塊的參數都包圍起來,顯式指定這一段是模塊的參數。但這樣會和原來的雙引號沖突,因此使用單引號。

---
    - hosts: localhost
      tasks:
        - shell: echo "{{inventory_hostname}}:haha"
          register: hello
        - debug: 'msg="{{hello.stdout}}: heihei"'

但是,如果將shell模塊中的冒號后也尾隨上空格,即寫成echo "{{inventory_hostname}}: haha",那么shell模塊也會報錯。因此也要使用多個引號,正確的如下:

---
    - hosts: localhost
      tasks:
        - shell: 'echo "{{inventory_hostname}}: haha"'
          register: hello
        - debug: 'msg="{{hello.stdout}}: heihei"'

1.8 Ansible Playbook應用

如上使用Ad-hoc方式點對點命令執行,可以管理遠程主機,如果服務器數量很多,配置信息比較多,還可以利用Ansible Playbook編寫劇本、從而以非常簡便的方式實現任務處理的自動化與流程化。

Playbook由一個或多個"play"組成的列表,play的主要功能Ansible中的Task定義好的角色,指定劇本對應的服務器組。

從根本上說,Task是一個任務,Task調用Ansible各種模塊module,將多個paly組織在一個playbook劇本中,然后組成一個非常完整的流程控制集合。

基於Ansible Playbook還可以收集命令、可以創建任務集,這樣能夠大大降低管理工作的復雜程度,Playbook采用YAML語法結構,易於閱讀、方便配置。

YAML(Yet Another Markup Language),是一種直觀的能夠被電腦識別的數據序列化格式,是一個可讀性高並且容易被人類閱讀,容易和腳本語言交互,用來表達資料序列的編程語言。它參考了其它多種語言,包括:XML、C語言、Python、Perl以及電子郵件格式RFC2822,是類似於標准通用標記語言的子集XML的數據描述語言,語法比XML簡單很多。

YAML使用空白字符和分行來分隔資料,適合用 grep、Python、Perl、Ruby 操作。

(1)     YAML語言特性如下:

  • 可讀性強;
  • 和腳本語言的交互性好;
  • 使用實現語言的數據類型;
  • 一致的信息模型;
  • 易於實現;
  • 可以基於流來處理;
  • 可擴展性強。

(2)     Playbooks組件包括如下:

Target                     定義playbook的遠程主機組;

Variable                       定義playbook使用的變量;

Task                       定義遠程主機上執行的任務列表;

Handler                        定義task執行完成以后需要調用的任務,例如配置文件被改動,則啟動handler任務重啟相關聯的服務。

(3)     Target常用參數如下:

hosts                          定義遠程主機組;

user                       執行該任務的用戶;

sudo                          設置為yes的時候,執行任務的時候使用root權限;

sudo_user                  指定sudo普通用戶;

connection                 默認基於SSH連接客戶端;

gather_facks                   獲取遠程主機facts基礎信息。

(4)     Variable常用參數如下:

vars                       定義格式,變量名:變量值;

vars_files                     指定變量文件;

vars_prompt                用戶交互模式自定義變量;

setup                      模塊去遠程主機的值;

(5)     Task常用參數如下:

name                       任務顯示名稱也即屏幕顯示信息;

action                     定義執行的動作;

copy                       復制本地文件到遠程主機;

template                       復制本地文件到遠程主機,可以引用本地變量;

service                        定義服務的狀態。

Ansible playbook案例演示如下:

(1)     遠程主機安裝Nginx WEB服務,playbook代碼如下,執行結果如圖21-33所示:

- hosts: all

  remote_user: root

  tasks:

  - name: Jfedu Pcre-devel and Zlib LIB Install.

    yum:  name=pcre-devel,pcre,zlib-devel state=installed

  - name: Jfedu  Nginx WEB  Server Install Process.

    shell: cd /tmp;rm -rf nginx-1.12.0.tar.gz;wget http://nginx.org/download/nginx-1.12.0.tar.gz;tar xzf nginx-1.12.0.tar.gz;cd nginx-1.12.0;./configure --prefix=/usr/local/nginx;make;make install

圖21-33 Ansible Playbook遠程Nginx安裝

(2)     檢測遠程主機Nginx目錄是否存在,不存在則安裝Nginx WEB服務,安裝完並啟動Nginx,playbook代碼如下,執行結果如圖21-34所示:

- hosts: all

  remote_user: root

  tasks:

      - name: Nginx server Install 2017

        file: path=/usr/local/nginx/ state=directory

        notify:

            - nginx install

            - nginx start

  handlers:

      - name: nginx install

        shell: cd /tmp;rm -rf nginx-1.12.0.tar.gz;wget http://nginx.org/download/nginx-1.12.0.tar.gz;tar xzf nginx-1.12.0

.tar.gz;cd nginx-1.12.0;./configure --prefix=/usr/local/nginx;make;make install

      - name: nginx start

        shell: /usr/local/nginx/sbin/nginx

圖21-34 Ansible Playbook Nginx觸發安裝

(3)     檢測遠程主機內核參數配置文件是否更新,如果更新則執行命令sysctl –p使內核參數生效,playbook代碼如下,執行結果如圖21-35所示:

- hosts: all

  remote_user: root

  tasks:

      - name: Linux kernel config 2017

        copy: src=/data/sh/sysctl.conf dest=/etc/

        notify:

            - source sysctl

  handlers:

      - name: source sysctl

        shell: sysctl -p

圖21-35 Ansible Playbook 內核參數優化

(4)     基於列表items多個值創建用戶,通過{{}}定義列表變量,with_items選項傳入變量的值,執行結果如圖21-36(a)、21-36(b)所示:

- hosts: all

  remote_user: root

  tasks:

  - name: Linux system Add User list.

    user: name={{ item }} state=present

    with_items:

       - jfedu1

       - jfedu2

       - jfedu3

       - jfedu4

 

圖21-36(a) Ansible Playbook item變量創建用戶

 

圖21-36(b) Ansible Playbook item變量創建用戶

(5)     Ansible Playbook可以自定義template模板文件,模板文件主要用於服務器需求不一致的情況,需要獨立定義的,例如兩台服務器安裝了Nginx,安裝完畢之后將服務器A的HTTP端口改成80,服務器B的HTTP端口改成81,基於tempalte模塊輕松實現,方法步驟如下:

  1. Ansible hosts文件指定不同服務器不同httpd_port端口,代碼如下:

[web]

192.168.149.128 httpd_port=80

192.168.149.129 httpd_port=81

  1. Ansible 創建nginx.conf jinja2模板文件,cp nginx.conf nginx.conf.j2,並修改listen 80為listen {{httpd_port}},Nginx其他配置項不變,代碼如下:

cp nginx.conf nginx.conf.j2

listen  {{httpd_port}};

  1. Ansible playbook劇本yaml文件創建,代碼如下:

- hosts: all

  remote_user: root

  tasks:

      - name: Nginx server Install 2017

        file: path=/usr/local/nginx/ state=directory

        notify:

            - nginx install

            - nginx config

  handlers:

      - name: nginx install

        shell: cd /tmp;rm -rf nginx-1.12.0.tar.gz;wget http://nginx.org/download/nginx-1.12.0.tar.gz;tar xzf nginx-1.12.0

.tar.gz;cd nginx-1.12.0;./configure --prefix=/usr/local/nginx;make;make install

      - name: nginx config

        template: src=/data/sh/nginx.conf.j2 dest=/usr/local/nginx/conf/nginx.conf

  1. Ansible playbook執行劇本文件,如圖21-37(a)、21-37(b)、21-37(c)所示:

 

圖21-37(a) Ansible Playbook 執行模板yaml

 

圖21-37(b) 149.128服務器Nginx HTTP Port 80

 

圖21-37(c) 149.129服務器Nginx HTTP Port 81

1.9 Ansible配置文件詳解

Ansible默認配置文件為/etc/ansible/ansible.cfg,配置文件中可以對ansible進行各項參數的調整,包括並發線程、用戶、模塊路徑、配置優化等,如下為Ansible.cfg常用參數詳解:

[defaults]                                 通用默認配置段;

inventory      = /etc/ansible/hosts            被控端IP或者DNS列表;

library        = /usr/share/my_modules/        Ansible默認搜尋模塊的位置;

remote_tmp     = $HOME/.ansible/tmp       Ansible遠程執行臨時文件;

pattern        = *                     對所有主機通信;

forks          = 5                     並行進程數;

poll_interval  = 15                        回頻率或輪訓間隔時間;

sudo_user      = root                      sudo遠程執行用戶名;

ask_sudo_pass = True                   使用sudo,是否需要輸入密碼;

ask_pass      = True                       是否需要輸入密碼;

transport      = smart                     通信機制;

remote_port    = 22                    遠程SSH端口;

module_lang    = C                     模塊和系統之間通信的語言;

gathering = implicit                       控制默認facts收集(遠程系統變量);

roles_path= /etc/ansible/roles             用於playbook搜索Ansible roles;

host_key_checking = False                  檢查遠程主機密鑰;

#sudo_exe = sudo                           sudo遠程執行命令;

#sudo_flags = -H                           傳遞sudo之外的參數;

timeout = 10                               SSH超時時間;

remote_user = root                         遠程登陸用戶名;

log_path = /var/log/ansible.log                日志文件存放路徑;

module_name = command                  Ansible命令執行默認的模塊;

#executable = /bin/sh                      執行的Shell環境,用戶Shell模塊;

#hash_behaviour = replace                  特定的優先級覆蓋變量;

#jinja2_extensions                        允許開啟Jinja2拓展模塊;

#private_key_file = /path/to/file              私鑰文件存儲位置;

#display_skipped_hosts = True              顯示任何跳過任務的狀態;

#system_warnings = True                禁用系統運行ansible潛在問題警告;

#deprecation_warnings = True               Playbook輸出禁用“不建議使用”警告;

#command_warnings = False                  command模塊Ansible默認發出警告;

#nocolor = 1                           輸出帶上顏色區別,開啟/關閉:0/1;

pipelining = False                         開啟pipe SSH通道優化;

[accelerate]                               accelerate緩存加速。

accelerate_port = 5099

accelerate_timeout = 30

accelerate_connect_timeout = 5.0

accelerate_daemon_timeout = 30

accelerate_multi_key = yes

1.10 Ansible性能調優

Ansible企業實戰環境中,如果管理的服務器越來越多,Ansibe執行效率會變得比較慢,可以通過優化Ansible提供工作效率,由於Ansible基於SSH協議通信,SSH連接慢會導致整個基於Ansible執行變得緩慢,也需要對Openssh進行優化,具體優化的方法如下:

(1)     Ansible SSH 關閉秘鑰檢測

默認以SSH登錄遠程客戶端服務器,會檢查遠程主機的公鑰(public key),並將該主機的公鑰記錄在~/.ssh/known_hosts文件中。下次訪問相同主機時,OpenSSH會核對公鑰,如果公鑰不同,OpenSSH會發出警告,如果公鑰相同,則提示輸入密碼。

SSH對主機的public_key的檢查等級是根據StrictHostKeyChecking變量來設定的,StrictHostKeyChecking檢查級別包括:no(不檢查)、ask(詢問)、yes(每次都檢查)、False(關閉檢查)。

Ansible配置文件中加入如下代碼,即可關閉StrictHostKeyChecking檢查:

host_key_checking = False

(2)     OpenSSH連接優化

使用OpenSSH服務時,默認服務器端配置文件UseDNS=YES狀態,該選項會導致服務器根據客戶端的IP地址進行DNS PTR反向解析,得到客戶端的主機名,然后根據獲取到的主機名進行DNS正向A記錄查詢,並驗證該IP是否與原始IP一致。關閉DNS解析代碼如下:

sed  -i  '/^GSSAPI/s/yes/no/g;/UseDNS/d;/Protocol/aUseDNS no' /etc/ssh/sshd_config

/etc/init.d/sshd restart

(3)     SSH pipelining加速Ansible

SSH pipelining是一個加速 Ansible 執行速度的簡單方法,SSH pipelining 默認是關閉的,關閉是為了兼容不同的 sudo 配置,主要是requiretty 選項。

如果不使用Sudo建議開啟該選項,打開此選項可以減少Ansible 執行沒有文件傳輸時,SSH在被控機器上執行任務的連接數。使用Sudo操作的時候, 必須在所有被管理的主機上將配置文件/etc/sudoers中requiretty選項禁用。

sed    -i    '/^pipelining/s/False/True/g'    /etc/ansible/ansible.cfg

(4)     Ansible Facts緩存優化

Ansible-playbook 在執行過程中,默認會執行Gather facts,如果不需要獲取客戶端的fact數據的話,可以關閉獲取fact數據功能,關閉之后可以加快ansible-playbook的執行效率。如需關閉fact功能,在playbook yaml文件中加入如下代碼即可:

gather_facts: nogather_facts: no

Ansible facts組件主要用於收集客戶端設備的基礎靜態信息,這些信息可以在做配置管理的時候方便引用。Facts信息直接當做Ansible Playbook變量信息進行引用,通過定制facts以便收集我們想要的信息,同時可以通過Facter和Ohai來拓展facts信息,也可以將facts信息存入Redis緩存中,如下為Facts使用Redis緩存的步驟。

  1. 部署Redis服務

wget    http://download.redis.io/releases/redis-2.8.13.tar.gz

tar         zxf            redis-2.8.13.tar.gz

cd      redis-2.8.13

make    PREFIX=/usr/local/redis  install

cp     redis.conf     /usr/local/redis/

將/usr/local/redis/bin/目錄加入至環境變量配置文件/etc/profile末尾,然后Shell終端執行source /etc/profile讓環境變量生效。

export PATH=/usr/local/redis/bin:$PATH

啟動及停止Redis服務命令:

nohup /usr/local/redis/bin/redis-server  /usr/local/redis/redis.conf  &

  1. 安裝Python Redis模塊

easy_install pip

pip install redis

  1. Ansible整合Redis配置

在配置文件/etc/ansible/ansible.cfg中defaluts段中加入代碼,如果redis密碼為admin,則開啟admin密碼行:

gathering = smart

fact_caching = redis

fact_caching_timeout = 86400

fact_caching_connection = localhost:6379

#fact_caching_connection = localhost:6379:0:admin

  1. 測試Redis緩存

Ansible-playbook執行nginx_wget.yaml劇本文件,如圖21-38所示:

ansible-playbook    nginx_wget.yaml

 

圖21-38 ansible playbook執行yaml

檢查Redis服務器,facts key已存入Redis中,如圖21-39所示:

 

圖21-39 Redis緩存服務器緩存facts主機信息

(5)     ControlPersist SSH優化

ControlPersist 特性需要高版本的SSH支持,CentOS6默認是不支持的,如果需要使用,需要自行升級Openssh。

ControlPersist 即持久化的Socket,一次驗證多次通信。並且只需要修改SSH客戶端配置,也即Ansible被管理主機。

可使用YUM或者源碼編譯升級OpenSSH服務,升級完畢ControlPersist的設置辦法如下,在其用戶的家目錄創建config文件,如果ansible以root用戶登錄客戶端,至需要在客戶端的/root/.ssh/config目錄中添加如下代碼即可:

Host *

  Compression yes

  ServerAliveInterval 60

  ServerAliveCountMax 5

  ControlMaster auto

  ControlPath ~/.ssh/sockets/%r@%h-%p

  ControlPersist 4h

開啟ControlPersist 特性后,SSH 在建立sockets后,節省了每次驗證和創建的時間,對Ansible執行速度提升是非常明顯的。

 

1.11核心組件

  • tasks:任務
  • variables:變量
  • templates:模板
  • handlers:處理器
  • roles:角色 

1.12 playbook實例


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM