lzf79 发表于 2018-7-28 14:19:13

ansible之playbook剧本基础

  ansible-playbook采用yaml语法格式:
  主机与用户
  ---
  - hosts: webservers                  #指定主机组或者具体的主机ip
  remote_user: root                     #指定账户名,这里为root
  tasks:                                        #一个task 可以理解为一个任务
  - name: test connection          #任务名称
  ping:                                    #具体的任务,是对webservers组的机器执行ping
  remote_user: yourname       #定义自己的远程用户
  也支持从 sudo 执行命令,这样就在整个paly中都是用sudo了:
  ---
  - hosts: webservers
  remote_user: yourname
  sudo: yes
  同样可以仅在一个 task 中,使用 sudo 执行命令,而不是在整个 play 中使用 sudo:
  ---
  - hosts: webservers
  remote_user: yourname
  tasks:
  - service: name=nginx state=started
  sudo: yes
  也可以登陆后,sudo 到不同的用户身份,而不是使用 root:
  ---
  - hosts: webservers
  remote_user: yourname
  sudo: yes
  sudo_user: postgres
  如果你需要在使用 sudo 时指定密码,可在运行 ansible-playbook 命令时加上选项 --ask-sudo-pass (-K). 如果使用 sudo 时,playbook 疑似被挂起,可能是在 sudo prompt 处被卡住,这时可执行 Control-C 杀死卡住的任务,再重新运行一次.
  Tasks 列表
  下面是一种基本的 task 的定义,service moudle 使用 key=value 格式的参数,这也是大多数 module 使用的参数格式:
  tasks:
  - name: make sure apache is running
  service: name=httpd state=running
  比较特别的两个 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                                          #忽略报错信息
  如果 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
  在 action 行中可以使用变量.假设在 ‘vars’ 那里定义了一个变量 ‘vhost’ ,可以这样使用它:
  ---
  - hosts: webservers
  gather_facts: no
  remote_user: root
  vars:
  vhost: xxx
  tasks:
  - name: create a virtual host file for {{ vhost }}
  template: src=somefile.j2 dest=/etc/httpd/conf.d/{{ vhost }}
  这些变量在 tempates 中也是可用的
  Handlers: 在发生改变时执行的操作
  例子,当一个文件的内容被改动时,重启两个 services:
  - name: template configuration file
  template: src=template.j2 dest=/etc/foo.conf
  notify:
  - restart memcached
  - restart apache
  ‘notify’ 下列出的即是 handlers.
  Handlers 也是一些 task 的列表,通过名字来引用,它们和一般的 task 并没有什么区别.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
  Handlers 最佳的应用场景是用来重启服务,或者触发系统重启操作.除此以外很少用到了.
  注意:handlers 会按照声明的顺序执行
  执行一个 playbook
  示例是并行的运行 playbook,并行的级别 是10(译者注:是10个并发的进程?):
  ansible-playbook playbook.yml -f 10               #用 -f 指定10个并发进程
  其实指定并发进程也可以在/etc/ansible/ansible.cfg中更改,找到forks。取消注释,将后面的值5改成10保存退出即可
  在执行palybook剧本之前 如何检查yml文件的语法是否正确?
  ansible-playbookplaybook.yml   --syntax-check
  ansible-playbookplaybook.yml   --check
  在执行一个 playbook 之前,想看看这个 playbook 的执行会影响到哪些 hosts:
  ansible-playbook playbook.yml --list-hosts
页: [1]
查看完整版本: ansible之playbook剧本基础