Ansible是一个系列文章,我会尽可能以通俗易懂、诙谐幽默的总结方式给你们呈现这些枯燥的知识点,让学习变的有趣一些。
Ansible系列博文直达连接:Ansible入门系列shell
在上一篇文章中说到Ansible有两种玩法,一种是Ansible Ad-Hoc,另外一种是就是这里要说的playbook。playbook是Ansible进行配置管理的组件,虽然Ansible的平常Ad-Hoc命令功能很强大,能完成一些基本的配置管理工做,可是Ad-Hoc命令没法支撑复杂环境的配置管理工做。在咱们实际使用Ansible的工做中,大部分时间都是在编写playbook,接下来就重点说说如何玩转这个playbook。apache
咱们都是按照yaml语法规则来编写playbook,至于yaml怎么玩,后面的文章我会总结一下的。在咱们按照要求编写好了yaml文件后,如何来执行这个yaml文件呢?ssh
Ansible提供了一个单独的命令:ansible-playbook
命令,咱们能够经过这个命令来执行yaml脚本。常见的ansible-playbook
的使用方法以下:异步
最简单的使用方法:学习
ansible-playbook copyDemo.yaml
咱们还可使用如下命令查看输出的细节:设计
ansible-playbook copyDemo.yaml --verbose
咱们也可使用如下命令查看该yaml脚本将影响的主机列表:rest
ansible-playbook copyDemo.yaml --list-hosts
还可使用如下命令检查yaml脚本语法是否正确:code
ansible-playbook copyDemo.yaml --syntax-check
上面的几种使用方法基本就涵盖了咱们平常工做中80%的场景了,剩余的20%场景,好比并行、异步等,不多用到,等真正用到的时候再去查阅相关资料也来的及。而工做中,更多的时候,咱们不是在编写playbook,就是在编写playbook的路上。因此,接下来我重点说说如何写这个playbook,也就是playbook的基本语法。server
最基本的playbook脚本分为三个部分:md5
咱们在编写playbook脚本的时候,老是离不开上面的三个部分的。下面先来一个稍微有点复杂的playbook脚本,让你们先有一个总体的认识。
--- - hosts: server1 user: root vars: http_port: 80 max_clients: 200 tasks: - name: Write apache config file template: src=/home/test1/httpd.j2 dest=/home/test2/httpd.conf notify: - restart apache - name: Ensure apache is running service: name=httpd state=started handlers: - name: restart apache service: name=httpd state=restarted
如今就对上述三部分稍做详细总结。
上面的yaml脚本,咱们一开始就会看到hosts
、user
和vars
,其中vars
在后面的文章进行专门总结。而这里的hosts
和user
就是表示咱们这个yaml将要在哪些主机上用哪一个用户身份去操做。而这里的深一层次的关系以下表所示:
key | 含义 |
---|---|
hosts | 为主机的IP,或者主机组名,或者关键字all |
user | 在远程以哪一个身份执行 |
become | 切换成其余用户身份执行,值为yes或者no |
become_method | 与become一块儿使用,值能够为sudo /su 等 |
become_user | 与become一块儿使用,能够是root或者其它用户名 |
在实际工做中,若是咱们不指定user
时,则默认使用链接远程主机的用户进行操做,若是指定了执行用户而与ansible_ssh_user
指定用户不一致时,则须要开启become
操做,这里的become
配置与ansible.cfg中配置将相互配合完成工做,yaml中的become优先级高于ansible.cfg中配置中的优先级。
任务列表是整个playbook的核心,对于任务列表,咱们首先须要知道如下三点内容:
对于任务的参数有两种不一样的写法,咱们在编写yaml脚本时,能够按照本身的喜爱进行选择。
写法一:
- name: Write apache config file template: src=/home/test1/httpd.j2 dest=/home/test2/httpd.conf
写法二:
- name: Write apache config file template: src: /home/test1/httpd.j2 dest: /home/test2/httpd.conf
这两种写法都是OK的,我通常喜欢第二种写法。
最后,对于任务咱们还须要特别一个点,那就是任务的执行状态。咱们在执行Ansible Ad-Hoc或者ansible-playbook的时候,在输出中都会有一个changed
字段,好比:
192.168.1.3 : ok=2 changed=0 unreachable=0 failed=0
或者
192.168.1.3 : ok=2 changed=1 unreachable=0 failed=0
这里的这个changed
就是人物的执行状态,可是它为何一会是0,一会有是1呢?这就要说到Ansible中一个叫作“幂等性”的概念。
幂等性是数学和计算机科学上一个常见的概念,屡次执行产生的结果不会发生改变,这样的特性就被成为幂等性。
大多数的Ansible模块在设计时保证了幂等性,幂等性保证了Ansible脚本屡次执行状况下的相同结果,尽量的避免使用那些不能知足幂等性的模块。好比咱们常用的
shell
模块就是非幂等性的。
咱们要明白Ansible是以“结果为导向的”,咱们指定了一个“目标状态”,Ansible会自动判断“当前状态”是否与“目标状态”一致,若是一致,则不进行任何操做;若是不一致,那么就将“当前状态”变成“目标状态”,这就是“幂等性”,“幂等性”能够保证咱们重复的执行同一项操做时,获得的结果是同样的。
那这个幂等性与上面的changed
又有什么关系呢?且听我下面慢慢道来!
changed
为false或者0时,表示Ansible没有进行任何操做,没有“改变什么”;changed
为true或者大于0时,表示Ansible执行了操做,“当前状态”已经被Ansible改变成了“目标状态”。拿copy
这个模块来举例子说明,当咱们准备将一个文件经过Ansible拷贝到远程主机时,copy
模块首先检查远程是否已经存在了该文件,若是不存在,则把文件拷贝过去,返回changed
为大于0;若是存在时,则开始比对两个文件的md5值,若是md5值一致,则说明两个文件是同样的,则不须要拷贝,此时copy
模块则什么都不干,返回changed
为0。
经过三篇文章总结了Ansible中的经常使用模块、Ansible Ad-Hoc和ansible-playbook的一些惯用用法,从个人实际学习经验来讲,学到这里,你能够将这三块内容结合起来使用了,至少能够在大家生产环境鼓捣一下了。生来就是折腾,更况且咱们这么拼命、努力的学习呢!
果冻想,认真玩技术的地方。
2019年5月18日,于内蒙古呼和浩特。