Trước tiên chúng ta hãy cùng nói lại về khái niệm Playbook trong Ansible
Về Playbook
Playbook thông thường là những tấm bảng ghi sơ đồ vị trí, chiến thuật di chuyển của từng cầu thủ mà các HLV sử dụng để truyền đạt cho cầu thủ (nếu bạn xem đá bóng). Ví dụ như Công Phượng đá hộ công, Huy Toàn đột phá cánh trái hay Quế Ngọc Hải đá hậu vệ.
Ansible sử dụng khái niệm Playbook cũng mang ý nghĩa tương tự. Việc triển khai hệ thống mới cũng tương tự như sơ đồ chiến thuật, các group [webservers], [databases] cũng như tuyến tiền đạo, hậu vệ, các dịch vụ cũng như kết nối tới các thành phần khác nhau trong hệ thống của từng server cũng giống nhiệm vụ của một cầu thủ trên sân.
Thực hành
Tiếp theo chúng ta hãy cùng thực hành luôn nhé!
Mô hình bài lab vẫn như bài trước, chúng ta sẽ có 3 máy ảo EC2 trên AWS, cài đặt Ansible cho 1 máy EC2 ubuntu
Để in ra thông tin trong quá trình chạy Playbook, chúng ta sẽ sử dụng module Debug trong Ansible. Để hiển thị thôn tin debug có 2 phương án phổ biến là: mgs và var. Vẫn trong thư mục websrv chúng ta đã tạo ở bài trước với file host, tạo thêm 1 file PlaybookVar.yaml sau đó đưa nội dung sau vào:
---
- name: Test variable
hosts: webserver
gather_facts: true
tasks:
- name: "Show target server IP"
debug:
msg: “Target system (Web server) IP= {{inventory_hostname}}”
#var: inventory_hostname
Save lại và chạy lệnh:
|
|
Chúng ta có thể định nghĩa biến ngay trong file Playbook như sau, biến khai báo trùng tên trong file hosts và trong Playbook thì Ansible ưu tiên trong playbook hơn :
---
- name: Test variable
hosts: webserver
gather_facts: true
tasks:
- name: "Show NTP Server Infor"
debug:
# msg: “Target system (Web server) IP= {{inventory_hostname}}”
var: ntp_server_test, ntp_port_test
vars:
ntp_server_test: 192.168.11.1
ntp_port_test: "UDP 1313"
Chúng ta sẽ có kết quả như sau:
Hoặc chúng ta cũng có thể định nghĩa biến trong file riêng:
- Tạo thư mục chứa các file khai báo biến riêng : mkdir vars && cd vars
- Tạo file chứa các biến khi cài DB server và viết nội dung sau:
mysqlservice: mysqld
mysql_port: 3306
db_user: foouser
upassword: abc
Tiếp theo chúng ta sẽ hiệu chỉnh lại file playbook để import file chứa biến riêng và hiển thị giá trị của các biến:
---
- name: Test variable
hosts: webserver
gather_facts: true
tasks:
- name: "Show NTP Server Infor"
debug:
# msg: “Target system (Web server) IP= {{inventory_hostname}}”
var: ntp_server['IP'], httpd_port[1], mysql_port
vars:
ntp_server:
IP: 192.168.122.1
ntp_port: "UDP 1312"
httpd_port:
- 80
- 443
vars_files:
- ./vars/dbserver
Sau đó chạy lệnh ansible-playbook -i hosts playbookvar.yaml để phân tích đâu là biến kiểu Array, đâu là kiểu Object
Chúng ta cũng có thể in các giá trị của biến OUTPUT từ lệnh khác như sau:
---
- name: Test variable
hosts: webserver
gather_facts: true
tasks:
- name: "Show NTP Server Infor"
debug:
# msg: “Target system (Web server) IP= {{inventory_hostname}}”
var: ntp_server['IP'], httpd_port[1], mysql_port
- name: Check uptime target server
shell: uptime
register: output
- name: "Show uptime from shell"
debug:
var: output
vars:
ntp_server:
IP: 192.168.122.1
ntp_port: "UDP 1312"
httpd_port:
- 80
- 443
vars_files:
- ./vars/dbserver
Sau đó chạy thử, chúng ta sẽ thấy biến uptime trong mục “stdout_lines”
Tiếp theo chúng ta có thể đọc dữ liệu từ các biến Built-in của Ansible. Khi Ansible bắt đầu chạy Playbook, mặc định nó sẽ đọc các thông số của Target server vào biến môi trường gọi là Facts
Chúng ta sẽ tạo 1 playbook mới và viết nội dung như sau:
---
- hosts: webserver
gather_facts: true
tasks:
- name: "Show ansiblr Facts"
debug:
var: ansible_facts
Sau đó chúng ta chạy lệnh sẽ được kết quả như sau:
ubuntu@ip-10-32-1-210:~/websrv$ ansible-playbook -i hosts playbookFacts.yaml
PLAY [webserver] ***************************************************************
TASK [Gathering Facts] *********************************************************
[WARNING]: Platform linux on host 16.163.95.41 is using the discovered Python
interpreter at /usr/bin/python, but future installation of another Python
interpreter could change this. See https://docs.ansible.com/ansible/2.9/referen
ce_appendices/interpreter_discovery.html for more information.
ok: [16.163.95.41]
TASK [Show ansiblr Facts] ******************************************************
ok: [16.163.95.41] => {
"ansible_facts": {
"_facts_gathered": true,
"all_ipv4_addresses": [
"10.32.1.186"
],
"all_ipv6_addresses": [
"fe80::42d:d5ff:fef3:7b08"
],
"ansible_local": {},
"apparmor": {
"status": "disabled"
},
"architecture": "x86_64",
"bios_date": "10/16/2017",
"bios_version": "1.0",
"cmdline": {
"BOOT_IMAGE": "/boot/vmlinuz-5.10.135-122.509.amzn2.x86_64",
"biosdevname": "0",
"console": "ttyS0,115200n8",
"net.ifnames": "0",
"nvme_core.io_timeout": "4294967295",
"rd.emergency": "poweroff",
"rd.shell": "0",
"ro": true,
"root": "UUID=2318d4b7-b8cd-4579-ab46-47af13e15000"
},
"date_time": {
"date": "2022-10-15",
"day": "15",
"epoch": "1665854220",
"hour": "17",
"iso8601": "2022-10-15T17:17:00Z",
"iso8601_basic": "20221015T171700106679",
"iso8601_basic_short": "20221015T171700",
"iso8601_micro": "2022-10-15T17:17:00.106749Z",
"minute": "17",
"month": "10",
"second": "00",
"time": "17:17:00",
"tz": "UTC",
"tz_offset": "+0000",
"weekday": "Saturday",
"weekday_number": "6",
"weeknumber": "41",
"year": "2022"
},
"default_ipv4": {
"address": "10.32.1.186",
"alias": "eth0",
"broadcast": "10.32.1.255",
"gateway": "10.32.1.1",
"interface": "eth0",
"macaddress": "06:2d:d5:f3:7b:08",
"mtu": 9001,
"netmask": "255.255.255.0",
"network": "10.32.1.0",
"type": "ether"
},
"default_ipv6": {},
"device_links": {
"ids": {
"nvme0n1": [
"nvme-Amazon_Elastic_Block_Store_vol04b1c50673dda9abc",
"nvme-Amazon_Elastic_Block_Store_vol04b1c50673dda9abc-ns-1",
"nvme-nvme.1d0f-766f6c3034623163353036373364646139616263-416d617a6f6e20456c617374696320426c6f636b2053746f7265-00000001"
],
"nvme0n1p1": [
"nvme-Amazon_Elastic_Block_Store_vol04b1c50673dda9abc-ns-1-part1",
"nvme-Amazon_Elastic_Block_Store_vol04b1c50673dda9abc-part1",
"nvme-nvme.1d0f-766f6c3034623163353036373364646139616263-416d617a6f6e20456c617374696320426c6f636b2053746f7265-00000001-part1"
],
"nvme0n1p128": [
"nvme-Amazon_Elastic_Block_Store_vol04b1c50673dda9abc-ns-1-part128",
"nvme-Amazon_Elastic_Block_Store_vol04b1c50673dda9abc-part128",
"nvme-nvme.1d0f-766f6c3034623163353036373364646139616263-416d617a6f6e20456c617374696320426c6f636b2053746f7265-00000001-part128"
]
},
"labels": {
"nvme0n1p1": [
"\\x2f"
]
},
"masters": {},
"uuids": {
"nvme0n1p1": [
"2318d4b7-b8cd-4579-ab46-47af13e15000"
]
}
},
"devices": {
"nvme0n1": {
"holders": [],
"host": "Non-Volatile memory controller: Amazon.com, Inc. Device 8061",
"links": {
"ids": [
"nvme-Amazon_Elastic_Block_Store_vol04b1c50673dda9abc",
"nvme-Amazon_Elastic_Block_Store_vol04b1c50673dda9abc-ns-1",
"nvme-nvme.1d0f-766f6c3034623163353036373364646139616263-416d617a6f6e20456c617374696320426c6f636b2053746f7265-00000001"
],
"labels": [],
"masters": [],
"uuids": []
},
"model": "Amazon Elastic Block Store",
"partitions": {
"nvme0n1p1": {
"holders": [],
"links": {
"ids": [
"nvme-Amazon_Elastic_Block_Store_vol04b1c50673dda9abc-ns-1-part1",
"nvme-Amazon_Elastic_Block_Store_vol04b1c50673dda9abc-part1",
"nvme-nvme.1d0f-766f6c3034623163353036373364646139616263-416d617a6f6e20456c617374696320426c6f636b2053746f7265-00000001-part1"
],
"labels": [
"\\x2f"
],
"masters": [],
"uuids": [
"2318d4b7-b8cd-4579-ab46-47af13e15000"
]
},
"sectors": "16773087",
"sectorsize": 512,
"size": "8.00 GB",
"start": "4096",
"uuid": "2318d4b7-b8cd-4579-ab46-47af13e15000"
},
"nvme0n1p128": {
"holders": [],
"links": {
"ids": [
"nvme-Amazon_Elastic_Block_Store_vol04b1c50673dda9abc-ns-1-part128",
"nvme-Amazon_Elastic_Block_Store_vol04b1c50673dda9abc-part128",
"nvme-nvme.1d0f-766f6c3034623163353036373364646139616263-416d617a6f6e20456c617374696320426c6f636b2053746f7265-00000001-part128"
],
"labels": [],
"masters": [],
"uuids": []
},
"sectors": "2048",
"sectorsize": 512,
"size": "1.00 MB",
"start": "2048",
"uuid": null
}
},
"removable": "0",
"rotational": "0",
"sas_address": null,
"sas_device_handle": null,
"scheduler_mode": "none",
"sectors": "16777216",
"sectorsize": "512",
"size": "8.00 GB",
"support_discard": "0",
"vendor": null,
"virtual": 1
}
},
"discovered_interpreter_python": "/usr/bin/python",
"distribution": "Amazon",
"distribution_file_parsed": true,
"distribution_file_path": "/etc/system-release",
"distribution_file_variety": "Amazon",
"distribution_major_version": "2",
"distribution_release": "NA",
"distribution_version": "2",
"dns": {
"nameservers": [
"10.32.0.2"
],
"options": {
"attempts": "5",
"timeout": "2"
},
"search": [
"ap-east-1.compute.internal"
]
},
"domain": "ap-east-1.compute.internal",
"effective_group_id": 1000,
"effective_user_id": 1000,
"env": {
"HOME": "/home/ec2-user",
"LANG": "C.UTF-8",
"LC_ADDRESS": "C.UTF-8",
"LC_IDENTIFICATION": "C.UTF-8",
"LC_MEASUREMENT": "C.UTF-8",
"LC_MONETARY": "C.UTF-8",
"LC_NAME": "C.UTF-8",
"LC_NUMERIC": "C.UTF-8",
"LC_PAPER": "C.UTF-8",
"LC_TELEPHONE": "C.UTF-8",
"LC_TIME": "C.UTF-8",
"LESSOPEN": "||/usr/bin/lesspipe.sh %s",
"LOGNAME": "ec2-user",
"LS_COLORS": "rs=0:di=38;5;27:ln=38;5;51:mh=44;38;5;15:pi=40;38;5;11:so=38;5;13:do=38;5;5:bd=48;5;232;38;5;11:cd=48;5;232;38;5;3:or=48;5;232;38;5;9:mi=05;48;5;232;38;5;15:su=48;5;196;38;5;15:sg=48;5;11;38;5;16:ca=48;5;196;38;5;226:tw=48;5;10;38;5;16:ow=48;5;10;38;5;21:st=48;5;21;38;5;15:ex=38;5;34:*.tar=38;5;9:*.tgz=38;5;9:*.arc=38;5;9:*.arj=38;5;9:*.taz=38;5;9:*.lha=38;5;9:*.lz4=38;5;9:*.lzh=38;5;9:*.lzma=38;5;9:*.tlz=38;5;9:*.txz=38;5;9:*.tzo=38;5;9:*.t7z=38;5;9:*.zip=38;5;9:*.z=38;5;9:*.Z=38;5;9:*.dz=38;5;9:*.gz=38;5;9:*.lrz=38;5;9:*.lz=38;5;9:*.lzo=38;5;9:*.xz=38;5;9:*.bz2=38;5;9:*.bz=38;5;9:*.tbz=38;5;9:*.tbz2=38;5;9:*.tz=38;5;9:*.deb=38;5;9:*.rpm=38;5;9:*.jar=38;5;9:*.war=38;5;9:*.ear=38;5;9:*.sar=38;5;9:*.rar=38;5;9:*.alz=38;5;9:*.ace=38;5;9:*.zoo=38;5;9:*.cpio=38;5;9:*.7z=38;5;9:*.rz=38;5;9:*.cab=38;5;9:*.jpg=38;5;13:*.jpeg=38;5;13:*.gif=38;5;13:*.bmp=38;5;13:*.pbm=38;5;13:*.pgm=38;5;13:*.ppm=38;5;13:*.tga=38;5;13:*.xbm=38;5;13:*.xpm=38;5;13:*.tif=38;5;13:*.tiff=38;5;13:*.png=38;5;13:*.svg=38;5;13:*.svgz=38;5;13:*.mng=38;5;13:*.pcx=38;5;13:*.mov=38;5;13:*.mpg=38;5;13:*.mpeg=38;5;13:*.m2v=38;5;13:*.mkv=38;5;13:*.webm=38;5;13:*.ogm=38;5;13:*.mp4=38;5;13:*.m4v=38;5;13:*.mp4v=38;5;13:*.vob=38;5;13:*.qt=38;5;13:*.nuv=38;5;13:*.wmv=38;5;13:*.asf=38;5;13:*.rm=38;5;13:*.rmvb=38;5;13:*.flc=38;5;13:*.avi=38;5;13:*.fli=38;5;13:*.flv=38;5;13:*.gl=38;5;13:*.dl=38;5;13:*.xcf=38;5;13:*.xwd=38;5;13:*.yuv=38;5;13:*.cgm=38;5;13:*.emf=38;5;13:*.axv=38;5;13:*.anx=38;5;13:*.ogv=38;5;13:*.ogx=38;5;13:*.aac=38;5;45:*.au=38;5;45:*.flac=38;5;45:*.mid=38;5;45:*.midi=38;5;45:*.mka=38;5;45:*.mp3=38;5;45:*.mpc=38;5;45:*.ogg=38;5;45:*.ra=38;5;45:*.wav=38;5;45:*.axa=38;5;45:*.oga=38;5;45:*.spx=38;5;45:*.xspf=38;5;45:",
"MAIL": "/var/mail/ec2-user",
"PATH": "/usr/local/bin:/usr/bin",
"PWD": "/home/ec2-user",
"SHELL": "/bin/bash",
"SHLVL": "2",
"SSH_CLIENT": "18.162.41.145 50404 22",
"SSH_CONNECTION": "18.162.41.145 50404 10.32.1.186 22",
"SSH_TTY": "/dev/pts/0",
"TERM": "xterm-256color",
"USER": "ec2-user",
"XDG_RUNTIME_DIR": "/run/user/1000",
"XDG_SESSION_ID": "34",
"_": "/usr/bin/python"
},
"eth0": {
"active": true,
"device": "eth0",
"features": {
"esp_hw_offload": "off [fixed]",
"esp_tx_csum_hw_offload": "off [fixed]",
"fcoe_mtu": "off [fixed]",
"generic_receive_offload": "on",
"generic_segmentation_offload": "on",
"highdma": "on",
"hw_tc_offload": "off [fixed]",
"l2_fwd_offload": "off [fixed]",
"large_receive_offload": "off [fixed]",
"loopback": "off [fixed]",
"macsec_hw_offload": "off [fixed]",
"netns_local": "off [fixed]",
"ntuple_filters": "off [fixed]",
"receive_hashing": "on",
"rx_all": "off [fixed]",
"rx_checksumming": "off [fixed]",
"rx_fcs": "off [fixed]",
"rx_gro_hw": "off [fixed]",
"rx_gro_list": "off",
"rx_udp_tunnel_port_offload": "off [fixed]",
"rx_vlan_filter": "off [fixed]",
"rx_vlan_offload": "off [fixed]",
"rx_vlan_stag_filter": "off [fixed]",
"rx_vlan_stag_hw_parse": "off [fixed]",
"scatter_gather": "on",
"tcp_segmentation_offload": "off",
"tls_hw_record": "off [fixed]",
"tls_hw_rx_offload": "off [fixed]",
"tls_hw_tx_offload": "off [fixed]",
"tx_checksum_fcoe_crc": "off [fixed]",
"tx_checksum_ip_generic": "off [fixed]",
"tx_checksum_ipv4": "on",
"tx_checksum_ipv6": "off [fixed]",
"tx_checksum_sctp": "off [fixed]",
"tx_checksumming": "on",
"tx_esp_segmentation": "off [fixed]",
"tx_fcoe_segmentation": "off [fixed]",
"tx_gre_csum_segmentation": "off [fixed]",
"tx_gre_segmentation": "off [fixed]",
"tx_gso_list": "off [fixed]",
"tx_gso_partial": "off [fixed]",
"tx_gso_robust": "off [fixed]",
"tx_ipxip4_segmentation": "off [fixed]",
"tx_ipxip6_segmentation": "off [fixed]",
"tx_lockless": "off [fixed]",
"tx_nocache_copy": "off",
"tx_scatter_gather": "on",
"tx_scatter_gather_fraglist": "off [fixed]",
"tx_sctp_segmentation": "off [fixed]",
"tx_tcp6_segmentation": "off [fixed]",
"tx_tcp_ecn_segmentation": "off [fixed]",
"tx_tcp_mangleid_segmentation": "off [fixed]",
"tx_tcp_segmentation": "off [fixed]",
"tx_tunnel_remcsum_segmentation": "off [fixed]",
"tx_udp_segmentation": "off [fixed]",
"tx_udp_tnl_csum_segmentation": "off [fixed]",
"tx_udp_tnl_segmentation": "off [fixed]",
"tx_vlan_offload": "off [fixed]",
"tx_vlan_stag_hw_insert": "off [fixed]",
"udp_fragmentation_offload": "off",
"vlan_challenged": "off [fixed]"
},
"hw_timestamp_filters": [],
"ipv4": {
"address": "10.32.1.186",
"broadcast": "10.32.1.255",
"netmask": "255.255.255.0",
"network": "10.32.1.0"
},
"ipv6": [
{
"address": "fe80::42d:d5ff:fef3:7b08",
"prefix": "64",
"scope": "link"
}
],
"macaddress": "06:2d:d5:f3:7b:08",
"module": "ena",
"mtu": 9001,
"pciid": "0000:00:05.0",
"promisc": false,
"timestamping": [
"tx_software",
"rx_software",
"software"
],
"type": "ether"
},
"fibre_channel_wwn": [],
"fips": false,
"form_factor": "Other",
"fqdn": "ip-10-32-1-186.ap-east-1.compute.internal",
"gather_subset": [
"all"
],
"hostname": "ip-10-32-1-186",
"hostnqn": "",
"interfaces": [
"lo",
"eth0"
],
"is_chroot": true,
"iscsi_iqn": "",
"kernel": "5.10.135-122.509.amzn2.x86_64",
"kernel_version": "#1 SMP Thu Aug 11 22:41:16 UTC 2022",
"lo": {
"active": true,
"device": "lo",
"features": {
"esp_hw_offload": "off [fixed]",
"esp_tx_csum_hw_offload": "off [fixed]",
"fcoe_mtu": "off [fixed]",
"generic_receive_offload": "on",
"generic_segmentation_offload": "on",
"highdma": "on [fixed]",
"hw_tc_offload": "off [fixed]",
"l2_fwd_offload": "off [fixed]",
"large_receive_offload": "off [fixed]",
"loopback": "on [fixed]",
"macsec_hw_offload": "off [fixed]",
"netns_local": "on [fixed]",
"ntuple_filters": "off [fixed]",
"receive_hashing": "off [fixed]",
"rx_all": "off [fixed]",
"rx_checksumming": "on [fixed]",
"rx_fcs": "off [fixed]",
"rx_gro_hw": "off [fixed]",
"rx_gro_list": "off",
"rx_udp_tunnel_port_offload": "off [fixed]",
"rx_vlan_filter": "off [fixed]",
"rx_vlan_offload": "off [fixed]",
"rx_vlan_stag_filter": "off [fixed]",
"rx_vlan_stag_hw_parse": "off [fixed]",
"scatter_gather": "on",
"tcp_segmentation_offload": "on",
"tls_hw_record": "off [fixed]",
"tls_hw_rx_offload": "off [fixed]",
"tls_hw_tx_offload": "off [fixed]",
"tx_checksum_fcoe_crc": "off [fixed]",
"tx_checksum_ip_generic": "on [fixed]",
"tx_checksum_ipv4": "off [fixed]",
"tx_checksum_ipv6": "off [fixed]",
"tx_checksum_sctp": "on [fixed]",
"tx_checksumming": "on",
"tx_esp_segmentation": "off [fixed]",
"tx_fcoe_segmentation": "off [fixed]",
"tx_gre_csum_segmentation": "off [fixed]",
"tx_gre_segmentation": "off [fixed]",
"tx_gso_list": "off [fixed]",
"tx_gso_partial": "off [fixed]",
"tx_gso_robust": "off [fixed]",
"tx_ipxip4_segmentation": "off [fixed]",
"tx_ipxip6_segmentation": "off [fixed]",
"tx_lockless": "on [fixed]",
"tx_nocache_copy": "off [fixed]",
"tx_scatter_gather": "on [fixed]",
"tx_scatter_gather_fraglist": "on [fixed]",
"tx_sctp_segmentation": "on",
"tx_tcp6_segmentation": "on",
"tx_tcp_ecn_segmentation": "on",
"tx_tcp_mangleid_segmentation": "on",
"tx_tcp_segmentation": "on",
"tx_tunnel_remcsum_segmentation": "off [fixed]",
"tx_udp_segmentation": "off [fixed]",
"tx_udp_tnl_csum_segmentation": "off [fixed]",
"tx_udp_tnl_segmentation": "off [fixed]",
"tx_vlan_offload": "off [fixed]",
"tx_vlan_stag_hw_insert": "off [fixed]",
"udp_fragmentation_offload": "off",
"vlan_challenged": "on [fixed]"
},
"hw_timestamp_filters": [],
"ipv4": {
"address": "127.0.0.1",
"broadcast": "host",
"netmask": "255.0.0.0",
"network": "127.0.0.0"
},
"ipv6": [
{
"address": "::1",
"prefix": "128",
"scope": "host"
}
],
"mtu": 65536,
"promisc": false,
"timestamping": [
"tx_software",
"rx_software",
"software"
],
"type": "loopback"
},
"lsb": {},
"machine": "x86_64",
"machine_id": "ec2a0c93cafdf59f762c6748bad6ea6e",
"memfree_mb": 578,
"memory_mb": {
"nocache": {
"free": 794,
"used": 146
},
"real": {
"free": 578,
"total": 940,
"used": 362
},
"swap": {
"cached": 0,
"free": 0,
"total": 0,
"used": 0
}
},
"memtotal_mb": 940,
"module_setup": true,
"mounts": [
{
"block_available": 1668655,
"block_size": 4096,
"block_total": 2094075,
"block_used": 425420,
"device": "/dev/nvme0n1p1",
"fstype": "xfs",
"inode_available": 4145004,
"inode_total": 4193216,
"inode_used": 48212,
"mount": "/",
"options": "rw,noatime,attr2,inode64,logbufs=8,logbsize=32k,noquota",
"size_available": 6834810880,
"size_total": 8577331200,
"uuid": "2318d4b7-b8cd-4579-ab46-47af13e15000"
}
],
"nodename": "ip-10-32-1-186.ap-east-1.compute.internal",
"os_family": "RedHat",
"pkg_mgr": "yum",
"proc_cmdline": {
"BOOT_IMAGE": "/boot/vmlinuz-5.10.135-122.509.amzn2.x86_64",
"biosdevname": "0",
"console": [
"tty0",
"ttyS0,115200n8"
],
"net.ifnames": "0",
"nvme_core.io_timeout": "4294967295",
"rd.emergency": "poweroff",
"rd.shell": "0",
"ro": true,
"root": "UUID=2318d4b7-b8cd-4579-ab46-47af13e15000"
},
"processor": [
"0",
"GenuineIntel",
"Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz",
"1",
"GenuineIntel",
"Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz"
],
"processor_cores": 1,
"processor_count": 1,
"processor_threads_per_core": 2,
"processor_vcpus": 2,
"product_name": "t3.micro",
"product_serial": "NA",
"product_uuid": "NA",
"product_version": "NA",
"python": {
"executable": "/usr/bin/python",
"has_sslcontext": true,
"type": "CPython",
"version": {
"major": 2,
"micro": 18,
"minor": 7,
"releaselevel": "final",
"serial": 0
},
"version_info": [
2,
7,
18,
"final",
0
]
},
"python_version": "2.7.18",
"real_group_id": 1000,
"real_user_id": 1000,
"selinux": {
"status": "Missing selinux Python library"
},
"selinux_python_present": false,
"service_mgr": "systemd",
"ssh_host_key_ecdsa_public": "AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBMQHztuwL47pwpF7HDjl61XRcALUQSBkQB+xJhMA5m7+z0CZxtyY1W93Jz7YcFEbYuGNzbnb51i67iTOG+0+oOs=",
"ssh_host_key_ed25519_public": "AAAAC3NzaC1lZDI1NTE5AAAAIGctEOyP5SdD+z5uIV/UPvpn8e2cbgw0zNjFegk8haAf",
"ssh_host_key_rsa_public": "AAAAB3NzaC1yc2EAAAADAQABAAABAQC+oJTDejKkf4IX/+vwayNQ3OSD+HwRnDIQT73cbZsDpMo0Hnl2ORwVxwCibih2nTc9VrF839ItfP8NBIQHADFz6EqAMJQ+qyMMy5Vlm+w1AajSNk7SxZEfGqo4w8bbXnLgmWmCk5Q5lhzIXvwsECnLs98Ld3tGSKqHgCJLJ1qec/UNa4NGoyey+0wwAvUfjAInjUWE20U5ZHAq7Ji8fxo6Ws6hZ0tgy/XZ5EkqV0jVwqzsCl6eQH11q/Dm9N+YetNr5oJrIH/R5syiSc6ChgFjXBhjoonf5YzUuPoPdXqR6y8snuuZKGIadG3a72G0pZbpx5u97bQZODwcC267NG+v",
"swapfree_mb": 0,
"swaptotal_mb": 0,
"system": "Linux",
"system_capabilities": [
""
],
"system_capabilities_enforced": "True",
"system_vendor": "Amazon EC2",
"uptime_seconds": 11454,
"user_dir": "/home/ec2-user",
"user_gecos": "EC2 Default User",
"user_gid": 1000,
"user_id": "ec2-user",
"user_shell": "/bin/bash",
"user_uid": 1000,
"userspace_architecture": "x86_64",
"userspace_bits": "64",
"virtualization_role": "guest",
"virtualization_type": "kvm"
}
}
PLAY RECAP *********************************************************************
16.163.95.41 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Chúng ta có thể lấy được python_version với việc chúng ta sửa lại file Playbook như sau:
---
- hosts: webserver
gather_facts: true
tasks:
- name: "Show ansiblr Facts"
debug:
var: ansible_facts['python_version']
và đây là kết quả:
bài viết lần này của mình tạm dừng ở đây, hy vọng khi bạn làm theo những bước mình đã viết, bạn có thể hiểu được phần nào về biến trong Ansible, học phải đi đôi với hành đúng k nào!!!!