# πŸ” Руководство ΠΏΠΎ Π»ΠΈΠ½Ρ‚ΠΈΠ½Π³Ρƒ Ρ€ΠΎΠ»Π΅ΠΉ ## Автор Π‘Π΅Ρ€Π³Π΅ΠΉ Антропов Π‘Π°ΠΉΡ‚: https://devops.org.ru ## ΠžΠ±Π·ΠΎΡ€ Π›ΠΈΠ½Ρ‚ΠΈΠ½Π³ Ρ€ΠΎΠ»Π΅ΠΉ - это автоматичСская ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° синтаксиса, стиля ΠΈ соотвСтствия Π»ΡƒΡ‡ΡˆΠΈΠΌ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ°ΠΌ Ansible. Π’ AnsibleTemplate ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ `ansible-lint` для обСспСчСния качСства ΠΊΠΎΠ΄Π°. ## ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ Π»ΠΈΠ½Ρ‚ΠΈΠ½Π³Π° ### ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° всСх Ρ€ΠΎΠ»Π΅ΠΉ ```bash make role lint ``` - ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅Ρ‚ всС Ρ€ΠΎΠ»ΠΈ Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ `roles/` - Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ ΠΈΠ· `.ansible-lint` - ΠŸΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ всС Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹Π΅ ошибки ΠΈ прСдупрСТдСния ### ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ Ρ€ΠΎΠ»ΠΈ ```bash make role lint devops make role lint ping ``` - ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡƒΠΊΠ°Π·Π°Π½Π½ΡƒΡŽ Ρ€ΠΎΠ»ΡŒ - АвтоматичСски Π²Π°Π»ΠΈΠ΄ΠΈΡ€ΡƒΠ΅Ρ‚ сущСствованиС Ρ€ΠΎΠ»ΠΈ - ΠŸΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ доступныС Ρ€ΠΎΠ»ΠΈ ΠΏΡ€ΠΈ ошибкС ## ΠŸΡ€ΠΎΡ„ΠΈΠ»ΠΈ Π»ΠΈΠ½Ρ‚ΠΈΠ½Π³Π° Ansible-lint ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ нСсколько ΠΏΡ€ΠΎΡ„ΠΈΠ»Π΅ΠΉ для Ρ€Π°Π·Π½Ρ‹Ρ… ΡƒΡ€ΠΎΠ²Π½Π΅ΠΉ строгости: ### Production (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ) - Π‘Π°ΠΌΡ‹ΠΉ строгий ΠΏΡ€ΠΎΡ„ΠΈΠ»ΡŒ - ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅Ρ‚ всС ΠΏΡ€Π°Π²ΠΈΠ»Π° - РСкомСндуСтся для ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ½ ΠΊΠΎΠ΄Π° ### Basic - Π‘Π°Π·ΠΎΠ²Ρ‹Π΅ ΠΏΡ€Π°Π²ΠΈΠ»Π° - ΠŸΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ - МСнСС строгий Ρ‡Π΅ΠΌ production ### Min - ΠœΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€Π°Π²ΠΈΠ»Π° - Волько ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½Ρ‹Π΅ ошибки - Для быстрой ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ## ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ Π›ΠΈΠ½Ρ‚ΠΈΠ½Π³ настраиваСтся Ρ‡Π΅Ρ€Π΅Π· Ρ„Π°ΠΉΠ» `.ansible-lint`: ```yaml --- # ΠŸΡ€ΠΎΡ„ΠΈΠ»ΡŒ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ profile: production # Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ skip_list: - yaml[line-length] # Π˜ΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ Π΄Π»ΠΈΠ½Ρ‹ строк # Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€Π°Π²ΠΈΠ»Π° enable_list: - name[casing] # Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ имСнования # Π˜Π³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ² exclude_paths: - .cache/ - .github/ - tests/ ``` ## Π’ΠΈΠΏΡ‹ ошибок ### БинтаксичСскиС ошибки - ΠΠ΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ YAML синтаксис - Ошибки Π² Jinja2 ΡˆΠ°Π±Π»ΠΎΠ½Π°Ρ… - ΠΠ΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Π°Ρ структура playbook ### БтилистичСскиС ошибки - Trailing spaces (лишниС ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹) - ΠΠ΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ - ΠΠ΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ### Π›ΡƒΡ‡ΡˆΠΈΠ΅ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ - ИспользованиС ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΡ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ - ΠΠ΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ использованиС become - ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΠΈΠ΅ changed_when для command ## ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ исправлСний ### Trailing spaces ```yaml # ❌ ΠΠ΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ groups: ["sudo", "docker"] # Π›ΠΈΡˆΠ½ΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹ Π² ΠΊΠΎΠ½Ρ†Π΅ строки # βœ… ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ groups: ["sudo", "docker"] ``` ### ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ ```yaml # ❌ ΠΠ΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ #ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ Π±Π΅Π· ΠΏΡ€ΠΎΠ±Π΅Π»Π° # βœ… ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ # ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ с ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠΌ ``` ### Changed when ```yaml # ❌ ΠΠ΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ - name: "ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° статуса" command: "systemctl status nginx" # βœ… ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ - name: "ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° статуса" command: "systemctl status nginx" changed_when: false ``` ## АвтоматичСскоС исправлСниС НСкоторыС ошибки ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ автоматичСски: ```bash # Π˜ΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ trailing spaces sed -i 's/[[:space:]]*$//' roles/*/tasks/*.yml # Π˜ΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ sed -i 's/^#\([^ ]\)/# \1/' roles/*/tasks/*.yml ``` ## Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ с CI/CD Π›ΠΈΠ½Ρ‚ΠΈΠ½Π³ автоматичСски запускаСтся Π² CI/CD ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Π΅: ```yaml # .github/workflows/lint.yml name: Lint on: [push, pull_request] jobs: lint: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Run lint run: make role lint ``` ## Π›ΡƒΡ‡ΡˆΠΈΠ΅ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ ### 1. РСгулярная ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ```bash # ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠΉΡ‚Π΅ ΠΊΠΎΠ΄ ΠΏΠ΅Ρ€Π΅Π΄ ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠΌ make role lint # ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠΉΡ‚Π΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΡƒΡŽ Ρ€ΠΎΠ»ΡŒ ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ make role lint devops ``` ### 2. Π˜ΡΠΏΡ€Π°Π²Π»ΡΠΉΡ‚Π΅ ошибки сразу - НС Π½Π°ΠΊΠ°ΠΏΠ»ΠΈΠ²Π°ΠΉΡ‚Π΅ ошибки - Π˜ΡΠΏΡ€Π°Π²Π»ΡΠΉΡ‚Π΅ ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ обнаруТСния - Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ автоматичСскиС исправлСния ### 3. НастройтС IDE - Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ YAML - НастройтС Π°Π²Ρ‚ΠΎΡ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ - Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ для Ansible ### 4. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ pre-commit hooks ```yaml # .pre-commit-config.yaml repos: - repo: https://github.com/ansible/ansible-lint rev: v6.0.0 hooks: - id: ansible-lint ``` ## УстранСниС Π½Π΅ΠΏΠΎΠ»Π°Π΄ΠΎΠΊ ### Ошибка "Role not found" ```bash ❌ Роль 'nonexistent' Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½Π° Π² roles/ πŸ“‹ ДоступныС Ρ€ΠΎΠ»ΠΈ: - devops - ping ``` **РСшСниС**: ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈΠΌΠ΅Π½ΠΈ Ρ€ΠΎΠ»ΠΈ ### Ошибка "Docker image not found" ```bash Unable to find image 'ansible-controller:latest' locally ``` **РСшСниС**: Π‘ΠΎΠ±Π΅Ρ€ΠΈΡ‚Π΅ Docker ΠΎΠ±Ρ€Π°Π·Ρ‹: ```bash make docker build ``` ### Ошибка "Permission denied" ```bash Permission denied: /workspace/roles/ ``` **РСшСниС**: ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ ΠΏΡ€Π°Π²Π° доступа ΠΊ Ρ„Π°ΠΉΠ»Π°ΠΌ ## Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ рСсурсы - [Ansible Lint Documentation](https://ansible.readthedocs.io/projects/lint/) - [Ansible Best Practices](https://docs.ansible.com/ansible/latest/user_guide/playbooks_best_practices.html) - [YAML Style Guide](https://yaml.org/spec/1.2/spec.html) ## ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Если Ρƒ вас Π²ΠΎΠ·Π½ΠΈΠΊΠ»ΠΈ вопросы ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с Π»ΠΈΠ½Ρ‚ΠΈΠ½Π³ΠΎΠΌ: 1. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ Π²Ρ‹ΡˆΠ΅ 2. ЗапуститС `make role lint` для диагностики 3. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ΡΡŒ ΠΊ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ --- **ПослСднСС ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅**: $(date) **ВСрсия**: 1.0.0