Ansible - Hướng dẫn nhanh

Ansible là công cụ CNTT mã nguồn mở đơn giản, tự động hóa việc triển khai ứng dụng, điều phối dịch vụ nội bộ, cung cấp đám mây và nhiều công cụ CNTT khác.

Ansible rất dễ triển khai vì nó không sử dụng bất kỳ tác nhân hoặc cơ sở hạ tầng bảo mật tùy chỉnh nào.

Ansible sử dụng playbook để mô tả các công việc tự động hóa và playbook sử dụng ngôn ngữ rất đơn giản, tức là YAML(Đó là ngôn ngữ tuần tự hóa dữ liệu có thể đọc được và thường được sử dụng cho các tệp cấu hình, nhưng có thể được sử dụng trong nhiều ứng dụng nơi dữ liệu đang được lưu trữ), rất dễ hiểu, đọc và viết. Do đó, lợi thế là ngay cả những người hỗ trợ cơ sở hạ tầng CNTT cũng có thể đọc và hiểu playbook và gỡ lỗi nếu cần (YAML - Nó ở dạng con người có thể đọc được).

Ansible được thiết kế để triển khai nhiều tầng. Ansible không quản lý một hệ thống tại một thời điểm, nó mô hình hóa cơ sở hạ tầng CNTT bằng cách mô tả tất cả các hệ thống của bạn có liên quan với nhau. Ansible hoàn toàn không có tác nhân, có nghĩa là Ansible hoạt động bằng cách kết nối các nút của bạn thông qua ssh (theo mặc định). Nhưng nếu bạn muốn phương pháp kết nối khác như Kerberos, Ansible cung cấp tùy chọn đó cho bạn.

Sau khi kết nối với các nút của bạn, Ansible đẩy các chương trình nhỏ được gọi là “Mô-đun Ansible”. Ansible chạy các mô-đun đó trên các nút của bạn và xóa chúng khi hoàn tất. Ansible quản lý khoảng không quảng cáo của bạn trong các tệp văn bản đơn giản (Đây là tệp máy chủ). Ansible sử dụng tệp máy chủ lưu trữ nơi người ta có thể nhóm các máy chủ và có thể kiểm soát các hành động trên một nhóm cụ thể trong sách phát.

Tệp máy chủ lưu trữ mẫu

Đây là nội dung của tệp hosts -

#File name: hosts
#Description: Inventory file for your application. Defines machine type abc
node to deploy specific artifacts
# Defines machine type def node to upload
metadata.

[abc-node]
#server1 ansible_host = <target machine for DU deployment> ansible_user = <Ansible
user> ansible_connection = ssh
server1 ansible_host = <your host name> ansible_user = <your unix user>
ansible_connection = ssh

[def-node]
#server2 ansible_host = <target machine for artifact upload>
ansible_user = <Ansible user> ansible_connection = ssh
server2 ansible_host = <host> ansible_user = <user> ansible_connection = ssh

Quản lý cấu hình là gì

Quản lý cấu hình về mặt Ansible có nghĩa là nó duy trì cấu hình hoạt động của sản phẩm bằng cách lưu giữ hồ sơ và cập nhật thông tin chi tiết mô tả phần cứng và phần mềm của doanh nghiệp.

Thông tin đó thường bao gồm các phiên bản và bản cập nhật chính xác đã được áp dụng cho các gói phần mềm đã cài đặt cũng như vị trí và địa chỉ mạng của các thiết bị phần cứng. Ví dụ: Nếu bạn muốn cài đặt phiên bản mới củaWebLogic/WebSphere máy chủ trên tất cả các máy có trong doanh nghiệp của bạn, bạn không thể thực hiện và cập nhật từng máy theo cách thủ công.

Bạn có thể cài đặt WebLogic / WebSphere một lần trên tất cả các máy của mình với sách phát Ansible và kho lưu trữ được viết theo cách đơn giản nhất. Tất cả những gì bạn phải làm là liệt kê ra địa chỉ IP của các nút của bạn trong kho và viết một playbook để cài đặt WebLogic / WebSphere. Chạy playbook từ máy điều khiển của bạn và nó sẽ được cài đặt trên tất cả các nút của bạn.

Làm thế nào Ansible hoạt động?

Hình dưới đây cho thấy hoạt động của Ansible.

Ansible works bằng cách kết nối với các nút của bạn và đẩy ra các chương trình nhỏ, được gọi là "Ansible mô-đun "cho họ. Ansiblesau đó thực thi các mô-đun này (theo mặc định trên SSH) và xóa chúng khi hoàn tất. Thư viện mô-đun của bạn có thể nằm trên bất kỳ máy nào và không yêu cầu máy chủ, daemon hoặc cơ sở dữ liệu.

Nút quản lý trong hình trên là nút điều khiển (quản lý nút) điều khiển toàn bộ việc thực thi playbook. Đó là nút mà từ đó bạn đang chạy cài đặt. Tệp kiểm kê cung cấp danh sách các máy chủ cần chạy các mô-đun Ansible và nút quản lý thực hiện kết nối SSH và thực thi các mô-đun nhỏ trên máy chủ và cài đặt sản phẩm / phần mềm.

Beauty của Ansible là nó loại bỏ các mô-đun sau khi chúng được cài đặt hiệu quả, nó kết nối với máy chủ, thực hiện các hướng dẫn và nếu nó được cài đặt thành công sẽ xóa mã đã được sao chép trên máy chủ đã được thực thi.

Trong chương này, chúng ta sẽ tìm hiểu về thiết lập môi trường của Ansible.

Quá trình cài đặt

Về cơ bản, có hai loại máy khi chúng ta nói về việc triển khai -

  • Control machine - Máy từ đó chúng ta có thể quản lý các máy khác.

  • Remote machine - Máy được xử lý / điều khiển bằng máy điều khiển.

Có thể có nhiều máy điều khiển từ xa được điều khiển bởi một máy điều khiển. Vì vậy, để quản lý máy từ xa, chúng ta phải cài đặt Ansible trên máy điều khiển.

Yêu cầu máy điều khiển

Ansible có thể được chạy từ bất kỳ máy nào có cài đặt Python 2 (phiên bản 2.6 hoặc 2.7) hoặc Python 3 (phiên bản 3.5 trở lên).

Note - Windows không hỗ trợ máy điều khiển.

Theo mặc định, Ansible sử dụng ssh để quản lý máy từ xa.

Ansible không thêm bất kỳ cơ sở dữ liệu nào. Nó không yêu cầu bất kỳ daemon nào để khởi động hoặc giữ cho nó chạy. Trong khi quản lý máy từ xa, Ansibledoes notđể lại bất kỳ phần mềm nào được cài đặt hoặc chạy trên chúng. Do đó, không có câu hỏi làm thế nào để nâng cấp nó khi chuyển sang phiên bản mới.

Ansible có thể được cài đặt trên máy điều khiển có các yêu cầu nêu trên theo nhiều cách khác nhau. Bạn có thể cài đặt bản phát hành mới nhất thông qua Apt, yum, pkg, pip, OpenCSW, pacman, v.v.

Cài đặt thông qua Apt trên Máy Ubuntu

Để cài đặt Ansible, bạn phải cấu hình PPA trên máy của mình. Đối với điều này, bạn phải chạy dòng mã sau:

$ sudo apt-get update $ sudo apt-get install software-properties-common 
$ sudo apt-add-repository ppa:ansible/ansible $ sudo apt-get update 
$ sudo apt-get install ansible

