Ansible之playbook学习一

简单来说,playbooks 是一种简单的配置管理系统与多机器部署系统的基础.与现有的其他系统有不同之处,且非常适合于复杂应用的部署.
官方提供了大量的例子:https://github.com/ansible/ansible-examples


1、playbook语言示例


Playbooks 的格式是YAML,详见:http://www.ansible.com.cn/docs/YAMLSyntax.html


playbook 由一个或多个 ‘plays’ 组成.它的内容是一个以 ‘plays’ 为元素的列表.
在 play 之中,一组机器被映射为定义好的角色.在 ansible 中,play 的内容,被称为 tasks,即任务.在基本层次的应用中,一个任务是一个对 ansible 模块的调用。


这里有一个 playbook,其中仅包含一个 play:


---
- hosts: webservers
  vars:
    http_port: 80
    max_clients: 200
  remote_user: root
  tasks:
  - name: ensure apache is at the latest version
    yum: pkg=httpd state=latest
  - name: write the apache config file
    template: src=/srv/httpd.j2 dest=/etc/httpd.conf
    notify:
    - restart apache
  - name: ensure apache is running
    service: name=httpd state=started
  handlers:
    - name: restart apache
      service: name=httpd state=restarted




2、主机与用户


(1) 可以为 playbook 中的每一个 play,个别地选择操作的目标机器
hosts 行的内容是一个或多个组或主机的 patterns,以逗号为分隔符,remote_user 就是账户名:


---
- hosts: webservers
 remote_user: root


(2) 在每一个 task 中,可以定义自己的远程用户:


---
- hosts: webservers
 remote_user: root
 tasks:
   - name: test connection
     ping:
     remote_user: yourname


(3) 支持从 sudo 执行命令:


---
- hosts: webservers
 remote_user: yourname
 sudo: yes




3、Task列表


每一个play包含了一个task列表.一个task在其所对应的所有主机上(通过 host pattern 匹配的所有主机)执行完毕之后,下一个task 才会执行.在一个 play 之中,所有 hosts 会获取相同的任务指令,也就是将一组选出的hosts映射到task.


每个 task 的目标在于执行一个 moudle, 通常是带有特定的参数来执行.在参数中可以使用变量(variables).modules 具有”幂等”性,意思是如果你再一次地执行 moudle,moudle 只会执行必要的改动,只会改变需要改变的地方.所以重复多次执行 playbook 也很安全.


每一个 task 必须有一个名称 name,这样在运行 playbook 时,从其输出的任务执行信息中可以很好的辨别出是属于哪一个 task 的. 如果没有定义 name,‘action’ 的值将会用作输出信息中标记特定的 task.


(1)基本的 task 的定义,service moudle 使用 key=value 格式的参数,这也是大多数 module 使用的参数格式:


tasks:
 - name: make sure apache is running
   service: name=httpd state=running


(2)比较特别的两个 modudle 是 command 和 shell ,它们不使用 key=value 格式的参数,而是这样:


tasks:
 - name: disable selinux
   command: /sbin/setenforce 0


  使用 command module 和 shell module 时,我们需要关心返回码信息,如果有一条命令,它的成功执行的返回码不是0, 你或许希望这样做:


tasks:
 - name: run this command and ignore the result
   shell: /usr/bin/somecommand || /bin/true


  或者是这样:


tasks:
 - name: run this command and ignore the result
   shell: /usr/bin/somecommand
   ignore_errors: True


(3)如果 action 行看起来太长,你可以使用 space(空格) 或者 indent(缩进) 隔开连续的一行:


tasks:
 - name: Copy ansible inventory file to client
   copy: src=/etc/ansible/hosts dest=/etc/ansible/hosts
           owner=root group=root mode=0644


(4)在 action 行中可以使用变量.假设在 ‘vars’ 那里定义了一个变量 ‘vhost’ ,可以这样使用它:


tasks:
 - name: create a virtual host file for {{ vhost }}
   template: src=somefile.j2 dest=/etc/httpd/conf.d/{{ vhost }}


  这些变量在 tempates 中也是可用的



4、Handlers: 在发生改变时执行的操作


当发生改动时)’notify’ actions 会在 playbook 的每一个 task 结束时被触发,而且即使有多个不同的 task 通知改动的发生, ‘notify’ actions 只会被触发一次.


一个例子,当一个文件的内容被改动时,重启两个 services:
tasks:
- name: template configuration file
 template: src=template.j2 dest=/etc/foo.conf
 notify:
    - restart memcached
    - restart apache
‘notify’ 下列出的即是 handlers.


