ansible

时间:April 16, 2019 分类:

目录:

介绍

ansible基于python语言实现,由paramiko,pyYaml,Jinja2等模块实现

还有些工具

  • saltstask
  • fabric
  • capistrano
  • cfengine
  • chef

是一个模块化的程序

  • core modules 基础模块
  • custom modules 自定义模块
  • plugins 插件,例如连接插件(connection plugins,ssh,不依赖agent来实现远程操作。)
  • playbook

安装

epel源中会有ansible的

  • ansible.cfg为主配置文件
  • hosts主机清单,可以定义变量
  • roles角色清单

由于ansible基于ssh来实现相关操作,所以需要ansible能够基于密钥的方式联系各个被管理节点,当然也可以通过写入用户密码的方式

  • -f forks 一次执行几个
  • -m module_name 默认为command
  • -a arg 参数

ansible-doc -l 查看支持的模块

-s <module_name>指定模块的详细内容

需要配置hosts,默认有示例

all所有主机

常见模块

  • command 但是不能使用变量,可以用shell
  • cron 可以在主机生成定时任务-m cron -a 'minute="*/10" job="/bin/echo why" name="why test"',移除添加参数state=absent,默认为present安装
  • user 创建用户
  • group 创建组
  • copy 复制文件copy -a 'src=/etc/fstab dest=/tmp/fstab owner=root mode=640',也支持直接访问指定文件内容替代src,'content="Hello \nwhy"'
  • file 设置文件的属性,软链等 file -a 'src=/etc/fstab path=/etc/fstab.link state=link'
  • ping
  • service 用于管理注册的service
  • shell 执行命令,shell -a 'echo 123456|passwd --stdin why'
  • script 将本地脚本复制到远程主机执行
  • yum 安装程序包
  • setup 收集远程主机的facts

Ansible会使用yaml的基础元素,定义变量,Inventory,条件测试

yaml相关参考yaml

playbook

变量

变量命名

仅能由数字,字母和下划线组成,只能以字母开头

facts

ansible可以使用facts变量

任务输出

ansible可以使用task的输出

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

命令行传递

ansible-playbook test.yaml --extra-vars "host=www user=why"

通过roles传递

- hosts: webservers
  roles:
    - common
    - { role: foo_app_instance, dir: '/tmp', port: 8000 }

Inventory

Inventory配置

默认为通过配置文件/etc/ansible

Inventory格式

默认可以协程主机名,如果不是默认端口,需要标注一下

node1.whysdomain.com:2222

主机分组,一个主机可以在多个组中

[web]
node1.whysdomain.com
node2.whysdomain.com
node3.whysdomain.com
[db]
node3.whysdomain.com
node4.whysdomain.com

如果和上述主机名遵循相同的规则,可以通过列表方式标示主机

[web]
node[1:3].whysdomain.com
[db]
node[3:4].whysdomain.com    

主机变量

[web]
node1.whysdomain.com http_port=80
node2.whysdomain.com
node3.whysdomain.com 

组变量

组内所有主机

[web]
node1.whysdomain.com
node2.whysdomain.com
node3.whysdomain.com

[web:var]
ntp_server=ntp.whysdomain.com

组嵌套

[nginx1]
web0[1:5].whysdomain.com

[nginx2]
web1[1:5].whysdomain.com

[web:children]
nginx1
nginx2

inventory参数

也可以在这些inventory参数指定ssh相关的user,passwd等

编写playbook

playbook的Tasks,Variables,Templates,Handler(在满足特定条件的时候触发)和roles

# 应用的目标主机
- host: web
# 参数
  vars: 
    http_port: 80
    max_clients: 256
# 执行用户
  remote_user: root
# 接下来需要执行的命令
  tasks: 
    - name: create nginx group
      group: name=nginx system=yes gid=208
    - name: yum nginx
      yum: name=nginx

在执行的过程中,第一个任务的所有主机完成之后才会执行第二个任务,对于命令或者脚本不为零的情况,可以指定参数忽略错误信息或者对脚本做或操作

host: web
remote: root
tasks:
  - shell: /usr/bin/foo
  - ignory_errors: True

host: web
remote: root
tasks:
  - shell: /usr/bin/foo || /bin/true

handler

host: web
remote: root
tasks: 
  - name: create nginx group
    group: name=nginx system=yes gid=208
    notify: 
      - restart_nginx
handlers:
  - name: restart_nginx
    service: name=nginx state=restart

使用变量

host: web
remote: root
vars: 
  - package: nginx
tasks: 
  - name: create {{ package }} group
    group: name={{ package }} system=yes gid=208
    notify: 
      - restart_nginx
handlers:
  - name: restart_nginx
    service: name=nginx state=restart

条件

when

host: web
remote: root
tasks: 
  - name: create nginx group
    group: name=nginx system=yes gid=208
    when: ansible_fqdn == 'node01.whysdomain.com'

with_items 迭代

host: web
remote: root
tasks: 
  - name: create nginx group
    group: name={{ item }} system=yes gid=208
    with_items: 
      - nginx
      - httpd

也支持hash的方式

host: web
remote: root
tasks: 
  - name: create nginx group
    group: name={{ item.name }} system=yes gid={{ item.gid }}
    with_items: 
      - { name: 'nginx', gid: 208 }
      - { name: 'httpd', gid: 209 }

templates

使用jijia2

tags

在某个或者某些task定义tag,然后执行ansible-playbook的时候指定tags参数就会执行带有该tag的task

host: web
remote: root
tasks: 
  - name: create nginx group
    group: name=nginx system=yes gid=208
    tag: always

特殊tag

always,不论指定了什么tags都会执行

roles

roles可以理解为yml的扩展