Sau khi chạy dòng mã trên, bạn đã sẵn sàng quản lý máy từ xa thông qua Ansible. Chỉ cần chạy Ansible – version để kiểm tra phiên bản và chỉ để kiểm tra xem Ansible đã được cài đặt đúng cách hay chưa.

Ansible sử dụng cú pháp YAML để thể hiện sách vở Ansible. Chương này cung cấp tổng quan về YAML. Ansible sử dụng YAML vì con người rất dễ hiểu, đọc và viết khi so sánh với các định dạng dữ liệu khác như XML và JSON.

Mỗi YAML tùy chọn tệp bắt đầu bằng “---” và kết thúc bằng “...”.

Hiểu về YAML

Trong phần này, chúng ta sẽ tìm hiểu các cách khác nhau mà dữ liệu YAML được biểu diễn.

cặp khóa-giá trị

YAML sử dụng cặp khóa-giá trị đơn giản để đại diện cho dữ liệu. Từ điển được biểu diễn trong cặp key: value.

Note - Nên có khoảng trắng giữa: và giá trị.

Ví dụ: Hồ sơ học sinh

--- #Optional YAML start syntax 
james: 
   name: james john 
   rollNo: 34 
   div: B 
   sex: male 
… #Optional YAML end syntax

Viết tắt

Bạn cũng có thể sử dụng chữ viết tắt để thể hiện từ điển.

Thí dụ

James: {name: james john, rollNo: 34, div: B, sex: male}

Danh sách đại diện

Chúng tôi cũng có thể đại diện cho Danh sách trong YAML. Mọi phần tử (thành viên) của danh sách phải được viết trong một dòng mới với cùng một thụt đầu dòng bắt đầu bằng “-“ (- và dấu cách).

Thí dụ

---
countries:  
   - America 
   - China 
   - Canada 
   - Iceland 
…

Viết tắt

Bạn cũng có thể sử dụng chữ viết tắt để đại diện cho danh sách.

Thí dụ

Countries: [‘America’, ‘China’, ‘Canada’, ‘Iceland’]

Liệt kê bên trong Từ điển

Chúng ta có thể sử dụng danh sách bên trong từ điển, tức là giá trị của khóa là danh sách.

Thí dụ

---  
james: 
   name: james john 
   rollNo: 34 
   div: B 
   sex: male 
   likes: 
      - maths 
      - physics 
      - english 
…

Danh sách từ điển

Chúng tôi cũng có thể tạo danh sách các từ điển.

Thí dụ

---  
- james: 
   name: james john 
   rollNo: 34 
      div: B 
   sex: male 
   likes: 
      - maths 
      - physics 
      - english 

- robert: 
      name: robert richardson 
      rollNo: 53 
      div: B 
      sex: male 
   likes: 
      - biology 
      - chemistry 
…

YAML sử dụng “|” để bao gồm các dòng mới trong khi hiển thị nhiều dòng và “>” để loại bỏ các dòng mới trong khi hiển thị nhiều dòng. Do đó, chúng tôi có thể đọc và chỉnh sửa các dòng lớn. Trong cả hai trường hợp, ý định sẽ bị bỏ qua.

Chúng tôi cũng có thể đại diện Boolean(Đúng / sai) giá trị trong YAML. Ở đâuboolean giá trị có thể không phân biệt chữ hoa chữ thường.

Thí dụ

---  
- james: 
   name: james john 
   rollNo: 34 
   div: B 
   sex: male 
   likes: 
      - maths 
      - physics 
      - english 
   
   result: 
      maths: 87 
      chemistry: 45 
      biology: 56 
      physics: 70 
      english: 80 
   
   passed: TRUE 
   
   messageIncludeNewLines: | 
      Congratulation!! 
      You passed with 79% 
   
   messageExcludeNewLines: > 
      Congratulation!! 
      You passed with 79%

Một số từ thông dụng liên quan đến Ansible.

Service/Server - Một quy trình trên máy cung cấp dịch vụ.

Machine - Một máy chủ vật lý, vm (máy ảo) hoặc một vùng chứa.

Target machine - Một máy chúng tôi sắp cấu hình với Ansible.

Task - Một hành động (chạy cái này, xóa cái kia) vv do Ansible quản lý.

Playbook - Tệp yml nơi các lệnh Ansible được viết và yml được thực thi trên máy.

Các lệnh đặc biệt là các lệnh có thể được chạy riêng lẻ để thực hiện các chức năng nhanh chóng. Các lệnh này không cần thực hiện sau đó.

Ví dụ: bạn phải khởi động lại tất cả các máy chủ của công ty mình. Đối với điều này, bạn sẽ chạy các lệnh Adhoc từ '/usr/bin/ansible'.

Các lệnh đặc biệt này không được sử dụng để quản lý và triển khai cấu hình, vì các lệnh này chỉ sử dụng một lần.

ansible-playbook được sử dụng để quản lý và triển khai cấu hình.

Lệnh song song và lệnh Shell

Khởi động lại máy chủ công ty của bạn trong 12 nhánh song song cùng một lúc. Đối với điều này, chúng tôi cần thiết lập SSHagent để kết nối.

$ ssh-agent bash 
$ ssh-add ~/.ssh/id_rsa

Để chạy khởi động lại cho tất cả các máy chủ công ty của bạn trong một nhóm, 'abc', trong 12 nhánh song song -

$ Ansible abc -a "/sbin/reboot" -f 12

Theo mặc định, Ansible sẽ chạy các lệnh Ad-hoc ở trên tạo thành tài khoản người dùng hiện tại. Nếu bạn muốn thay đổi hành vi này, bạn sẽ phải chuyển tên người dùng trong các lệnh Ad-hoc như sau:

$ Ansible abc -a "/sbin/reboot" -f 12 -u username

Chuyển tập tin

Bạn có thể sử dụng các lệnh Ad-hoc để thực hiện SCP (Secure Copy Protocol) nhiều tệp song song trên nhiều máy.

Truyền tệp đến nhiều máy chủ / máy

$ Ansible abc -m copy -a "src = /etc/yum.conf dest = /tmp/yum.conf"

Tạo thư mục mới

$ Ansible abc -m file -a "dest = /path/user1/new mode = 777 owner = user1 group = user1 state = directory"

Xóa toàn bộ thư mục và tệp

$ Ansible abc -m file -a "dest = /path/user1/new state = absent"

Quản lý các gói

Các lệnh Ad-hoc có sẵn cho yum và apt. Sau đây là một số lệnh Ad-hoc sử dụng yum.

Lệnh sau kiểm tra xem gói yum đã được cài đặt hay chưa, nhưng không cập nhật nó.

$ Ansible abc -m yum -a "name = demo-tomcat-1 state = present"

Lệnh sau kiểm tra gói chưa được cài đặt.

$ Ansible abc -m yum -a "name = demo-tomcat-1 state = absent"

Lệnh sau kiểm tra phiên bản mới nhất của gói được cài đặt.

$ Ansible abc -m yum -a "name = demo-tomcat-1 state = latest"

Thu thập dữ kiện

Facts có thể được sử dụng để triển khai các câu lệnh điều kiện trong playbook. Bạn có thể tìm thấy thông tin adhoc về tất cả các dữ kiện của mình thông qua lệnh Ad-hoc sau:

$ Ansible all -m setup

Trong chương này, chúng ta sẽ tìm hiểu về Playbooks trong Ansible.

