Ansible运维自动化工具(playbooks介绍)

  • A+
所属分类:自动化工具

Ansible传送门

Ansible运维自动化工具(简介)

Ansible运维自动化工具(安装)

Ansible运维自动化工具(主机组)

Ansible运维自动化工具(模块)

Ansible运维自动化工具(playbooks简介)

Ansible运维自动化工具(playbooks应用)

Ansible运维自动化工具(roles进阶)

YAML介绍

YAML是一个可读性高的用来表达资料序列的格式。YAML参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822等。Clark
Evans在2001年在首次发表了这种语言,另外Ingy döt Net与Oren Ben-Kiki也是这语言的共同设计者。

YAML Ain't Markup Language,即YAML不是XML。不过,在开发的这种语言时,YAML的意思其实是:"Yet Another
Markup Language"(仍是一种标记语言)。其特性:

YAML的可读性好

YAML和脚本语言的交互性好

YAML使用实现语言的数据类型

YAML有一个一致的信息模型

YAML易于实现

YAML可以基于流来处理

YAML表达能力强,扩展性好

更多的内容及规范参见 http://www.yaml.org

YAML语法

YAML的语法和其他高阶语言类似,并且可以简单表达清单、散列表、标量等数据结构。其结构(Structure)通过空格来展示,序列(Sequence)里的项用"-"来代表,Map里的键值对用":"分隔。下面是一个示例。

name: John Smith
age: 41
gender: Male
spouse:
    name: Jane Smith
    age: 37
    gender: Female
children:
    - name: Jimmy Smith
      age: 17
      gender: Male
    - name: Jenny Smith
      age 13
      gender: Female

YAML文件扩展名通常为.yaml,如example.yaml。

playbook的核心元素

Hosts: 运行指定任务的目标主机;可以是:IP地址、hostname、组名

Tasks: 任务列表

Varniables: 变量

Templates: 模板

Handlers: 由特定条件触发的任务 监控资源改变时才会触发改变

Roles: Playbook的按固定目录结构组成

remote_user: 执行用户,通常使用root用户

Ansible playbooks

playbook是由一个或多个“play”组成的列表。play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上来讲,所谓task无非是调用ansible的一个module。将多个play组织在一个playbook中,即可以让它们联同起来按事先编排的机制同唱一台大戏。下面是一个简单示例。

- hosts: webnodes
  vars:
  http_port: 80
  max_clients: 256
remote_user: root
tasks:
  - name: ensure apache is at the latest version
    yum: name=httpd state=latest
  - name: ensure apache is running
    service: name=httpd state=started
handlers:
  - name: restart apache
    service: name=httpd state=restarted

playbook基础组件

Hosts和Users

playbook中的每一个play的目的都是为了让某个或某些主机以某个指定的用户身份执行任务。hosts用于指定要执行指定任务的主机,其可以是一个或多个由冒号分隔主机组;remote_user则用于指定远程主机上的执行任务的用户。如上面示例中的

- hosts: webnodes
  remote_user: root

不过,remote_user也可用于各task中。也可以通过指定其通过sudo的方式在远程主机上执行任务,其可用于play全局或某任务;此外,甚至可以在sudo时使用sudo_user指定sudo时切换的用户。

- hosts: webnodes
remote_user: baidu
tasks:
  - name: test connection
    ping:
    remote_user: baidu
    sudo: yes

任务列表和action

 play的主体部分是task list。task
list中的各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后再开始第二个。在运行自下而下某playbook时,如果中途发生错误,所有已执行任务都将回滚,因此,在更正playbook后重新执行一次即可。

 task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致。

 每个task都应该有其name,用于playbook的执行结果输出,建议其内容尽可能清晰地描述任务执行步骤。如果未提供name,则action的结果将用于输出。

 定义task的可以使用“action: module options”或“module:
options”的格式,推荐使用后者以实现向后兼容。如果action一行的内容过多,也中使用在行首使用几个空白字符进行换行。

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

  在众多模块中,只有command和shell模块仅需要给定一个列表而无需使用“key=value”格式,例如:

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

  如果命令或脚本的退出码不为零,可以使用如下方式替代:

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

或者使用ignore_errors来忽略错误信息:

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

handlers

用于当关注的资源发生变化时采取一定的操作。

