1. ansible-doc的使用
ansible-doc -l 列出所有ansible的模块
ansible-doc +模块名称 查看ansible模块的用法
例如:
ansible-doc template #查看template模块的用法
2.学会使用roles
为了避免代码重复,roles能够实现代码重复被调用
定义一个角色叫websrvs,第二个角色叫phpappsrvs,第三个角色叫dbsrvs。这样代码就可以重复利用了,每个角色可以被独立重复调用。下面举例说明使用方式。
hosts: host1 role: - websrvs hosts: host2 role: - phpappsrvs hosts: host3 role: - dbsrvs hosts: host4 role: - websrvs - phpappsrvs
3.Host Inventory的写法
host文件有很多种写法,比如可以定义组,定义远程主机的ssh端口号。这里说下,自定义远程主机的hostname。管理的主机多了之后,主机的ip地址比较难于记忆,可以在自定义hostname,方便查看playbook的输出结果,格式类似如下,第一列是自定制的hostname,第二列是对应的实际IP地址:
[TestGroup]
'测试1:192.168.1.1'
ansible_host=192.168.1.1
'测试2:192.168.1.2'
ansible_host=192.168.1.2
'测试3:192.168.1.3'
ansible_host=192.168.1.3
'运维1:192.168.1.4'
ansible_host=192.168.1.4
'运维1:192.168.1.5'
ansible_host=192.168.1.5
'运维1:192.168.1.6'
ansible_host=192.168.1.6
'研发1:192.168.1.7'
ansible_host=192.168.1.7
'研发1:192.168.1.8'
ansible_host=192.168.1.8
'研发1:192.168.1.9'
ansible_host=192.168.1.9
更多格式请查看官方文档:http://docs.ansible.com/ansible/intro_inventory.html
4.查看整个任务执行时间
编辑ansible的配置文件(ansible.cfg)
开启 callback_whitelist = timer
ansible-playbook +yml文件,执行之后会返回类似如下信息:
Playbook run took 0 days, 0 hours, 0 minutes, 6 seconds
5.关闭 gathering facts
ansible默认是开启gathering facts的,如果你不需要获取被控机器的 fact 数据,你可以关闭获取 fact 数据功能。关闭之后,可以加快 ansible-playbook 的执行效率,尤其是你管理很大量的机器时,这非常明显。关闭获取 facts 方法,只需要在 playbook 文件中加上“gather_facts: no”即可。
6.delegate_to:任务委派
在对一组服务器的执行操作过程中,需要在其中一台机器上执行一个操作,这个操作可以写在一个playbook中,就需要用到ansible的任务委派功能(delegate_to)。使用 delegate_to 关键字可以委派任务到指定的机器上运行。
- name: run 'ls' command on host 10
shell: ls
delegate_to: 192.168.1.10
7.善于利用循环:with_items
添加多个用户:
- name: add several users
user: name={{ item }}
state=present
groups=wheel
with_items:
- testuser1
- testuser2
8.条件判断:when
比如判断操作系统类型:
tasks:
- name: "shut down Debian flavored systems"
command: /sbin/shutdown -t now
when: ansible_os_family == "Centos"
这里引用ansible_os_family需要注意一点是,需要开启gather_facts参数,默认是开启的。
9.ansible-lint
ansible-lint是对playbook的语法进行检查的一个工具。用法是ansible-lint playbook.yml
安装:
pip install ansible-lint
用法示例,监测语法错误:
10. ansible-playbook block
块中的所有任务都继承在块级别应用的指令。您可以应用于单个任务的大多数内容(循环除外)都可以在块级应用,因此块使设置任务通用的数据或指令变得更加容易。该指令不影响块本身,它仅由块所包含的任务继承。例如,将 when
语句应用于块内的任务,而不是块本身。
块实例,块内有命名的任务
tasks: - name: Install, configure, and start Apache block: - name: Install httpd and memcached ansible.builtin.yum: name: - httpd - memcached state: present - name: Apply the foo config template ansible.builtin.template: src: templates/src.j2 dest: /etc/foo.conf - name: Start service bar and enable it ansible.builtin.service: name: bar state: started enabled: True when: ansible_facts['distribution'] == 'CentOS' become: true become_user: root ignore_errors: yes
在上面的示例中,将在Ansible运行块中的三个任务中的每一个之前评估“何时”条件。所有这三个任务还继承了以root用户身份运行的特权升级指令。最后, ignore_errors: yes
确保即使某些任务失败,Ansible仍可以继续执行剧本。
自Ansible 2.3以来,区块的名称一直可用。我们建议在所有任务、区块内或其他地方使用名称,以便在运行剧本时更好地查看正在执行的任务
11. set_fact
---
- name: Test set_fact - define variable to check time
hosts: localhost
tasks:
- name: Define vairbale using set_fact
set_fact:
check_time_using_set_fact: "Fact: {{ lookup('pipe', 'date \"+%H:%M:%S\"')}}"
- name: Test set_fact - check time 1st time
debug: var=check_time_using_set_fact
- name: Sleep for 10 seconds and continue with play
wait_for:
timeout: 10
delegate_to: localhost
- name: Test set_fact - check time 2nd time
debug: var=check_time_using_set_fact
12. notify和handlers
handlers(触发器): 定义一些task列表,与之前剧本中task没有关系,只有资源发送变化才会采取一定的操作
notify: notify中调用handler中定义的操作