Playbook là các tệp trong đó mã Ansible được viết. Playbook được viết ở định dạng YAML. YAML là viết tắt của Yet Another Markup Language.Playbookslà một trong những tính năng cốt lõi của Ansible và cho Ansible biết những gì cần thực thi. Chúng giống như một danh sách việc cần làm của Ansible chứa một danh sách các nhiệm vụ.

Playbook chứa các bước mà người dùng muốn thực hiện trên một máy cụ thể. Playbook được chạy tuần tự. Playbook là nền tảng cho tất cả các trường hợp sử dụng của Ansible.

Cấu trúc Playbook

Mỗi vở là tập hợp của một hoặc nhiều vở trong đó. Playbook được cấu trúc bằng cách sử dụng Lượt chơi. Có thể có nhiều hơn một vở kịch trong một vở kịch.

Chức năng của một vở kịch là ánh xạ một tập hợp các hướng dẫn được xác định dựa trên một máy chủ cụ thể.

YAML là một ngôn ngữ được đánh máy nghiêm ngặt; vì vậy, cần phải cẩn thận hơn trong khi viết các tệp YAML. Có các trình soạn thảo YAML khác nhau nhưng chúng tôi sẽ thích sử dụng trình soạn thảo đơn giản như notepad ++. Chỉ cần mở notepad ++ và sao chép và dán yaml bên dưới và thay đổi ngôn ngữ thành YAML (Language → YAML).

Một YAML bắt đầu bằng --- (3 dấu gạch ngang)

Tạo Playbook

Hãy để chúng tôi bắt đầu bằng cách viết một tệp YAML mẫu. Chúng ta sẽ đi qua từng phần được viết trong một tệp yaml.

--- 
   name: install and configure DB
   hosts: testServer
   become: yes

   vars: 
      oracle_db_port_value : 1521
   
   tasks:
   -name: Install the Oracle DB
      yum: <code to install the DB>
    
   -name: Ensure the installed service is enabled and running
   service:
      name: <your service name>

Trên đây là Playbook mẫu mà chúng tôi đang cố gắng trình bày cú pháp cơ bản của một playbook. Lưu nội dung trên vào một tệp dưới dạngtest.yml. Cú pháp YAML cần tuân theo thụt lề chính xác và người ta cần phải cẩn thận một chút khi viết cú pháp.

Các thẻ YAML khác nhau

Bây giờ chúng ta hãy xem xét các thẻ YAML khác nhau. Các thẻ khác nhau được mô tả bên dưới -

Tên

Thẻ này chỉ định tên của sách vở Ansible. Như trong vở kịch này sẽ làm gì. Bất kỳ tên hợp lý nào cũng có thể được đặt cho playbook.

máy chủ

Thẻ này chỉ định danh sách máy chủ hoặc nhóm máy chủ mà chúng tôi muốn chạy tác vụ. Trường / thẻ máy chủ là bắt buộc. Nó cho Ansible biết máy chủ nào để chạy các tác vụ được liệt kê. Các tác vụ có thể được chạy trên cùng một máy hoặc trên một máy từ xa. Người ta có thể chạy các tác vụ trên nhiều máy và do đó thẻ máy chủ cũng có thể có một nhóm mục nhập máy chủ.

vars

Thẻ Vars cho phép bạn xác định các biến mà bạn có thể sử dụng trong sổ chơi của mình. Cách sử dụng tương tự như các biến trong bất kỳ ngôn ngữ lập trình nào.

nhiệm vụ

Tất cả các playbook phải chứa các nhiệm vụ hoặc danh sách các nhiệm vụ sẽ được thực hiện. Nhiệm vụ là danh sách các hành động mà một người cần thực hiện. Trường nhiệm vụ chứa tên của nhiệm vụ. Điều này hoạt động như văn bản trợ giúp cho người dùng. Nó không bắt buộc nhưng tỏ ra hữu ích trong việc gỡ lỗi playbook. Mỗi nhiệm vụ liên kết nội bộ với một đoạn mã được gọi là mô-đun. Một mô-đun sẽ được thực thi và các đối số được yêu cầu cho mô-đun bạn muốn thực thi.

Vai trò cung cấp một khuôn khổ cho các bộ sưu tập các biến, nhiệm vụ, tệp, mẫu và mô-đun hoàn toàn độc lập hoặc phụ thuộc lẫn nhau.

Trong Ansible, vai trò là cơ chế chính để chia một sách vở thành nhiều tệp. Điều này đơn giản hóa việc viếtcomplex playbooksvà giúp chúng dễ dàng sử dụng lại hơn. Việc phá vỡ playbook cho phép bạn chia playbook một cách hợp lý thành các thành phần có thể tái sử dụng.

Mỗi vai trò về cơ bản được giới hạn ở một chức năng cụ thể hoặc đầu ra mong muốn, với tất cả các bước cần thiết để cung cấp kết quả đó hoặc trong chính vai trò đó hoặc trong các vai trò khác được liệt kê là phụ thuộc.

Vai trò không phải là sách vở. Vai trò là chức năng nhỏ có thể được sử dụng độc lập nhưng phải được sử dụng trong sách phát. Không có cách nào để thực hiện trực tiếp một vai trò. Vai trò không có cài đặt rõ ràng mà vai trò máy chủ sẽ áp dụng.

Sách phát cấp cao nhất là cầu nối giữ các máy chủ từ tệp khoảng không quảng cáo của bạn đến các vai trò sẽ được áp dụng cho các máy chủ đó.

Tạo một vai trò mới

Cấu trúc thư mục cho các vai trò là điều cần thiết để tạo một vai trò mới.

Cơ cấu vai trò

Các vai trò có một bố cục có cấu trúc trên hệ thống tệp. Cấu trúc mặc định có thể được thay đổi nhưng bây giờ chúng ta hãy giữ nguyên cấu trúc mặc định.

Mỗi vai trò là một cây thư mục trong chính nó. Tên vai trò là tên thư mục trong thư mục / vai trò.

$ ansible-galaxy -h

Sử dụng

ansible-galaxy [delete|import|info|init|install|list|login|remove|search|setup] [--help] [options] ...

Tùy chọn

  • -h, --help - Hiển thị thông báo trợ giúp này và thoát.

  • -v, --verbose - Chế độ chi tiết (-vvv để biết thêm, -vvvv để bật gỡ lỗi kết nối)

  • --version - Hiển thị số phiên bản của chương trình và thoát.

Tạo thư mục vai trò

Lệnh trên đã tạo các thư mục vai trò.

