Open xuanyuanaosheng opened 1 week ago
Ansible 是一个强大的自动化工具,主要用于配置管理、应用部署、任务自动化等。以下是一些常见的 Ansible 使用技巧,可以帮助提高效率、简化代码、避免常见问题:
ansible-vault
命令对文件进行加密和解密。 ansible-vault encrypt secret.yml
- name: Example playbook
vars_files:
- vault_secret.yml
tasks:
...
ansible-playbook -i dynamic_inventory.py playbook.yml
site.yml
roles/
web/
tasks/
handlers/
templates/
files/
vars/
- hosts: webservers
roles:
- web
ansible.cfg
优化配置ansible.cfg
文件,定义全局的 Ansible 配置,例如 Inventory 路径、SSH 参数等。ansible.cfg
配置文件:
[defaults]
inventory = ./hosts
remote_user = ansible
host_key_checking = False
when
) 控制任务执行when
可以根据条件执行任务,避免不必要的任务执行。 - name: Install Apache on CentOS
yum:
name: httpd
state: present
when: ansible_os_family == "RedHat"
with_items
和 loop
实现循环with_items
和 loop
可以简化重复操作,减少代码量。 - name: Install multiple packages
apt:
name: "{{ item }}"
state: present
loop:
- git
- curl
- vim
delegate_to
实现远程任务代理delegate_to
可以将任务委托给特定的主机执行,常用于需要通过中转服务器执行任务的场景。 - name: Run a task on a different host
command: hostname
delegate_to: "another_host"
示例:
- name: Update web configuration
template:
src: web.conf.j2
dest: /etc/nginx/nginx.conf
notify: Restart nginx
handlers:
- name: Restart nginx
service:
name: nginx
state: restarted
- name: Install web server
hosts: webservers
tasks:
- name: Install Nginx
apt:
name: nginx
tags: nginx
ansible
继续 Ansible 的技巧:
创建一个模板文件 nginx.conf.j2
:
server {
listen {{ http_port }};
server_name {{ domain_name }};
location / {
proxy_pass http://{{ backend_server }};
}
}
- name: Configure Nginx
template:
src: templates/nginx.conf.j2
dest: /etc/nginx/nginx.conf
vars:
http_port: 80
domain_name: example.com
backend_server: 127.0.0.1
register
捕获任务输出register
可用于存储任务的输出,便于后续任务使用。示例:获取远程主机的 IP 并在后续任务中使用。
- name: Get IP address
command: hostname -I
register: ip_output
- name: Show IP
debug:
msg: "The IP address is {{ ip_output.stdout }}"
block
和 rescue
进行错误处理block
用于对任务进行分组,rescue
和 always
用于处理异常和资源释放。 - block:
- name: Try to update a package
apt:
name: non_existing_package
state: latest
rescue:
- name: Fallback task on failure
debug:
msg: "Failed to update package, performing fallback"
always:
- name: Clean up
debug:
msg: "This will always run"
ansible-pull
实现拉模式部署ansible-pull
支持通过 Git 仓库拉取 Playbook 并在客户端执行,适合集中化配置的自动更新。 ansible-pull -U https://github.com/username/repo.git playbook.yml
async
和 poll
实现异步任务async
和 poll
可使任务异步执行,适用于耗时操作。示例:启动异步任务并在后台执行。
- name: Long running task
shell: /path/to/long_task.sh
async: 300
poll: 0
- name: Wait for task completion
async_status:
jid: "{{ task_result.ansible_job_id }}"
register: job_result
until: job_result.finished
retries: 5
delay: 10
模块结构示例:
# my_module.py
from ansible.module_utils.basic import AnsibleModule
def run_module():
module = AnsibleModule(
argument_spec=dict(
name=dict(type='str', required=True)
)
)
result = dict(
changed=False,
message=f"Hello {module.params['name']}"
)
module.exit_json(**result)
if __name__ == '__main__':
run_module()
delegate_to
和 local_action
delegate_to
将任务委托给指定节点执行,适合跨主机的任务。local_action
用于在本地主机执行任务。示例:在本地执行命令并将结果应用到远程主机。
- name: Get local system info
local_action: command uname -a
register: local_uname
- name: Show local info on remote host
debug:
msg: "Local system info: {{ local_uname.stdout }}"
-vvv
和 debug
-vvv
提高输出详细程度,帮助定位问题。 - name: Debug variable value
debug:
var: variable_name
将主机按功能、环境进行分组管理。Inventory 示例:
[web]
web01 ansible_host=192.168.1.10
web02 ansible_host=192.168.1.11
[db]
db01 ansible_host=192.168.1.20
assert
实现条件检查assert
用于条件检查,确保环境满足要求后再执行。 - name: Check available disk space
assert:
that:
- disk_space > 1024
msg: "Insufficient disk space!"
--check
进行 Dry Run 测试:
ansible-playbook playbook.yml --check
Ansible