Ansible自动化运维工具(1)

1. Ansible的架构

Ansible任务执行路程

Ansible的帮助文档:
http://www.ansible.com.cn/index.html

2. YAML语言简介

  • 基本规则

列表(list, [, , , ...])中的所有成员都开始与相同的缩进级别,并且使用“-”开头。要求-后边必须跟一个空格。

- apple
- banana
- orange
- pear

相应python输出

['apple', 'banana', 'orange', 'pear']

字典(dictionary, {key1:value1, key2:value2, key3:value3, ...})由一组“键:值”构成,且:后边必须跟一个空格。

node_a:
    conntimeout: 300
    external: 
    iface: eth0
    port: 556
    internal: 
    iface: eth0
    port: 778
    broadcast: 
    client: 1000
    server: 2000
node_b:
    0: 
    ip: 10.0.0.1
    name: b1
    1:
    ip: 10.0.0.2
    name: b2

相应python输出

{
    'node_b': {                       #注意嵌套层次。
        0: None,                      #注意空值。
        'ip': '10.0.0.2',             #注意key不能重复,重复则覆盖。
        'name': 'b2', 
        1: None
    }, 
    'node_a': {
        'iface': 'eth0', 
        'port': 778, 
        'server': 2000, 
        'broadcast': None,
        'client': 1000, 
        'external': None, 
        'conntimeout': 300, 
        'internal': None
    }
}

建议yaml文件以---最为开始行。

  • 说明示例
    test.yaml
---
name: Tom Smith
age: 37
spouse: 
    name: Jane Smith
    age: 35
children: 
    - name1: Jimmy Smith
      age1: 15
    - name2: Jenny Smith
      age2: 12
  • python的读取代码
#!/usr/bin/python

import yaml

file = open("test.yaml")
x = yaml.load(file)
print x

执行结果

{
    'age': 37,
    'spouse': {
        'age': 25,
        'name': 'Jane Smith'
    }, 
    'name': 'Tom Smith', 
    'children': [
        {
            'age1': 15, 
            'name1':  'Jimmy Smith'
        }, 
        {
            'age2': 12, 
            'name2': 'Jenny Smith'
        }
    ]
}
  • 再一个综合示例
---
name: Example Developer
job: Developer
skill: Elite
employed: True
foods: 
    - Apple
    - Orange
    - Strawberry
    - Mango
languages:
    ruby: Elite
    python: Elite
    dotnet: Lame

python的显示

{
    'name': 'Example Developer',
    'job': 'Developer',
    'skill': 'Elite', 
    'employed': True,
    'foods': [
        'Apple', 'Orange', 'Strawberry', 'Mango'
    ], 
    'languages': {
        'ruby': 'Elite',
        'python': 'Elite',
        'dotnet': 'Lame'
    } 
}

3. Ansible的安装

  • CentOS YUM的安装
先安装EPEL源
在主控端机器上安装
yum install -y ansible
ansible --version
测试安装是否成功
ansible 192.168.12.1 -m ping -k -u beeworkshop
注意:
-k 表示ssh使用密码认证(否则为密钥认证)
-u 指定ssh登陆的用户名
或者通过/etc/ansible/hosts配置
192.168.12.1 ansible_ssh_user=bee
来指定ssh登陆用户。
/etc/ansible/hosts文件中要配置192.168.12.1地址——相当于做白名单,否则不执行命令。
  • Ubuntu的安装
$ sudo apt-get install software-properties-common
$ sudo apt-add-repository ppa:ansible/ansible
$ sudo apt-get update
$ sudo apt-get install ansible
  • pip安装
$ sudo pip install ansible

4. Ansible的配置文件

  • /etc/ansible/hosts
# Ex 1: Ungrouped hosts, specify before any group headers.

## green.example.com
## blue.example.com
## 192.168.100.1
## 192.168.100.10

# Ex 2: A collection of hosts belonging to the 'webservers' group

## [webservers]
## alpha.example.org
## beta.example.org
## 192.168.1.100
## 192.168.1.110

# If you have multiple hosts following a pattern you can specify
# them like this:

## www[001:006].example.com

# Ex 3: A collection of database servers in the 'dbservers' group