$ ansible-galaxy init vivekrole 
ERROR! The API server (https://galaxy.ansible.com/api/) is not responding, please try again later. 

$ ansible-galaxy init --force --offline vivekrole - vivekrole was created successfully $ tree vivekrole/ 
vivekrole/ 
├── defaults 
│   └── main.yml 
├── files ├── handlers 
│   └── main.yml 
├── meta 
│   └── main.yml 
├── README.md ├── tasks 
│   └── main.yml 
├── templates ├── tests │   ├── inventory 
│   └── test.yml 
└── vars 
    └── main.yml 
 
8 directories, 8 files

Không phải tất cả các thư mục sẽ được sử dụng trong ví dụ và chúng tôi sẽ chỉ ra việc sử dụng một số thư mục trong ví dụ này.

Sử dụng vai trò trong Playbook

Đây là mã của playbook chúng tôi đã viết cho mục đích demo. Mã này là của playbook vivek_orchestrate.yml. Chúng tôi đã xác định các máy chủ:tomcat-node và gọi hai vai trò - install-tomcatstart-tomcat.

Vấn đề là chúng ta có một cuộc chiến mà chúng ta cần triển khai trên một máy tính thông qua Ansible.

--- 
- hosts: tomcat-node 
roles: 
   - {role: install-tomcat} 
   - {role: start-tomcat}

Nội dung của cấu trúc thư mục của chúng tôi từ nơi chúng tôi đang chạy playbook.

$ ls 
ansible.cfg  hosts  roles  vivek_orchestrate.retry vivek_orchestrate.yml

Có một thư mục nhiệm vụ dưới mỗi thư mục và nó chứa một main.yml. Nội dung main.yml của install-tomcat là:

--- 
#Install vivek artifacts 
-  
   block: 
      - name: Install Tomcat artifacts
         action: > 
            yum name = "demo-tomcat-1" state = present 
         register: Output 
          
   always: 
      - debug: 
         msg: 
            - "Install Tomcat artifacts task ended with message: {{Output}}" 
            - "Installed Tomcat artifacts - {{Output.changed}}"

Nội dung của main.yml của start tomcat là:

#Start Tomcat          
-  
   block: 
      - name: Start Tomcat 
      command: <path of tomcat>/bin/startup.sh" 
      register: output 
      become: true 
   
   always: 
      - debug: 
         msg: 
            - "Start Tomcat task ended with message: {{output}}" 
            - "Tomcat started - {{output.changed}}"

Ưu điểm của việc chia playbook thành các vai trò là bất kỳ ai muốn sử dụng tính năng Cài đặt tomcat đều có thể gọi vai trò Cài đặt Tomcat.

Phá vỡ Playbook thành một vai trò

Nếu không dành cho các vai trò, nội dung của main.yml của vai trò tương ứng có thể được sao chép trong playbook ymltập tin. Nhưng để có tính mô-đun, các vai trò đã được tạo ra.

Bất kỳ thực thể logic nào có thể được sử dụng lại như một chức năng có thể tái sử dụng, thực thể đó có thể được chuyển sang vai trò. Ví dụ cho điều này được hiển thị ở trên

Chạy lệnh để chạy playbook.

-vvv option for verbose output – verbose output 
$ cd vivek-playbook/

Đây là lệnh để chạy playbook

$ sudo ansible-playbook -i hosts vivek_orchestrate.yml –vvv 
-----------------------------------------------------------------
-----------------------------------------------------------------------

Đầu ra

Đầu ra được tạo như được nhìn thấy trên màn hình -

Sử dụng /users/demo/vivek-playbook/ansible.cfg dưới dạng tệp cấu hình.

PLAYBOOK: vivek_orchestrate.yml *********************************************************
*********************************************************** 
1 plays in vivek_orchestrate.yml 

PLAY [tomcat-node] **********************************************************************
******** ************************************************* 
 
TASK [Gathering Facts] *************************************************
****************************** ********************************************* 
Tuesday 21 November 2017  13:02:05 +0530 (0:00:00.056) 0:00:00.056 ****** 
Using module file /usr/lib/python2.7/sitepackages/ansible/modules/system/setup.py 
<localhost> ESTABLISH LOCAL CONNECTION FOR USER: root 
<localhost> EXEC /bin/sh -c 'echo ~ && sleep 0' 
<localhost> EXEC /bin/sh -c '( umask 77 && mkdir -p "` echo 
   /root/.ansible/tmp/ansible-tmp-1511249525.88-259535494116870 `" && 
   echo ansible-tmp-1511249525.88-259535494116870="` 
   echo /root/.ansible/tmp/ansibletmp-1511249525.88-259535494116870 `" ) && sleep 0' 
<localhost> PUT /tmp/tmpPEPrkd TO 
   /root/.ansible/tmp/ansible-tmp-1511249525.88259535494116870/setup.py 
<localhost> EXEC /bin/sh -c 'chmod u+x 
   /root/.ansible/tmp/ansible-tmp1511249525.88-259535494116870/ 
   /root/.ansible/tmp/ansible-tmp-1511249525.88259535494116870/setup.py && sleep 0' 
<localhost> EXEC /bin/sh -c '/usr/bin/python 
   /root/.ansible/tmp/ansible-tmp1511249525.88-259535494116870/setup.py; rm -rf 
   "/root/.ansible/tmp/ansible-tmp1511249525.88-259535494116870/" > /dev/null 2>&1 && sleep 0' 
ok: [server1] 
META: ran handlers 
 
TASK [install-tomcat : Install Tomcat artifacts] ***********************************
*************************************************************** 
task path: /users/demo/vivek-playbook/roles/install-tomcat/tasks/main.yml:5 
Tuesday 21 November 2017  13:02:07 +0530 (0:00:01.515)       0:00:01.572 ****** 
Using module file /usr/lib/python2.7/sitepackages/ansible/modules/packaging/os/yum.py 
<localhost> ESTABLISH LOCAL CONNECTION FOR USER: root 
<localhost> EXEC /bin/sh -c 'echo ~ && sleep 0' 
<localhost> EXEC /bin/sh -c '( umask 77 && mkdir -p "` echo 
   /root/.ansible/tmp/ansible-tmp-1511249527.34-40247177825302 `" && echo 
   ansibletmp-1511249527.34-40247177825302="` echo 
   /root/.ansible/tmp/ansible-tmp1511249527.34-40247177825302 `" ) && sleep 0' 
<localhost> PUT /tmp/tmpu83chg TO 
   /root/.ansible/tmp/ansible-tmp-1511249527.3440247177825302/yum.py 
<localhost> EXEC /bin/sh -c 'chmod u+x 
   /root/.ansible/tmp/ansible-tmp1511249527.34-40247177825302/ 
   /root/.ansible/tmp/ansible-tmp-1511249527.3440247177825302/yum.py && sleep 0' 
<localhost> EXEC /bin/sh -c '/usr/bin/python 
   /root/.ansible/tmp/ansible-tmp1511249527.34-40247177825302/yum.py; rm -rf 
   "/root/.ansible/tmp/ansible-tmp1511249527.34-40247177825302/" > /dev/null 2>
   &1 && sleep 0' 
changed: [server1] => { 
   "changed": true, 
   "invocation": { 
      "module_args": { 
         "conf_file": null, 
         "disable_gpg_check": false, 
         "disablerepo": null, 
         "enablerepo": null, 
         "exclude": null, 
         "install_repoquery": true, 
         "installroot": "/", 
         "list": null, 
         "name": ["demo-tomcat-1"], 
         "skip_broken": false, 
         "state": "present", 
         "update_cache": false, 
         "validate_certs": true 
      } 
   }, 
   "msg": "", 
   "rc": 0, 
   "results": [ 
      "Loaded plugins: product-id, 
      search-disabled-repos, 
      subscriptionmanager\nThis system is not registered to Red Hat Subscription Management. 
      You can use subscription-manager to register.\nResolving Dependencies\n--> 
      Running transaction check\n---> 
      Package demo-tomcat-1.noarch 0:SNAPSHOT-1 will be installed\n--> Finished Dependency 
      Resolution\n\nDependencies Resolved\n
      \n================================================================================\n 
      Package Arch Version Repository         
      Size\n==================================================================\nInstalling:\n 
      demo-tomcat-1 noarch SNAPSHOT-1 demo-repo1 7.1 M\n\nTransaction 
      Summary\n==================================================================\nInstall  1 
      Package\n\nTotal download size: 7.1 M\nInstalled size: 7.9 M\nDownloading 
         packages:\nRunning transaction 
      check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Installing : 
      demotomcat-1-SNAPSHOT-1.noarch 1/1 \n  Verifying  : 
      demo-tomcat-1-SNAPSHOT-1.noarch 1/1 \n\nInstalled:\n  
      demo-tomcat-1.noarch 0:SNAPSHOT-1 \n\nComplete!\n" 
   ] 
} 
 
TASK [install-tomcat : debug] **********************************************************
*************************************************************************** 
task path: /users/demo/vivek-playbook/roles/install-tomcat/tasks/main.yml:11 
Tuesday 21 November 2017  13:02:13 +0530 (0:00:06.757) 0:00:08.329 ****** 
ok: [server1] => { 
   "changed": false, 
   "msg": [ 
      "Install Tomcat artifacts task ended with message: {
         u'msg': u'', u'changed': True, u'results': 
         [u'Loaded plugins: product-id, 
         search-disabledrepos, 
         subscription-manager\\nThis system is not registered to Red Hat Subscription Management. 
         You can use subscription-manager to register.\\nResolving Dependencies\\n--> 
         Running transaction check\\n---> 
         Package demo-tomcat-1.noarch 0:SNAPSHOT-1 will be installed\\n--> 
         Finished Dependency Resolution\\n
         \\nDependencies 
         Resolved\\n\\n==================================================================\\n 
         Package Arch Version Repository         
         Size\\n======================================================================== 
         =====\\nInstalling:\\n demo-tomcat-1 noarch SNAPSHOT-1 demo-repo1 7.1 M\\n\\nTransaction 
         Summary\\n=========================================================\\nInstall  1 
         Package\\n\\nTotal download size: 7.1 M\\nInstalled size: 7.9 M\\nDownloading 
            packages:\\nRunning 
         transaction check\\nRunning transaction test\\nTransaction test succeeded\\nRunning 
            transaction\\n  
         Installing : demo-tomcat-1-SNAPSHOT-1.noarch 1/1 \\n  Verifying  : 
         demo-tomcat-1-SNAPSHOT-1.noarch
         1/1 \\n\\nInstalled:\\n  demo-tomcat-1.noarch 0:SNAPSHOT-1  \\n\\nComplete!\\n'], u'rc': 0
      }", 
      "Installed Tomcat artifacts - True" 
   ] 
} 
 
TASK [install-tomcat : Clean DEMO environment] ****************************************
************************************************************ 
task path: /users/demo/vivek-playbook/roles/install-tomcat/tasks/main.yml:19 
Tuesday 21 November 2017  13:02:13 +0530 (0:00:00.057) 0:00:08.387 ****** 
[WARNING]: when statements should not include jinja2 templating delimiters such as {{ }} or 
   {% %}. Found: {{installationOutput.changed}} 
 
Using module file /usr/lib/python2.7/sitepackages/ansible/modules/files/file.py 
<localhost> ESTABLISH LOCAL CONNECTION FOR USER: root 
<localhost> EXEC /bin/sh -c 'echo ~ && sleep 0' 
<localhost> EXEC /bin/sh -c '( umask 77 && mkdir -p "` echo 
   /root/.ansible/tmp/ansible-tmp-1511249534.13-128345805983963 `" && echo 
   ansible-tmp-1511249534.13-128345805983963="` echo 
   /root/.ansible/tmp/ansibletmp-1511249534.13-128345805983963 `" ) && sleep 0' 
<localhost> PUT /tmp/tmp0aXel7 TO 
   /root/.ansible/tmp/ansible-tmp-1511249534.13128345805983963/file.py 
<localhost> EXEC /bin/sh -c 'chmod u+x 
   /root/.ansible/tmp/ansible-tmp1511249534.13-128345805983963/ 
   /root/.ansible/tmp/ansible-tmp-1511249534.13128345805983963/file.py && sleep 0' 
<localhost> EXEC /bin/sh -c '/usr/bin/python 
   /root/.ansible/tmp/ansible-tmp1511249534.13-128345805983963/file.py; rm -rf 
   "/root/.ansible/tmp/ansible-tmp1511249534.13-128345805983963/" > /dev/null 2>&1 
   && sleep 0' 
changed: [server1] => { 
   "changed": true, 
      "diff": { 
         "after": { 
            "path": "/users/demo/DEMO", 
            "state": "absent" 
      }, 
      "before": { 
         "path": "/users/demo/DEMO", 
         "state": "directory" 
      } 
   },

   "invocation": { 
      "module_args": { 
         "attributes": null, 
         "backup": null, 
         "content": null, 
         "delimiter": null, 
         "diff_peek": null, 
         "directory_mode": null, 
         "follow": false, 
         "force": false, 
         "group": null, 
         "mode": null, 
         "original_basename": null, 
         "owner": null, 
         "path": "/users/demo/DEMO", 
         "recurse": false, 
         "regexp": null, 
         "remote_src": null, 
         "selevel": null, 
         "serole": null, 
         "setype": null, 
         "seuser": null, 
         "src": null, 
         "state": "absent", 
         "unsafe_writes": null, 
         "validate": null 
      } 
   }, 
   "path": "/users/demo/DEMO", 
   "state": "absent" 
} 
 
TASK [install-tomcat : debug] ********************************************************
************************************************************* 
task path: /users/demo/vivek-playbook/roles/install-tomcat/tasks/main.yml:29 
Tuesday 21 November 2017  13:02:14 +0530 (0:00:00.257)       0:00:08.645 ****** 
ok: [server1] => {
   "changed": false, 
   "msg": [ 
      "Clean DEMO environment task ended with message:{u'diff': {u'after': {u'path': 
         u'/users/demo/DEMO', u'state': u'absent'}, 
      u'before': {u'path': u'/users/demo/DEMO', u'state': u'directory'}}, u'state': u'absent', 
         u'changed': True, u'path': u'/users/demo/DEMO'}", 
      "check value  :True" 
   ] 
} 
 
TASK [install-tomcat : Copy Tomcat to user home] *************************************
******************************************************** 
task path: /users/demo/vivek-playbook/roles/install-tomcat/tasks/main.yml:37 
Tuesday 21 November 2017  13:02:14 +0530 (0:00:00.055)       0:00:08.701 ****** 
[WARNING]: when statements should not include jinja2 templating delimiters such as {{ }} or 
   {% %}. Found: {{installationOutput.changed}} 
 
Using module file /usr/lib/python2.7/sitepackages/ansible/modules/commands/command.py 
<localhost> ESTABLISH LOCAL CONNECTION FOR USER: root 
<localhost> EXEC /bin/sh -c 'echo ~ && sleep 0' 
<localhost> EXEC /bin/sh -c '( umask 77 && mkdir -p "` echo 
   /root/.ansible/tmp/ansible-tmp-1511249534.43-41077200718443 `" && echo 
   ansibletmp-1511249534.43-41077200718443="` echo 
   /root/.ansible/tmp/ansible-tmp1511249534.43-41077200718443 `" ) && sleep 0' 
<localhost> PUT /tmp/tmp25deWs TO 
   /root/.ansible/tmp/ansible-tmp-1511249534.4341077200718443/command.py 
<localhost> EXEC /bin/sh -c 'chmod u+x 
   /root/.ansible/tmp/ansible-tmp1511249534.43-41077200718443/ 
   /root/.ansible/tmp/ansible-tmp-1511249534.4341077200718443/command.py && sleep 0' 
<localhost> EXEC /bin/sh -c '/usr/bin/python 
   /root/.ansible/tmp/ansible-tmp1511249534.43-41077200718443/command.py; rm -rf 
   "/root/.ansible/tmp/ansibletmp-1511249534.43-41077200718443/" > /dev/null 2>&1 
   && sleep 0' 
changed: [server1] => { 
   "changed": true, 
   "cmd": [ 
      "cp", 
      "-r", 
      "/opt/ansible/tomcat/demo", 
      "/users/demo/DEMO/" 
   ],
   "delta": "0:00:00.017923", 
   "end": "2017-11-21 13:02:14.547633", 
   "invocation": { 
      "module_args": { 
         "_raw_params": "cp -r /opt/ansible/tomcat/demo /users/demo/DEMO/", 
         "_uses_shell": false, 
         "chdir": null, 
         "creates": null, 
         "executable": null, 
         "removes": null, 
         "warn": true 
      } 
   }, 
   "rc": 0, 
   "start": "2017-11-21 13:02:14.529710", 
   "stderr": "", 
   "stderr_lines": [], 
   "stdout": "", 
   "stdout_lines": [] 
} 
 
TASK [install-tomcat : debug] ********************************************************
********************************************************** 
task path: /users/demo/vivek-playbook/roles/install-tomcat/tasks/main.yml:47 
Tuesday 21 November 2017  13:02:14 +0530 (0:00:00.260)       0:00:08.961 ****** 
ok: [server1] => { 
   "changed": false, 
   "msg": "Copy Tomcat to user home task ended with message {
      'stderr_lines': [], u'changed': True, u'end': u'2017-11-21 13:02:14.547633', u'stdout': 
      u'', u'cmd': [u'cp', u'-r', u'/opt/ansible/tomcat/demo', u'/users/demo/DEMO/'], u'rc': 0, 
      u'start': u'2017-11-21 13:02:14.529710', u'stderr': u'', u'delta': u'0:00:00.017923', 
      'stdout_lines': []}" 
} 
 
TASK [start-tomcat : Start Tomcat] **************************************************
********************************************************** 
task path: /users/demo/vivek-playbook/roles/start-tomcat/tasks/main.yml:5 
Tuesday 21 November 2017  13:02:14 +0530 (0:00:00.044)       0:00:09.006 ****** 
Using module file /usr/lib/python2.7/sitepackages/ansible/modules/commands/command.py 
<localhost> ESTABLISH LOCAL CONNECTION FOR USER: root 
<localhost> EXEC /bin/sh -c 'echo ~ && sleep 0' 
<localhost> EXEC /bin/sh -c '( umask 77 && mkdir -p "` echo 
   /root/.ansible/tmp/ansible-tmp-1511249534.63-46501211251197 `" && echo 
   ansibletmp-1511249534.63-46501211251197="` echo 
   /root/.ansible/tmp/ansible-tmp1511249534.63-46501211251197 `" ) && sleep 0' 
<localhost> PUT /tmp/tmp9f06MQ TO 
   /root/.ansible/tmp/ansible-tmp-1511249534.6346501211251197/command.py 
<localhost> EXEC /bin/sh -c 'chmod u+x 
   /root/.ansible/tmp/ansible-tmp1511249534.63-46501211251197/ 
   /root/.ansible/tmp/ansible-tmp-1511249534.6346501211251197/command.py && sleep 0' 
<localhost> EXEC /bin/sh -c '/usr/bin/python 
   /root/.ansible/tmp/ansible-tmp1511249534.63-46501211251197/command.py; rm -rf 
   "/root/.ansible/tmp/ansibletmp-1511249534.63-46501211251197/" > /dev/null 2>&1 
   && sleep 0' 
changed: [server1] => { 
   "changed": true, 
   "cmd": [ "/users/demo/DEMO/bin/startup.sh" ], 
   "delta": "0:00:00.020024", 
   "end": "2017-11-21 13:02:14.741649", 
   "invocation": { 
      "module_args": { 
         "_raw_params": "/users/demo/DEMO/bin/startup.sh", 
         "_uses_shell": false, 
         "chdir": null, 
         "creates": null, 
         "executable": null, 
         "removes": null, 
         "warn": true 
      } 
   }, 
   "rc": 0, 
   "start": "2017-11-21 13:02:14.721625", 
   "stderr": "", 
   "stderr_lines": [], 
   "stdout": "Tomcat started.", 
   "stdout_lines": [ "Tomcat started." ] 
} 
 
TASK [start-tomcat : debug] *************************************************
********************************************************************** 
task path: /users/demo/vivek-playbook/roles/start-tomcat/tasks/main.yml:10 
Tuesday 21 November 2017  13:02:14 +0530 (0:00:00.150)       0:00:09.156 ****** 
ok: [server1] => { 
   "changed": false, 
   "msg": [ 
      "Start Tomcat task ended with message: {'
         stderr_lines': [], u'changed': True, u'end': u'2017-11-21 13:02:14.741649', u'stdout': 
         u'Tomcat started.', u'cmd': [u'/users/demo/DEMO/bin/startup.sh'], u'rc': 0, u'start': 
         u'2017-11-21 13:02:14.721625', u'stderr': u'', u'delta': u'0:00:00.020024', 
         'stdout_lines': [u'Tomcat started.']}", 
      "Tomcat started - True" 
   ] 
} 
META: ran handlers 
META: ran handlers 
 
PLAY RECAP ******************************************************************************* 
********************************************************* 
server1  : ok = 9    changed = 4    unreachable = 0    failed = 0 
 
Tuesday 21 November 2017  13:02:14 +0530 (0:00:00.042)       0:00:09.198 ****** 
=============================================================================== 
install-tomcat : Install Tomcat artifacts ------------------------------- 6.76s 
/users/demo/vivek-playbook/roles/install-tomcat/tasks/main.yml:5 -------------- 
Gathering Facts --------------------------------------------------------- 1.52s 
 ------------------------------------------------------------------------------ 
install-tomcat : Copy Tomcat to user home ------------------------------- 0.26s 
/users/demo/vivek-playbook/roles/install-tomcat/tasks/main.yml:37 ------------- 

install-tomcat : Clean DEMO environment --------------------------------- 0.26s 
/users/demo/vivek-playbook/roles/install-tomcat/tasks/main.yml:19 ------------- 

start-tomcat : Start Tomcat --------------------------------------------- 0.15s 
/users/demo/vivek-playbook/roles/start-tomcat/tasks/main.yml:5 ----------------

install-tomcat : debug -------------------------------------------------- 0.06s 
/users/demo/vivek-playbook/roles/install-tomcat/tasks/main.yml:11 ------------- 

install-tomcat : debug -------------------------------------------------- 0.06s 
/users/demo/vivek-playbook/roles/install-tomcat/tasks/main.yml:29 ------------- 

install-tomcat : debug -------------------------------------------------- 0.04s 
/users/demo/vivek-playbook/roles/install-tomcat/tasks/main.yml:47 ------------- 

start-tomcat : debug ---------------------------------------------------- 0.04s 
/users/demo/vivek-playbook/roles/start-tomcat/tasks/main.yml:10 ---------------

Nhấn vào URL sau và bạn sẽ được dẫn đến một trang như hình dưới đây - http://10.76.0.134:11677/HelloWorld/HelloWorld

Cuộc chiến được triển khai chỉ có một servlet hiển thị "Hello World". Kết quả chi tiết hiển thị thời gian thực hiện của mỗi và mọi tác vụ do mục nhập được thêm vào tệp ansible.cfg -

[defaults] 
callback_whitelist = profile_tasks

Biến trong sách vở là very similarđể sử dụng các biến trong bất kỳ ngôn ngữ lập trình nào. Nó giúp bạn sử dụng và gán một giá trị cho một biến và sử dụng nó ở bất kỳ đâu trong playbook. Người ta có thể đặt các điều kiện xung quanh giá trị của các biến và theo đó sử dụng chúng trong playbook.

Thí dụ

- hosts : <your hosts> 
vars:
tomcat_port : 8080

Trong ví dụ trên, chúng tôi đã xác định một tên biến tomcat_port và gán giá trị 8080 cho biến đó và có thể sử dụng giá trị đó trong sổ chơi của bạn bất cứ khi nào cần thiết.

Bây giờ lấy tham chiếu từ ví dụ được chia sẻ. Đoạn mã sau là từ một trong các vai trò (install-tomcat):

block: 
   - name: Install Tomcat artifacts 
      action: > 
      yum name = "demo-tomcat-1" state = present 
      register: Output 
          
   always: 
      - debug: 
         msg: 
            - "Install Tomcat artifacts task ended with message: {{Output}}" 
            - "Installed Tomcat artifacts - {{Output.changed}}"

Ở đây, đầu ra là biến được sử dụng.

Hãy để chúng tôi xem qua tất cả các từ khóa được sử dụng trong đoạn mã trên -

  • block - Cú pháp khả thi để thực thi một khối nhất định.

  • name - Tên liên quan của khối - tên này được sử dụng trong ghi nhật ký và giúp gỡ lỗi rằng tất cả các khối đã được thực thi thành công.

  • action- Đoạn mã bên cạnh thẻ hành động là tác vụ được thực thi. Hành động lại là một từ khóa Ansible được sử dụng trong yaml.

  • register - Đầu ra của hành động được đăng ký bằng cách sử dụng từ khóa thanh ghi và Đầu ra là tên biến chứa đầu ra của hành động.

  • always - Lại một từ khóa Ansible, nó nói rằng bên dưới sẽ luôn được thực thi.

  • msg - Hiển thị tin nhắn.

Cách sử dụng biến - {{Output}} ->

Điều này sẽ đọc giá trị của biến Output. Cũng như nó được sử dụng trong tab msg, nó sẽ in ra giá trị của biến đầu ra.

Ngoài ra, bạn cũng có thể sử dụng các thuộc tính phụ của biến. Giống như trong trường hợp kiểm tra {{Output.changed}} xem đầu ra có bị thay đổi hay không và sử dụng nó cho phù hợp.

Xử lý ngoại lệ trong Playbooks

Xử lý ngoại lệ trong Ansible tương tự như xử lý ngoại lệ trong bất kỳ ngôn ngữ lập trình nào. Dưới đây là một ví dụ về xử lý ngoại lệ trong playbook.

tasks: 
   - name: Name of the task to be executed 
      block: 
         - debug: msg = 'Just a debug message , relevant for logging' 
         - command: <the command to execute> 
      
      rescue: 
         - debug: msg = 'There was an exception.. ' 
         - command: <Rescue mechanism for the above exception occurred) 
      
      always: 
         - debug: msg = "this will execute in all scenarios. Always will get logged"

Sau đây là cú pháp để xử lý ngoại lệ.

  • rescuealways là các từ khóa cụ thể để xử lý ngoại lệ.

  • Block là nơi mã được viết (bất kỳ thứ gì được thực thi trên máy Unix).

  • Nếu lệnh được viết bên trong tính năng khối không thành công, thì việc thực thi đến khối cứu hộ và nó sẽ được thực thi. Trong trường hợp không có lỗi trong tính năng lệnh dưới khối, thì việc giải cứu sẽ không được thực hiện.

  • Always được thực thi trong mọi trường hợp.

  • Vì vậy, nếu chúng ta so sánh tương tự với java, thì thử, bắt và cuối cùng là chặn.

  • Đây, Block tương tự như try block nơi bạn viết mã sẽ được thực thi và rescue tương tự như catch blockalways tương tự như finally.

Vòng lặp

Dưới đây là ví dụ để chứng minh việc sử dụng Loops trong Ansible.

Nhiệm vụ là sao chép tập hợp tất cả các tệp chiến tranh từ một thư mục vào thư mục ứng dụng web tomcat.

Hầu hết các lệnh được sử dụng trong ví dụ dưới đây đã được đề cập trước đó. Ở đây, chúng ta sẽ tập trung vào việc sử dụng các vòng lặp.

Ban đầu trong lệnh 'shell' chúng ta đã thực hiện lệnh ls * .war. Vì vậy, nó sẽ liệt kê tất cả các tập tin chiến tranh trong thư mục.

Đầu ra của lệnh đó được lấy trong một đầu ra có tên biến.

Để lặp lại, cú pháp 'with_items' đang được sử dụng.

with_items: "{{output.stdout_lines}}" -> output.stdout_lines cung cấp cho chúng ta đầu ra từng dòng và sau đó chúng ta lặp lại đầu ra với lệnh with_items của Ansible.

Việc đính kèm đầu ra ví dụ chỉ để làm cho người ta hiểu cách chúng tôi đã sử dụng stdout_lines trong lệnh with_items.

--- 
#Tsting 
- hosts: tomcat-node 
   tasks: 
      - name: Install Apache 
      shell: "ls *.war" 
      register: output 
      args: 
         chdir: /opt/ansible/tomcat/demo/webapps 
      
      - file: 
         src: '/opt/ansible/tomcat/demo/webapps/{{ item }}' 
         dest: '/users/demo/vivek/{{ item }}' 
         state: link 
      with_items: "{{output.stdout_lines}}"

                

Khối

Sách chơi tổng thể được chia thành các khối. Phần nhỏ nhất của các bước cần thực hiện được viết trong khối. Viết hướng dẫn cụ thể trong các khối giúp tách biệt chức năng và xử lý nó với xử lý ngoại lệ nếu cần.

Ví dụ về các khối được đề cập trong cách sử dụng biến, xử lý ngoại lệ và các vòng lặp ở trên.

Điều kiện

Các điều kiện được sử dụng khi người ta cần chạy một bước cụ thể dựa trên một điều kiện.

--- 
#Tsting 
- hosts: all 
   vars: 
      test1: "Hello Vivek" 
   tasks: 
      - name: Testing Ansible variable 
      debug: 
         msg: "Equals" 
         when: test1 == "Hello Vivek"

Trong trường hợp này, Equals sẽ được in ra vì biến test1 là bằng như đã đề cập trong điều kiện when. when có thể được sử dụng với điều kiện logic OR và logic AND như trong tất cả các ngôn ngữ lập trình.

Chỉ cần thay đổi giá trị của biến test1 từ Hello Vivek thành Hello World và xem kết quả.

Trong chương này, chúng ta sẽ tìm hiểu thực thi nâng cao với Ansible là gì.

Làm thế nào để hạn chế việc thực thi theo nhiệm vụ

Đây là một chiến lược thực hiện rất quan trọng, trong đó người ta chỉ cần thực hiện một lần thực hiện chứ không phải toàn bộ vở kịch. For example, giả sử bạn chỉ muốn dừng một máy chủ (trong trường hợp có sự cố sản xuất) và sau đó đăng áp dụng bản vá mà bạn muốn chỉ khởi động máy chủ.

Ở đây trong playbook gốc, dừng và bắt đầu là một phần của các vai trò khác nhau trong cùng một playbook nhưng điều này có thể được xử lý bằng cách sử dụng các thẻ. Chúng tôi có thể cung cấp các thẻ khác nhau cho các vai trò khác nhau (lần lượt sẽ có các nhiệm vụ) và do đó, dựa trên các thẻ được cung cấp bởi người thực thi, chỉ vai trò / nhiệm vụ cụ thể mới được thực thi. Vì vậy, đối với ví dụ được cung cấp ở trên, chúng ta có thể thêm các thẻ như sau:

- {role: start-tomcat, tags: ['install']}}

Lệnh sau giúp sử dụng các thẻ:

ansible-playbook -i hosts <your yaml> --tags "install" -vvv

Với lệnh trên, chỉ role start-tomcat mới được gọi. Thẻ được cung cấp có phân biệt chữ hoa chữ thường. Đảm bảo khớp chính xác đang được chuyển đến lệnh.

Cách hạn chế việc thực thi bởi máy chủ

Có hai cách để thực hiện các bước cụ thể trên các máy chủ cụ thể. Đối với một vai trò cụ thể, người ta xác định các máy chủ - máy chủ cụ thể nào mà vai trò cụ thể đó sẽ được chạy.

Thí dụ

- hosts: <A> 
   environment: "{{your env}}" 
   pre_tasks: 
      - debug: msg = "Started deployment. 
      Current time is {{ansible_date_time.date}} {{ansible_date_time.time}} " 
     
   roles: 
      - {role: <your role>, tags: ['<respective tag>']} 
   post_tasks: 
      - debug: msg = "Completed deployment. 
      Current time is {{ansible_date_time.date}} {{ansible_date_time.time}}" 
 
- hosts: <B> 
   pre_tasks: 
      - debug: msg = "started.... 
      Current time is {{ansible_date_time.date}} {{ansible_date_time.time}} " 
        
   roles: 
      - {role: <your role>, tags: ['<respective tag>']} 
   post_tasks: 
      - debug: msg = "Completed the task.. 
      Current time is {{ansible_date_time.date}} {{ansible_date_time.time}}"

Theo ví dụ trên, tùy thuộc vào máy chủ được cung cấp, các vai trò tương ứng sẽ chỉ được gọi. Bây giờ các máy chủ A và B của tôi được xác định trong các máy chủ lưu trữ (tệp kiểm kê).

Giải pháp thay thế

Một giải pháp khác có thể là xác định máy chủ của playbook bằng cách sử dụng một biến, sau đó chuyển một địa chỉ máy chủ cụ thể qua --extra-vars -

# file: user.yml  (playbook) 
--- 
- hosts: '{{ target }}' 
   user: ... 
playbook contd….

Chạy Playbook

ansible-playbook user.yml --extra-vars "target = "<your host variable>"

Nếu {{target}} không được xác định, playbook không có tác dụng gì. Một nhóm từ tệp máy chủ cũng có thể được chuyển qua nếu cần. Điều này không gây hại nếu các vars bổ sung không được cung cấp.

Playbook nhắm mục tiêu một máy chủ duy nhất

$ ansible-playbook user.yml --extra-vars "target = <your hosts variable>" --listhosts

Các chiến lược phổ biến nhất để gỡ lỗi sách phát Ansible là sử dụng các mô-đun được cung cấp bên dưới:

Gỡ lỗi và Đăng ký

Đây là hai mô-đun có sẵn trong Ansible. Đối với mục đích gỡ lỗi, chúng ta cần sử dụng hai mô-đun một cách thận trọng. Ví dụ được minh họa dưới đây.

Sử dụng Verbosity

Với lệnh Ansible, người ta có thể cung cấp mức độ chi tiết. Bạn có thể chạy các lệnh với mức chi tiết một (-v) hoặc hai (-vv).

Điểm quan trọng

Trong phần này, chúng ta sẽ đi qua một vài ví dụ để hiểu một vài khái niệm.

Nếu bạn không trích dẫn một đối số bắt đầu bằng một biến. Ví dụ,

vars: 
   age_path: {{vivek.name}}/demo/ 
   
{{vivek.name}}

Điều này sẽ tạo ra một lỗi.

Giải pháp

vars: 
   age_path: "{{vivek.name}}/demo/" – marked in yellow is the fix. 
 
How to use register -> Copy this code into a yml file say test.yml and run it  
--- 
#Tsting 
- hosts: tomcat-node 
   tasks: 
 
   - shell: /usr/bin/uptime 
      register: myvar 
      - name: Just debugging usage 
         debug: var = myvar

Khi tôi chạy mã này thông qua lệnh Ansible-playbook -i hosts test.yml, tôi nhận được kết quả như hình dưới đây.

Nếu bạn thấy yaml, chúng tôi đã đăng ký đầu ra của một lệnh vào một biến - myvar và chỉ in đầu ra.

Văn bản được đánh dấu màu vàng cho chúng ta biết về thuộc tính của biến –myvar có thể được sử dụng để kiểm soát luồng hơn nữa. Bằng cách này, chúng ta có thể tìm hiểu về các thuộc tính được hiển thị của một biến cụ thể. Lệnh gỡ lỗi sau sẽ giúp bạn trong việc này.

$ ansible-playbook -i hosts test.yml 

PLAY [tomcat-node] ***************************************************************
**************** ****************************************************************
*************** ****************************** 
 
TASK [Gathering Facts] *****************************************************************
************** *****************************************************************
************** ************************** 
Monday 05 February 2018  17:33:14 +0530 (0:00:00.051) 0:00:00.051 ******* 
ok: [server1] 
 
TASK [command] ******************************************************************
************* ******************************************************************
************* ********************************** 
Monday 05 February 2018  17:33:16 +0530 (0:00:01.697) 0:00:01.748 ******* 
changed: [server1] 
 
TASK [Just debugging usage] ******************************************************************
************* ******************************************************************
************* ********************* 
Monday 05 February 2018  17:33:16 +0530 (0:00:00.226) 0:00:01.974 ******* 
ok: [server1] => { 
   "myvar": { 
      "changed": true, 
      "cmd": "/usr/bin/uptime", 
      "delta": "0:00:00.011306", 
      "end": "2018-02-05 17:33:16.424647", 
      "rc": 0, 
      "start": "2018-02-05 17:33:16.413341", 
      "stderr": "", 
      "stderr_lines": [], 
      "stdout": " 17:33:16 up 7 days, 35 min,  1 user,  load average: 0.18, 0.15, 0.14", 
      "stdout_lines": [ 
         " 17:33:16 up 7 days, 35 min,  1 user,  load average: 0.18, 0.15, 0.14" 
      ] 
   } 
} 
 
PLAY RECAP ****************************************************************************
**********************************************************************************
 ************************************** 
server1 : ok = 3    changed = 1    unreachable = 0    failed = 0

Các vấn đề chung về Playbook

Trong phần này, chúng ta sẽ tìm hiểu về một số vấn đề chung về playbook. Các vấn đề là -

  • Quoting
  • Indentation

Playbook được viết ở định dạng yaml và hai vấn đề trên là những vấn đề phổ biến nhất trong yaml / playbook.

Yaml không hỗ trợ thụt lề dựa trên tab và hỗ trợ thụt lề dựa trên dấu cách, vì vậy bạn cần phải cẩn thận về điều này.

Note - khi bạn đã viết xong yaml, hãy mở trang web này (https://editor.swagger.io/) và sao chép, dán yaml của bạn ở phía bên trái để đảm bảo rằng yaml biên dịch đúng cách. Đây chỉ là một mẹo.

Swagger đủ điều kiện cho các lỗi trong cảnh báo cũng như lỗi.