ansible——playbook剧本

Posted 噫噫噫呀呀呀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ansible——playbook剧本相关的知识,希望对你有一定的参考价值。

一、主机清单

Inventory是Ansible管理主机信息的配置文件,相当于系统HOSTS文件的功能,默认存放在/etc/ansible/hosts

vi /etc/ansible/hosts
[webserver]             #方括号中设置组名
www1.example.org        #定义被监控主机,这边可以是主机名也可以是IP地址
www2.example.org:2222   #冒号后面定义远程连接端口,默认是ssh的22端口

1、Inventory中的变量

① 主机变量

[webserver]
www1.magedu.com http_port=80 maxRequestsCgild=808
www2.magedu.com http_port=8080 maxRequestsChild=909

② 组变量

[servers:vars]
ntp_server=ntp.example.org
nfs_server=nfs.example.org

③ 组嵌套

[apache]
http1.example.org
http2.example.org

[nginx]
ngx1.example.org
ngx2.example.org

[webservers:children]
apache
nginx

2、inventor 变量参数

参数说明
ansible_ssh_host将要连接的远程主机名,与你想要设定的主机的别名不同的话,可通过此变量设置
ansible_ssh_portssh端口号,如果不是默认的端口号,通过此变量设置
ansible_ssh_user默认的ssh用户名
ansible_ssh_passssh密码(这种方式并不安全,我们强烈建议使用 --ask-pass或SSH密钥)
ansible_ssh_private_key_filessh使用的私钥文件,适用于有多个密钥,而你不想使用SSH代理的情况
ansible_ssh_common_args此设置附加到sftp,scp和ssh的缺省命令行
ansible_sftp_extra_args此设置附加到默认sftp命令行
ansible_scp_extra_args此设置附加到默认scp命令行
ansible_ssh_extra_args此设置附加到默认ssh命令行
ansible_ssh_pipelining确定是否使用SSH管道。这可以覆盖ansible.cfg中得到设置
ansible_shell_type目标系统的shell类型,默认情况下,命令的执行使用sh语法,可设置为csh 或 fish
ansible_python_interpreter目标主机的python路径,适用于的情况:系统中有多个python,或者命令路径不是/usr/bin/python
ansible_*_interpreter这里的*可以是ruby或perl或其他语言的解释器,作用和ansible_python_interpreter类似
ansible_shell_executable这将设置ansible控制器将在目标机器上使用的shell,覆盖ansible.cfg中的配置,默认为/bin/sh

二、playbook剧本

playbook是剧本的意思
通过 task 调用 ansible 的模块将多个 play 组织在一 个playbook中运行。

组成:

  • Tasks: 任务,即调用模块完成的某操作
  • Variables: 变量
  • Templates: 模板
  • Handlers: 处理器,当某条件满足时,触发执行的操作
  • Roles: 角色

playbook实例

 - hosts: webserver     #定义的主机组,即应用的主机
   vars:                #定义变量
     http_port: 80
     max_clients: 200
   user: root
   tasks:               #执行的任务
    - name: ensure apache is at the latest version
      yum: name=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

基本命令介绍

#执行一个playbook
ansible-playbook [yaml文件名]
例如: ansible-playbook a.yaml
参数: -k (-ask-pass)用来交互输入ssh密码
     -K(-ask-become-pass)用来交互输入sudo密码
     -u :指定用户
ansible-playbook xxx.yaml --syntax-check   			   		 #检查yaml文件的语法是否正确
ansible-playbook xxx.yaml --list-task     					 #检查tasks任务
ansible-playbook xxx.yaml --list-hosts     					 #检查生效的主机
ansible-playbook xxx.yaml --start-at-task='xxx'			     #指定从某个task开始运行

- hosts: webserver   #指定主机组,可以是一个或多个组

remote_user: root 	 #指定远程主机执行的用户名
参数说明
-k(-ask-pass)用来交互输入ssh密码
-K(-ask-become-pass)用来交互输入sudo密码
-u指定用户
-e引入变量值

1、为每个任务定义远程执行用户

cd /opt
vim 1.yaml

- hosts: mysql
  remote_user: root
  tasks:
  - name: test connection
    ping:
    remote_user: mysql  
	
ansible mysql -m user -a 'name=mysql'
ansible mysql -m shell -a 'echo 123123 | passwd --stdin mysql'
ansible-playbook 1.yaml -k
123123

2、指定远程主机切换用户执行剧本

vim 2.yaml

- hosts: mysql
  remote_user: root
  become: yes         
  become_user: mysql   
  tasks:
  - name: copy text
    copy: src=/etc/fstab dest=/home/mysql/fstab.bak

ansible-playbook 2.yaml

3、tasks忽略错误,强制返回成功

1、Play的主体部分是task列表,task列表中的各任务按次序逐个在hosts中指定的主机上执行,即在所有主机上完成第一个任务后再开始。在运行playbook时 (从上到下执行),如果一个host执行task失败, 整个tasks都会停止。

2、每一个task必须有一个名称 name,这样在运行playbook时,从其输出的任务执行信息中可以很好的辨别出是属于哪一个task的。

错误示例:遇到错误task自动停止,apache服务不会继续安装

vim 3.yaml

- hosts: webserver
  remote_user: root
  tasks:
  - name: stop selinux
    command: '/usr/sbin/setenforc 0'
  - name: install httpd
    yum: name=httpd
  - name: start httpd
    service: name=httpd state=started

ansible-playbook 3.yaml

加入ignore_errors: True 忽略错误,报错后继续执行

vim 3.yaml