“notify”这个action可用于在每个play的最后被触发,这样可以避免多次有改变发生时每次都执行指定的操作,取而代之,仅在所有的变化发生完成后一次性地执行指定操作。在notify中列出的操作称为handler,也即notify中调用handler中定义的操作。

- name: template configuration file
    template: src=template.j2 dest=/etc/foo.conf
    notify:
      - restart memcached
      - restart apache

handler是task列表,这些task与前述的task并没有本质上的不同。

handlers:
  - name: restart memcached
    service: name=memcached state=restarted
  - name: restart apache
    service: name=apache state=restarted

heartbeat案例

vim heartbeat.yaml
 
  - hosts: hbhosts
    remote_user: root
    tasks:
      - name: ensure heartbeat latest version
        yum: name=heartbeat state=present
    - name: authkeys configure file
        copy: src=/root/hb_conf/authkeys dest=/etc/ha.d/authkeys
    - name: authkeys mode 600
        file: path=/etc/ha.d/authkeys mode=600
    notify:
        - restart heartbeat
    - name: ha.cf configure file
        copy: src=/root/hb_conf/ha.cf dest=/etc/ha.d/ha.cf
    notify:
        - restart heartbeat
    handlers:
        - name: restart heartbeat
        service: name=heartbeat state=restarted

变量的优先级

命令行 > 主机变量 > 组变量

变量命名

变量名仅能由字母、数字和下划线组成,且只能以字母开头。

facts是由正在通信的远程目标主机发回的信息,这些信息被保存在ansible变量中。要获取指定的远程主机所支持的所有facts,

命令行自定义变量

ansible-playbook test.yml --extra-vars "hosts=www user=baidu"

register

把任务的输出定义为变量,然后用于其他任务,示例如下:

  tasks:
    - shell: /usr/bin/foo
    register: foo_result
    ignore_errors: True

通过roles传递变量

当给一个主机应用角色的时候可以传递变量,然后在角色内使用这些变量,示例如下:

  - hosts: webservers
    roles:
      - common
      - { role: foo_app_instance, dir: '/web/htdocs/a.com', port: 8080 }

主机变量

可以在inventory中定义主机时为其添加主机变量以便于在playbook中使用。例如:

[webservers]
www1.baidu.com http_port=80 maxRequestsPerChild=808
www2.baidu.com http_port=8080 maxRequestsPerChild=909

组变量

组变量是指赋予给指定组内所有主机上的在playboo中可用的变量。例如:

[webservers]
www1.baidu.com
www2.baidu.com

[webservers:vars]
ntp_server=ntp.baidu.com
nfs_server=nfs.baidu.com

组嵌套

inventory中,组还可以包含其它的组,并且也可以向组中的主机指定变量。不过,这些变量只能在ansible-playbook中使用,而ansible不支持。例如:

[apache]
httpd1.baidu.com
httpd2.baidu.com

[nginx]
ngx1.baidu.com
ngx2.baidu.com

[webservers:children]
apache
nginx

[webservers:vars]
ntp_server=ntp.baidu.com

Inventory

ansible的主要功用在于批量主机操作,为了便捷地使用其中的部分主机,可以在inventory file中将其分组命名。默认的inventory
file为/etc/ansible/hosts。

inventory file可以有多个,且也可以通过Dynamic Inventory来动态生成。

inventory文件格式

inventory文件遵循INI文件风格,中括号中的字符为组名。可以将同一个主机同时归并到多个不同的组中;此外,当如若目标主机使用了非默认的SSH端口,还可以在主机名称之后使用冒号加端口号来标明。

ntp.baidu.com
[webservers]
www1.baidu.com:2222
www2.baidu.com
 
[dbservers]
db1.baidu.com
db2.baidu.com
db3.baidu.com

如果主机名称遵循相似的命名模式,还可以使用列表的方式标识各主机,例如:

[webservers]
www[01:50].example.com
 
[databases]
db-[a:f].example.com

Inventory参数(ansible内置变量)

ansible基于ssh连接inventory中指定的远程主机时,还可以通过参数指定其交互方式;这些内置参数如下所示:

ansible_ssh_host
ansible_ssh_port
ansible_ssh_user
ansible_ssh_pass
ansible_sudo_pass

YaLei

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: