遵循 Ansible 最佳实践可以确保您的代码成功执行,简化故障排除,并对您的自动化之旅产生积极影响。

1. 使用空白字符

在 YAML 代码中使用空格而不是制表符(Tab)。在每个块或任务前添加新行,使 Playbook 更易读。

错误示例:

---
- hosts: all
  tasks:
  - ansible.builtin.yum:
      name: httpd
      state: latest
  - name: end message
    ansible.builtin.debug:
      msg: "httpd successfully installed"

正确示例:

---
- hosts: all
  tasks:
  - ansible.builtin.yum:
      name: httpd
      state: latest

  - name: end message
    ansible.builtin.debug:
      msg: "httpd successfully installed"

2. 为每个步骤指定“name”

为代码中的每个 Ansible 语句(包括 Play、任务和块)设置“name”参数。这有助于提高可读性和可维护性。

错误示例:

---
- hosts: all
  tasks:
  - ansible.builtin.yum:
      name: httpd
      state: latest

正确示例:

---
- name: install apache
  hosts: all
  tasks:
  - name: install apache packages
    ansible.builtin.yum:
      name: httpd
      state: latest

3. 使用易读且有意义的变量名

变量用于存储参数或保存前一步骤的结果。使用易读且有意义的变量名可以提高代码的复用性和团队内的可读性。同时,使用 ansible-playbook 命令的 --extra-vars 参数可以在执行时覆盖变量。

错误示例:

httpkeepalive: 25
webpo: 80
aaaa: 8080

正确示例:

apache_max_keepalive: 25
apache_port: 80
tomcat_port: 8080

4. 使用原生 YAML 格式

使用原生 YAML 格式可以提高代码的可读性,并帮助您更快、更容易地发现错误。同时,使用 YAML Linter 和解析器可以验证代码的正确性。

错误示例:

- name: install apache
  ansible.builtin.yum:
    name: apache-{{ apache_version }} state=present update_cache=yes disable_gpg_check=yes enablerepo=apache
  notify: restart apache

正确示例:

- name: install apache
  ansible.builtin.yum:
    name: apache-{{ apache_version }}
    state: present
    update_cache: yes
    disable_gpg_check: yes
    enablerepo: apache
  notify: restart apache

5. 优先使用原生模块而不是命令模块

优先使用原生模块(如 ansible.builtin.yum_repository),而不是命令模块(如 shell、command)。原生模块具有幂等性,并在执行前验证参数,而命令模块应作为最后的选择。

错误示例:

- name: Add repository into repo.d list
  become: true
  ansible.builtin.shell: 'echo -e "[google-chrome]\nname=google-chrome\nbaseurl=http://dl.google.com/linux/chrome/rpm/stable/x86_64\nenabled=1\ngpgcheck=1\ngpgkey=https://dl.google.com/linux/linux_signing_key.pub" > /etc/yum.repos.d/google-chrome.repo'
  args:
    creates: /etc/yum.repos.d/google-chrome.repo
  when: ansible_os_family == 'RedHat'

正确示例:

- name: Add repository into repo.d list
  ansible.builtin.yum_repository:
    name: google-chrome
    description: google-chrome repository
    baseurl: http://dl.google.com/linux/chrome/rpm/stable/x86_64
    enabled: true
    gpgcheck: true
    gpgkey: https://dl.google.com/linux/linux_signing_key.pub

6. 配置调试信息

在开发 Ansible 代码时,使用“debug”任务显示变量内容非常有用。但在生产环境中,过多的调试信息可能会显得冗余。通过设置“verbosity”参数为“2”,可以在需要时显示调试信息。

错误示例:

- name: message output
  ansible.builtin.debug:
    msg: "This text always displays"

正确示例:

- name: message output
  ansible.builtin.debug:
    msg: "This text displays with ansible-playbook -vv"
  verbosity: 2

7. 以最小权限执行任务

出于安全最佳实践,应以最小权限执行任务。在 Ansible 中,可以通过在任务级别指定 become: true,而不是在整个 Playbook 中使用,以避免不必要的特权提升。

错误示例:

---
- name: install apache
  hosts: all
  become: true
  tasks:
  - name: message output
    ansible.builtin.debug:
      msg: "This text always displays"

  - name: install apache packages
    ansible.builtin.yum:
      name: httpd
      state: latest

正确示例:

---
- name: install apache
  hosts: all
  tasks:
  - name: message output
    ansible.builtin.debug:
      msg: "This text always displays"

  - name: install apache packages
    ansible.builtin.yum:
      name: httpd
      state: latest
    become: true

8. 使用版本控制

使用源代码管理工具(如 GitHub、GitLab 或 BitBucket)是团队协作的必备工具。它不仅可以跟踪代码的修改历史,还能促进团队成员之间的代码共享,并确保执行节点始终是最新的。

9. 明确指定“state”参数

许多模块具有可选的“state”参数,默认值可能因模块而异。明确指定 state: present 或 state: absent 可以使 Playbook 和角色更加清晰。

10. 添加注释

在代码中添加注释(以“#”开头的行),帮助他人(以及未来的您)理解某个语句、Play 或任务(或变量设置)的作用、实现方式和原因。

遵循这些最佳实践,可以提高您的 Ansible Playbook 的可读性、可维护性和安全性,同时也有助于团队协作和代码共享。