- hosts: webserver
  remote_user: root
  tasks:
  - name: stop selinux
    command: '/usr/sbin/setenforc 0'
    ignore_errors: True
  - name: install httpd
    yum: name=httpd
  - name: start httpd
    service: name=httpd state=started
                                                   
ansible-playbook 3.yaml                       

4、针对多个主机节点执行剧本

vim 4.yaml
  
- hosts: webserver
  remote_user: root
  tasks:
  - name: remove httpd
    yum: name=httpd state=absent

- hosts: mysql
  remote_user: root
  tasks:
  - name: copy file
    copy: src=/etc/fstab dest=/opt/haha.txt

5、Handlers概述

Handlers也是一些task的列表, 和一般的task并没有什么区别。
是由通知者进行的notify,如果没有被notify,则Handlers不会执行,假如被notify了 ,则Handlers被执行不管有多少个通知者进行了notify,等到play中的所有task执行完成之后,handlers也只会被执行一次

vim 5.yaml

- hosts: webserver
  remote_user: root
  tasks:
  - name: remove httpd
    yum: name=httpd state=absent

  - name: start firewalld
    service: name=firewalld state=started

  - name: setenforce 0 && install httpd
    command: '/usr/sbin/setenforce 0'
    notify:
    - step one

  - name: stop firewalld && start httpd
    service: name=firewalld state=stopped
    notify:
    - step two

  handlers:

  - name: step one
    yum: name=httpd

  - name: step two
    service: name=httpd state=started


ansible-playbook 5.yaml

6、引入变量

playbook引入变量有三种方式

  • 通过ansible命令参数-e传递
  • 直接在yaml中定义
  • 引用主机清单中定义的变量

① 通过ansible命令参数-e传递

vim 6_1.yaml

- hosts: mysql
  remote_user: root
  vars:
  - user:
  tasks:
  - name: add user
    user: name={{user}}

ansible-playbook 6_1.yaml -e "user=wangwu"
ansible mysql -a 'tail -1 /etc/passwd'

② 直接在yaml中定义,或者内置变量

vim 6_2.yaml

- hosts: mysql
  remote_user: root
  vars:
  - user: lisi
  tasks:
  - name: add user
    user: name={{user}}

ansible-playbook 6_2.yaml
ansible mysql -a 'tail -1 /etc/passwd'
vim 6_2.yaml

- hosts: mysql
  remote_user: root
  tasks:
  - name: copy file
    copy: content="{{ansible_all_ipv4_addresses}}" dest=/opt/vars.txt

ansible-playbook 6_2.yaml
ansible mysql -a 'ls /opt'
ansible mysql -a 'cat /opt/vars.txt'

③ 引用主机清单内自定义变量

vim /etc/ansible/hosts

[webserver]
192.168.184.20
[mysql]
192.168.184.30  user=zhaoliu

vim 6_3.yaml

- hosts: mysql
  remote_user: root
  tasks:
  - name: add user
    user: name={{user}}

ansible-playbook 6_3.yaml
ansible mysql -a 'tail -1 /etc/passwd'

7、条件测试

如果需要根据变量、facts (setup) 或此前任务的执行结果来作为某task执行与否的前提时要用到条件测试,在Playbook中条件测试使用。在task后添加when子句即可使用条件测试: when子句支持 jinjia2 表达式或语法

① 单条件判断

vim 7_1.yaml

 - hosts: mysql
   remote_user: root
   tasks:
     - name: "shutdown CentOS"
       command: /sbin/shutdown -h now
       when: ansible_distribution == "CentOS"

ansible-playbook 7_1.yaml

② 多条件判断

vim 7_2.yaml

- hosts: mysql
  remote_user: root
  tasks:
  - name: "shut down CentOS 7 systems"
    command: /sbin/shutdown -r now
    when:
    - ansible_distribution == "CentOS"
    - ansible_distribution_major_version == "7"

ansible-playbook 7_2.yaml

③ 组条件判断

vim 7_3.yml
 
- hosts: mysql
  remote_user: root
  tasks:
  - name: "shut down CentOS 6 and Debian 7 systems"
    command: /sbin/shutdown -t now
    when: (ansible_distribution == "CentOS" and ansible_distribution_major_version == "6") or (ansible_distribution == "Debian" and ansible_distribution_major_version == "7")

ansible-playbook 7_3.yaml

④ 迭代

当有需要重复性执行的任务时,可以使用迭代机制。其使用格式为将需要迭代的内容定义为item变量引用,并通过with_items语句指明迭代。

vim 7_5.yaml

- hosts: webserver
  remote_user: root
  tasks:
  - name: install
    yum: name={{item}} state=latest
    with_items:
    - httpd
    - rpcbind
    - nfs-utils

ansible-playbook 7_5.yaml
ansible webserver -a 'rpm -q httpd'
ansible webserver -a 'rpm -q rpcbind'
ansible webserver -a 'rpm -q nfs-utils'

也可以自己定义item变量

vim 7_5.yaml

- hosts: webserver
  remote_user: root
  tasks:
  - name: add user && join group
    user: name={{item.x}} state=present group={{item.y}}
    with_items:
    - {x: 'qianqi', y: 'wheel'}
    - {x: 'sicong', y: 'root'}

ansible-playbook 7_5.yaml
ansible webserver -a 'tail -2 /etc/passwd'

以上是关于ansible——playbook剧本的主要内容,如果未能解决你的问题,请参考以下文章

Ansible的脚本——playbook 剧本

Ansible的脚本—playbook剧本

2.Ansible Playbook剧本

ansible——playbook剧本

ansible playbook剧本

ansible playbook剧本