Handlers 也是一些 task 的列表,通过名字来引用,即通过Handlers定义的name名字标识来识别的,比如上面notify中的“restart apache"和下面handlers中的”name: restart apache".Handlers 是由通知者进行 notify, 如果没有被 notify,handlers 不会执行.不管有多少个通知者进行了 notify,等到 play 中的所有 task 执行完成之后,handlers 也只会被执行一次.


这里是一个 handlers 的示例:
handlers:
   - name: restart memcached
     service:  name=memcached state=restarted
   - name: restart apache
     service: name=apache state=restarted


5、执行playbook


执行playbook通过ansible-playbook命令实现,格式如下;
ansible-playbook playbook.file(.yml) [参数]


例如:ansible-playbook playbook.yml -f 10



ansible-playbook命令参数:

Usage: ansible-playbook playbook.yml

Options:
  -u REMOTE_USER, --user=REMOTE_USER           ssh连接的用户名,ansible.cfg中可以配置
  -k, --ask-pass        提示输入ssh登录密码,当使用密码验证登录的时候用
  -s, --sudo            sudo运行
  -U SUDO_USER, --sudo-user=SUDO_USER          sudo到哪个用户,默认为root
  -K, --ask-sudo-pass   提示输入sudo密码,当不是NOPASSWD模式时使用
  -T TIMEOUT, --timeout=TIMEOUT                ssh连接超时时间,默认10秒
  -C, --check           指定该参数后,执行playbook文件不会真正去执行,而是模拟执行一遍,然后输出本次执行会对远程主机造成的修改
  -c CONNECTION         连接类型(default=smart)
  -D, --diff            如果file和template模块改变,会显示改变的内容,应该和--check一起
  -e EXTRA_VARS, --extra-vars=EXTRA_VARS       设置额外的变量如:key=value or YAML/JSON,以空格分隔变量,或用多个-e
  -f FORKS, --forks=FORKS                      fork多少个进程并发处理,默认5
  -i INVENTORY, --inventory-file=INVENTORY     指定hosts文件路径,默认default=/etc/ansible/hosts
  -l SUBSET, --limit=SUBSET       指定一个pattern,对- hosts:匹配到的主机再过滤一次
  --list-hosts          只打印有哪些主机会执行这个playbook文件,不是实际执行该playbook
  --list-tasks          列出该playbook中会被执行的task
  -M MODULE_PATH, --module-path=MODULE_PATH    模块所在路径,默认/usr/share/ansible/
  --private-key=PRIVATE_KEY_FILE      私钥路径
  --start-at-task=START_AT            start the playbook at the task matching this name
  --step                同一时间只执行一个task,每个task执行前都会提示确认一遍
  --syntax-check        只检测playbook文件语法是否有问题,不会执行该playbook
  -t TAGS, --tags=TAGS  当play和task的tag为该参数指定的值时才执行,多个tag以逗号分隔
  --skip-tags=SKIP_TAGS 当play和task的tag不匹配该参数指定的值时,才执行
  -v, --verbose         verbose mode (-vvv for more, -vvvv to enable connection debugging)
### 使用Ansible执行Playbook的操作指南 #### 执行Playbook的基础命令 当需要运行个完整的Playbook时,可以使用如下基础命令: ```bash ansible-playbook playbook.yaml ``` 这条指令会按照定义好的任务列表依次执行每个任务[^1]。 #### 测试模式下的Playbook执行 为了测试Playbook是否会按预期工作而不实际做出任何更改,可采用`--check`参数来模拟执行过程: ```bash ansible-playbook --check playbook.yaml ``` 此选项允许用户预览可能发生的变更而不会真正影响目标系统状态。 #### 验证Playbook语法正确性 确保编写的Playbook文件没有语法错误非常重要,在正式部署前应该先验证其合法性: ```bash ansible-playbook --syntax-check playbook.yaml ``` 通过这种方式可以在早期发现并修正潜在的问题,提高工作效率。 #### 查看涉及的目标主机清单 有时了解具体哪些机器会被当前配置所触及也是必要的,这时可以通过下面的方法获取相关信息: ```bash ansible-playbook --list-hosts playbook.yaml ``` 这有助于确认范围内的所有节点是否都已正确定义,并且能够帮助排查连接失败的情况[^3]。 #### 基于标签筛选特定的任务集 如果只想针对某些标记过的部分进行处理,则可以利用tags功能实现更灵活的选择机制: ```bash ansible-playbook -t TAGS_NAME playbook.yaml ``` 这里TAGS_NAME代表事先设定好用来区分不同类别的标识符,使得维护更加便捷高效。 对于希望深入了解Ansible及其应用实践的学习者来说,网络上有许多优质的资源可供参考。例如,B站提供了关于Ansible系列视频教程,涵盖了从入门到高级使用的各个方面[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值