āĻ°āĻŋāĻŽā§āĻ āĻšā§āĻ¸ā§āĻā§ SSH āĻ¸āĻāĻ¯ā§āĻā§āĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§ āĻāĻ¤ā§āĻ¤āĻ°āĻ¯ā§āĻā§āĻ¯ āĻāĻžāĻ āĻāĻ°ā§āĨ¤ āĻāĻāĻŋ āĻāĻāĻāĻŋ SSH āĻ¸ā§āĻļāĻ¨ āĻā§āĻ˛ā§, āĻ˛āĻ āĻāĻ¨ āĻāĻ°ā§, āĻ¨ā§āĻāĻāĻ¯āĻŧāĻžāĻ°ā§āĻā§ āĻĒāĻžāĻāĻĨāĻ¨ āĻā§āĻĄ āĻāĻĒāĻŋ āĻāĻ°ā§ āĻāĻŦāĻ āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻĒā§āĻĨāĻ āĻ āĻ¸ā§āĻĨāĻžāĻ¯āĻŧā§ āĻĢāĻžāĻāĻ˛ā§ āĻ˛ā§āĻā§āĨ¤ āĻāĻ° āĻĒāĻ°ā§, āĻāĻāĻŋ āĻ°āĻŋāĻŽā§āĻ āĻŽā§āĻļāĻŋāĻ¨ā§ āĻāĻ āĻĢāĻžāĻāĻ˛āĻāĻŋ āĻāĻžāĻ˛āĻžāĻ¯āĻŧāĨ¤ āĻ āĻĒāĻžāĻ°ā§āĻļāĻ¨ā§āĻ° āĻāĻ āĻĒā§āĻ°ā§ āĻā§āĻ°āĻŽāĻāĻŋ āĻŦā§āĻļ āĻĻā§āĻ°ā§āĻ āĻāĻŦāĻ āĻā§āĻ˛āĻžāĻ¨ā§āĻ¤āĻŋāĻāĻ°, āĻ¤āĻžāĻ āĻāĻāĻŋāĻā§ āĻ āĻĒā§āĻāĻŋāĻŽāĻžāĻāĻ āĻāĻ°āĻžāĻ° āĻŦāĻŋāĻāĻŋāĻ¨ā§āĻ¨ āĻāĻĒāĻžāĻ¯āĻŧ āĻ°āĻ¯āĻŧā§āĻā§āĨ¤
āĻāĻ āĻāĻĒāĻžāĻ¯āĻŧ āĻāĻ requiretty
āĻāĻĒāĻ¨āĻžāĻ° āĻŽāĻ§ā§āĻ¯ā§ sudo āĻāĻ¨ā§āĻ¯ āĻ¸ā§āĻāĻŋāĻ /etc/sudoers
āĻ°āĻŋāĻŽā§āĻ āĻŽā§āĻļāĻŋāĻ¨ā§ āĻĢāĻžāĻāĻ˛)
Ansible āĻāĻāĻžāĻ°āĻā§āĻ˛āĻ āĻāĻ°āĻžāĻ° āĻāĻāĻāĻŋ āĻ¨āĻ¤ā§āĻ¨ āĻāĻĒāĻžāĻ¯āĻŧ āĻšāĻ˛ āĻāĻāĻāĻŋ āĻĒāĻžāĻāĻĨāĻ¨ āĻ˛āĻžāĻāĻŦā§āĻ°ā§āĻ°āĻŋ
āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻ āĻĒāĻ°āĻŋāĻ¸ā§āĻĨāĻŋāĻ¤āĻŋāĻ¤ā§ Mitogen āĻāĻĒāĻ¨āĻžāĻ° āĻāĻ¤ā§āĻ¤āĻ°āĻ¯ā§āĻā§āĻ¯ āĻā§āĻĄāĻā§ āĻāĻ¯āĻŧā§āĻāĻŦāĻžāĻ° āĻāĻ¤āĻŋ āĻŦāĻžāĻĄāĻŧāĻžāĻ¤ā§ āĻĒāĻžāĻ°ā§ āĻāĻŦāĻ āĻāĻ˛ā§āĻ˛ā§āĻāĻ¯ā§āĻā§āĻ¯āĻāĻžāĻŦā§ āĻā§āĻ°āĻžāĻĢāĻŋāĻ āĻāĻ°āĻ āĻāĻŽāĻžāĻ¤ā§ āĻĒāĻžāĻ°ā§āĨ¤ āĻāĻ¸ā§āĻ¨ āĻ¸āĻ°ā§āĻŦāĻžāĻ§āĻŋāĻ āĻāĻ¨āĻĒā§āĻ°āĻŋāĻ¯āĻŧ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°ā§āĻ° āĻā§āĻˇā§āĻ¤ā§āĻ°ā§ āĻĒāĻ°ā§āĻā§āĻˇāĻž āĻāĻ°ā§ āĻĻā§āĻāĻŋ āĻāĻŦāĻ āĻāĻāĻŋ āĻāĻŽāĻžāĻĻā§āĻ° āĻāĻ¤āĻāĻž āĻ¸āĻžāĻšāĻžāĻ¯ā§āĻ¯ āĻāĻ°ā§ āĻ¤āĻž āĻĻā§āĻā§āĻ¨āĨ¤
āĻāĻŽāĻŋ āĻ¸āĻŦāĻā§āĻ¯āĻŧā§ āĻŦā§āĻļāĻŋ Ansible āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻŋ: āĻĻā§āĻ°āĻŦāĻ°ā§āĻ¤ā§ āĻŽā§āĻļāĻŋāĻ¨ā§ āĻāĻ¨āĻĢāĻŋāĻāĻžāĻ°ā§āĻļāĻ¨ āĻĢāĻžāĻāĻ˛ āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻž, āĻĒā§āĻ¯āĻžāĻā§āĻ āĻāĻ¨āĻ¸ā§āĻāĻ˛ āĻāĻ°āĻž, āĻ°āĻŋāĻŽā§āĻ āĻŽā§āĻļāĻŋāĻ¨ā§ āĻāĻŦāĻ āĻĨā§āĻā§ āĻĢāĻžāĻāĻ˛ āĻāĻĒāĻŋ āĻāĻ°āĻžāĨ¤ āĻ¸āĻŽā§āĻāĻŦāĻ¤ āĻāĻĒāĻ¨āĻžāĻ° āĻ āĻ¨ā§āĻ¯āĻžāĻ¨ā§āĻ¯ āĻāĻĻāĻžāĻšāĻ°āĻŖ āĻāĻā§ - āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯ā§ āĻ˛āĻŋāĻā§āĻ¨āĨ¤
āĻāĻ˛ āĻ¯āĻžāĻ!
Ansible āĻāĻ° āĻāĻ¨ā§āĻ¯ Mitogen āĻāĻ¨āĻĢāĻŋāĻāĻžāĻ°ā§āĻļāĻ¨ āĻā§āĻŦāĻ āĻ¸āĻšāĻ:
Mitogen āĻ˛āĻžāĻāĻŦā§āĻ°ā§āĻ°āĻŋ āĻāĻ¨āĻ¸ā§āĻāĻ˛ āĻāĻ°ā§āĻ¨:
pip install mitogen
āĻāĻāĻ¨ āĻĻā§āĻāĻŋ āĻ¸āĻŽāĻ¤ā§āĻ˛ā§āĻ¯ āĻāĻĒāĻžāĻ¯āĻŧ āĻāĻā§ - āĻšāĻ¯āĻŧ ansible.cfg āĻāĻ¨āĻĢāĻŋāĻāĻžāĻ°ā§āĻļāĻ¨ āĻĢāĻžāĻāĻ˛ā§āĻ° āĻŦāĻŋāĻāĻ˛ā§āĻĒāĻā§āĻ˛āĻŋ āĻāĻ¨āĻĢāĻŋāĻāĻžāĻ° āĻāĻ°ā§āĻ¨, āĻ āĻĨāĻŦāĻž āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨ā§āĻ¯āĻŧ āĻĒāĻ°āĻŋāĻŦā§āĻļ āĻā§āĻ°āĻŋāĻ¯āĻŧā§āĻŦāĻ˛ āĻ¸ā§āĻ āĻāĻ°ā§āĻ¨āĨ¤
āĻ
āĻ¨ā§āĻŽāĻžāĻ¨ āĻāĻ°āĻž āĻ¯āĻžāĻ āĻāĻ¨āĻ¸ā§āĻāĻ˛ āĻāĻ°āĻž Mitogen āĻāĻ° āĻĒāĻĨ āĻšāĻŦā§ /usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy
. āĻ¤āĻžāĻ°āĻĒāĻ°:
export ANSIBLE_STRATEGY_PLUGINS=/usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy
export ANSIBLE_STRATEGY=mitogen_linear
āĻŦāĻž
[defaults]
strategy = mitogen_linear
strategy_plugins = /usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy
āĻŽāĻŋāĻā§āĻā§āĻ¨ āĻ¸āĻš āĻāĻŦāĻ āĻāĻžāĻĄāĻŧāĻž āĻāĻžāĻ°ā§āĻā§āĻ¯āĻŧāĻžāĻ˛ā§āĻ¨āĻ-āĻ Ansible āĻāĻ¨āĻ¸ā§āĻāĻ˛ āĻāĻ°āĻž āĻ¯āĻžāĻ:
virtualenv mitogen_ansible
./mitogen_ansible/bin/pip install ansible==2.7.10 mitogen
virtualenv pure_ansible
./pure_ansible/bin/pip install ansible==2.7.10
āĻ āĻ¨ā§āĻā§āĻ°āĻš āĻāĻ°ā§ āĻŽāĻ¨ā§ āĻ°āĻžāĻāĻŦā§āĻ¨ Mitogen 0.2.7 Ansible 2.8 āĻāĻ° āĻ¸āĻžāĻĨā§ āĻāĻžāĻ āĻāĻ°ā§ āĻ¨āĻž (āĻŽā§ 2019 āĻ āĻ¨ā§āĻ¯āĻžāĻ¯āĻŧā§)
āĻāĻĒāĻ¨āĻžāĻŽ āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻž:
alias pure-ansible-playbook='$(pwd)/pure_ansible/bin/ansible-playbook'
alias mitogen-ansible-playbook='ANSIBLE_STRATEGY_PLUGINS=$(pwd)/mitogen_ansible/lib/python3.7/site-packages/ansible_mitogen/plugins/strategy ANSIBLE_STRATEGY=mitogen_linear $(pwd)/mitogen_ansible/bin/ansible-playbook'
āĻāĻāĻ¨ āĻāĻ¸ā§āĻ¨ āĻāĻāĻāĻŋ āĻĒā§āĻ˛ā§āĻŦā§āĻ āĻāĻžāĻ˛āĻžāĻ¨ā§āĻ° āĻā§āĻˇā§āĻāĻž āĻāĻ°āĻŋ āĻ¯āĻž āĻāĻāĻāĻŋ āĻĻā§āĻ°āĻŦāĻ°ā§āĻ¤ā§ āĻŽā§āĻļāĻŋāĻ¨ā§ āĻĢāĻžāĻāĻ˛ āĻ¤ā§āĻ°āĻŋ āĻāĻ°ā§:
---
- hosts: all
gather_facts: false
tasks:
- name: Create files with copy content module
copy:
content: |
test file {{ item }}
dest: ~/file_{{ item }}
with_sequence: start=1 end={{ n }}
āĻāĻŦāĻ 10āĻāĻŋ āĻĢāĻžāĻāĻ˛ āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻ¤ā§ Mitogen āĻāĻ° āĻ¸āĻžāĻĨā§ āĻāĻŦāĻ āĻāĻžāĻĄāĻŧāĻžāĻ āĻāĻāĻŋ āĻāĻžāĻ˛āĻžāĻ:
time mitogen-ansible-playbook file_creation.yml -i hosts -e n=10 &>/dev/null
real 0m2.603s
user 0m1.152s
sys 0m0.096s
time pure-ansible-playbook file_creation.yml -i hosts -e n=10 &>/dev/null
real 0m5.908s
user 0m1.745s
sys 0m0.643s
āĻāĻŽāĻ°āĻž āĻāĻāĻāĻŋ 2-āĻā§āĻŖ āĻāĻ¨ā§āĻ¨āĻ¤āĻŋ āĻĻā§āĻāĻ¤ā§. āĻāĻ¸ā§āĻ¨ 20, 30, ..., 100 āĻĢāĻžāĻāĻ˛āĻā§āĻ˛āĻŋ āĻĒāĻ°ā§āĻā§āĻˇāĻž āĻāĻ°āĻŋ:
time pure-ansible-playbook file_creation.yml -i hosts -e n=100 &>/dev/null
real 0m51.775s
user 0m8.039s
sys 0m6.305s
time mitogen-ansible-playbook file_creation.yml -i hosts -e n=100 &>/dev/null
real 0m4.331s
user 0m1.903s
sys 0m0.197s
āĻĢāĻ˛āĻ¸ā§āĻŦāĻ°ā§āĻĒ, āĻāĻŽāĻ°āĻž 10 āĻā§āĻŖā§āĻ°āĻ āĻŦā§āĻļāĻŋ āĻŽā§āĻ¤ā§āĻ¯ā§āĻĻāĻŖā§āĻĄ āĻāĻžāĻ°ā§āĻ¯āĻāĻ° āĻāĻ°ā§āĻāĻŋ!
āĻāĻāĻ¨ āĻŦāĻŋāĻāĻŋāĻ¨ā§āĻ¨ āĻĒāĻ°āĻŋāĻ¸ā§āĻĨāĻŋāĻ¤āĻŋāĻ¤ā§ āĻā§āĻˇā§āĻāĻž āĻāĻ°āĻž āĻ¯āĻžāĻ āĻāĻŦāĻ āĻāĻŽāĻžāĻĻā§āĻ° āĻāĻ¨ā§āĻ¯ āĻ¸āĻŦāĻāĻŋāĻā§ āĻāĻ¤ āĻĻā§āĻ°ā§āĻ¤ āĻāĻžāĻ āĻāĻ°ā§ āĻĻā§āĻā§āĻ¨:
-
āĻ¸ā§āĻĨāĻžāĻ¨ā§āĻ¯āĻŧ āĻĨā§āĻā§ āĻāĻāĻāĻŋ āĻĻā§āĻ°āĻŦāĻ°ā§āĻ¤ā§ āĻšā§āĻ¸ā§āĻā§ āĻĢāĻžāĻāĻ˛ āĻ āĻ¨ā§āĻ˛āĻŋāĻĒāĻŋ āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻ¸ā§āĻā§āĻ°āĻŋāĻĒā§āĻ (āĻŽāĻĄāĻŋāĻāĻ˛ āĻ¸āĻš
copy
):
-
āĻāĻ° āĻ¸āĻžāĻĨā§ āĻāĻāĻāĻŋ āĻĻā§āĻ°āĻŦāĻ°ā§āĻ¤ā§ āĻšā§āĻ¸ā§āĻā§ āĻĢāĻžāĻāĻ˛ āĻ¤ā§āĻ°āĻŋāĻ° āĻāĻ¨ā§āĻ¯ āĻ¸ā§āĻā§āĻ°āĻŋāĻĒā§āĻ
copy
āĻŽāĻĄāĻŋāĻāĻ˛:
-
āĻĻā§āĻ°āĻŦāĻ°ā§āĻ¤ā§ āĻšā§āĻ¸ā§āĻ āĻĨā§āĻā§ āĻ¸ā§āĻĨāĻžāĻ¨ā§āĻ¯āĻŧ āĻāĻāĻāĻŋāĻ¤ā§ āĻĢāĻžāĻāĻ˛ āĻĄāĻžāĻāĻ¨āĻ˛ā§āĻĄ āĻāĻ°āĻžāĻ° āĻĻā§āĻļā§āĻ¯:
āĻāĻ¸ā§āĻ¨ āĻŦā§āĻļ āĻāĻ¯āĻŧā§āĻāĻāĻŋ (3) āĻĻā§āĻ°āĻŦāĻ°ā§āĻ¤ā§ āĻŽā§āĻļāĻŋāĻ¨ā§āĻ° āĻ¸āĻžāĻĨā§ āĻāĻāĻāĻŋ āĻĻā§āĻļā§āĻ¯ā§āĻ° āĻā§āĻˇā§āĻāĻž āĻāĻ°āĻŋ, āĻāĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§āĻĒ āĻāĻāĻāĻŋ āĻĻā§āĻ°āĻŦāĻ°ā§āĻ¤ā§ āĻšā§āĻ¸ā§āĻā§ āĻĢāĻžāĻāĻ˛āĻā§āĻ˛āĻŋ āĻ
āĻ¨ā§āĻ˛āĻŋāĻĒāĻŋ āĻāĻ°āĻžāĻ° āĻāĻāĻāĻŋ āĻĻā§āĻļā§āĻ¯:
āĻāĻĒāĻ¨āĻŋ āĻĻā§āĻāĻ¤ā§ āĻĒāĻžāĻā§āĻā§āĻ¨, āĻāĻ āĻĒāĻ°āĻŋāĻ¸ā§āĻĨāĻŋāĻ¤āĻŋāĻ¤ā§ āĻŽāĻžāĻāĻā§āĻā§āĻ¨ āĻāĻŽāĻžāĻĻā§āĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻāĻŦāĻ āĻā§āĻ°ā§āĻ¯āĻžāĻĢāĻŋāĻ āĻāĻāĻ¯āĻŧāĻ āĻŦāĻžāĻāĻāĻžāĻ¯āĻŧāĨ¤ āĻāĻŋāĻ¨ā§āĻ¤ā§ āĻ¯āĻĻāĻŋ āĻŦāĻŋāĻĒāĻ¤ā§āĻ¤āĻŋāĻāĻŋ āĻāĻ¤ā§āĻ¤āĻ°āĻ¯ā§āĻā§āĻ¯ āĻ¨āĻž āĻšāĻ¯āĻŧ, āĻāĻŋāĻ¨ā§āĻ¤ā§ āĻāĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§āĻĒ āĻāĻāĻāĻŋ āĻĄāĻŋāĻ¸ā§āĻ āĻŦāĻž āĻ¨ā§āĻāĻāĻ¯āĻŧāĻžāĻ°ā§āĻā§āĻ° I/O, āĻŦāĻž āĻ āĻ¨ā§āĻ¯ āĻā§āĻĨāĻžāĻ, āĻ¤āĻžāĻšāĻ˛ā§ āĻāĻļāĻž āĻāĻ°āĻž āĻāĻ āĻŋāĻ¨ āĻ¯ā§ Mitogen āĻāĻŽāĻžāĻĻā§āĻ° āĻ¸āĻžāĻšāĻžāĻ¯ā§āĻ¯ āĻāĻ°āĻŦā§āĨ¤
āĻĒāĻŋāĻĒ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§ yum/dnf āĻāĻŦāĻ āĻĒāĻžāĻāĻĨāĻ¨ āĻŽāĻĄāĻŋāĻāĻ˛ āĻ¸āĻš āĻĒā§āĻ¯āĻžāĻā§āĻ āĻāĻ¨āĻ¸ā§āĻāĻ˛ āĻāĻ°āĻžāĻ° āĻ¸āĻžāĻĨā§ āĻāĻāĻāĻŋ āĻ¸ā§āĻā§āĻ°āĻŋāĻĒā§āĻ āĻā§āĻˇā§āĻāĻž āĻāĻ°āĻž āĻ¯āĻžāĻāĨ¤ āĻĒā§āĻ¯āĻžāĻā§āĻāĻā§āĻ˛āĻŋ āĻā§āĻ¯āĻžāĻļā§ āĻāĻ°āĻž āĻšāĻ¯āĻŧā§āĻāĻŋāĻ˛ āĻ¯āĻžāĻ¤ā§ āĻ¨ā§āĻāĻāĻ¯āĻŧāĻžāĻ°ā§āĻ āĻā§āĻ˛āĻŋāĻā§āĻ° āĻāĻĒāĻ° āĻ¨āĻŋāĻ°ā§āĻāĻ° āĻ¨āĻž āĻāĻ°ā§:
---
- hosts: all
gather_facts: false
tasks:
- name: Install packages
become: true
package:
name:
- samba
- httpd
- nano
- ruby
state: present
- name: Install pip modules
become: true
pip:
name:
- pytest-split-tests
- bottle
- pep8
- flask
state: present
āĻŽāĻžāĻāĻā§āĻā§āĻ¨ā§āĻ° āĻ¸āĻžāĻĨā§ āĻāĻāĻŋ 12 āĻ¸ā§āĻā§āĻ¨ā§āĻĄ āĻ¸āĻŽāĻ¯āĻŧ āĻ¨ā§āĻ¯āĻŧ, āĻāĻāĻŋ āĻāĻžāĻĄāĻŧāĻžāĻāĨ¤
āĻĒā§āĻˇā§āĻ āĻžāĻ¯āĻŧ
āĻŽāĻžāĻāĻā§āĻā§āĻ¨ āĻŽāĻĄāĻŋāĻāĻ˛ āĻāĻ˛āĻžāĻāĻžāĻ˛ā§āĻ¨ āĻāĻ¤āĻŋ āĻŦāĻžāĻĄāĻŧāĻžāĻ¤ā§ āĻĒāĻžāĻ°ā§ āĻ¨āĻžāĨ¤ āĻāĻāĻŋ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻāĻ āĻŽāĻĄāĻŋāĻāĻ˛āĻāĻŋ āĻ¯āĻ¤ āĻĻā§āĻ°ā§āĻ¤ āĻ¸āĻŽā§āĻāĻŦ āĻ¸āĻŽā§āĻĒāĻžāĻĻāĻ¨ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§āĨ¤
āĻ āĻ¤āĻāĻŦ, āĻāĻĒāĻ¨āĻžāĻ° āĻ¸ā§āĻĨāĻžāĻĒāĻ¨āĻžāĻ¯āĻŧ āĻāĻĒāĻ¨āĻžāĻ° āĻŦāĻžāĻ§āĻžāĻā§āĻ˛āĻŋ āĻā§āĻāĻā§ āĻŦā§āĻ° āĻāĻ°āĻž āĻā§āĻ°ā§āĻ¤ā§āĻŦāĻĒā§āĻ°ā§āĻŖ āĻāĻŦāĻ āĻ¯āĻĻāĻŋ āĻ¸ā§āĻā§āĻ˛āĻŋ āĻāĻ¤ā§āĻ¤āĻ°āĻ¯ā§āĻā§āĻ¯āĻ¤āĻžāĻ° āĻāĻžāĻ°āĻŖā§ āĻšāĻ¯āĻŧ, āĻ¤āĻŦā§ Mitogen āĻāĻĒāĻ¨āĻžāĻā§ āĻ¸ā§āĻā§āĻ˛āĻŋ āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨ āĻāĻ°āĻ¤ā§ āĻāĻŦāĻ āĻāĻĒāĻ¨āĻžāĻ° āĻĒā§āĻ˛ā§āĻŦā§āĻāĻā§āĻ˛āĻŋāĻ° āĻ¸āĻŽā§āĻĒāĻžāĻĻāĻ¨āĻā§ āĻāĻ˛ā§āĻ˛ā§āĻāĻ¯ā§āĻā§āĻ¯āĻāĻžāĻŦā§ āĻ¤ā§āĻŦāĻ°āĻžāĻ¨ā§āĻŦāĻŋāĻ¤ āĻāĻ°āĻ¤ā§ āĻ¸āĻšāĻžāĻ¯āĻŧāĻ¤āĻž āĻāĻ°āĻŦā§āĨ¤
āĻāĻ¤ā§āĻ¸: www.habr.com