## [dbservers]
## 
## db01.intranet.mydomain.net
## db02.intranet.mydomain.net
## 10.25.1.56
## 10.25.1.57

# Here's another example of host ranges, this time there are no
# leading 0s:

## db-[99:101]-node.example.com

Ansible通过定义号的主机和组规则Inventory指定了Ansible起作用的主机列表。Ansible默认读取/etc/ansible/hosts文件,以获得控制的主机。
如果不是默认位置的hosts文件需要使用-i选项指明:

ansible -i /home/beeworkshop/hosts bidder -m ping

localhost会被默认地添加到Inventory中。
一台主机可以属于多个组,但需使用优先级来避免冲突。
如果不是使用SSH的默认端口22,需要指定端口

bee.example.com:5555

别名的使用

jumper ansible_ssh_port=5555 ansible_ssh_host=192.168.1.50

指定连接类型和用户名

localhost ansible_connection=local
abc.exam.com ansible_connection=ssh ansible_ssh_user=abc
def.exam.com ansible_connection=ssh ansible_ssh_user=def
  • 主机变量
    供playbook配置使用。
[atlanta]
host1 http_port=80 maxRequestsPerChild=808
host2 http_port=303 maxRequestsPerChild=909
  • 组变量
    组变量的作用是覆盖组中的所有成员。
[atlanta]
host1
host2
[atlanta:vars]
ntp_server=ntp.atlanta.example.com
proxy=proxy.atlanta.example.com
  • 组嵌套
[atlanta]
host1
host2
[raleigh]
host2
host3
[southeast:children]
atlanta
raleigh
[usa:children]
southeast
northeast
southwest
northwest
  • 分离主机和组变量
    为了更好的规范定义主机和组变量,Ansible支持将hosts文件定义的主机名与组变量单独分离出来,并用YAML文件存储。其中Inventory目录和playbook目录均可以存放group_vars,host_vars,但playbook优先级更高。

5. Ansible常用模块

  • 帮助
ansible-doc -l
ansible-doc -s <module>
ansible 操作目标 -m 模块名 -a 模块参数
  • 常用模块的使用
(1) setup
获取客户机详细信息
ansible webserver -m setup

(2) copy
向客户机发送文件
关闭客户机的SELinux
ansible webserver -m command -a "yum install -y install libselinux-python"
ansible webserver -m copy -a "src=/usr/local/src/test.py dest=/tmp owner=root group=root mode 0755 force=yes"

force:
yes 覆盖
no 不存在时才复制文件

backup:
yes 覆盖之前备份原文件,备份文件包含时间
no 不备份

路径包含/  复制不包含该目录,只涉及目录中的内容
路径不包含/  复制包含该目录

(3) synchronize
需提前安装rsync
复制文件及目录至客户机
ansible 192.168.1.21 -m synchronize -a "src=/usr/local/src/ dest=/usr/local/src/ delete=yes compress=yes"
delete=yes 使两边内容一样——客户端不存在的新建,客户端不同的删除。
compress=yes 开启压缩
路径包含/  复制不包含该目录,只涉及目录中的内容
路径不包含/  复制包含该目录

(4) file
设置文件目录属性
group 定义文件目录的组
mode 定义文件目录的权限
owner 定义文件目录的属主
path 必选项,路径
recurse 递归设置文件属性,只对目录有效
src 链接原文件,只用于state=link
dest 链接目标,只用于state=link
force yes:覆盖,no:不覆盖
state 链接文件状态
link 创建软链接
directory 目录不存在则创建目录
file 即使文件不存在也不创建
absent 删除目录,文件,链接文件
touch 同touch命令

ansible 192.168.2.1 -m file -a "src=/usr/local/src/test.py dest=/tmp/test.py state=link"
ansible 192.168.2.1 -m command -a 'll /tmp/test.py'
ansible 192.168.2.1 -m file -a "path=/tmp/test.py state=absent"
ansible 192.168.2.1 -m file -a 'path=/tmp/test.py state=touch owner=root group=root mode=0755'
ansible webserver -m file -a  'path=/tmp/test state=directory owner=root group=root mode=0755'
posted @ 2019-07-03 01:02  cerana  阅读(170)  评论(0编辑  收藏  举报