ansible学习笔记之1

ansible学习笔记之1

ansible学习笔记之1

ansible 基础 ad-hoc 基础概念




说说运维工具的类型


>

运维工具按是否需要有代理程序来划分分为两类:
     agent(需要代理工具):
         基于专用的agent程序完成管理功能,此类型的工具有puppet,func,zabbix
     agentless(无需代理工具):
         基于通用的ssh服务完成管理,此类型的工具有ansible,fabric


ansible简介


Ansible是一个简单的自动化运维管理工具,基于Python语言实现,由Paramiko和PyYAML两个关键模块构建,可用于自动化部署应用、配置、编排task(持续交付、无宕机更新等)。主版本大概每2个月发布一次。

Ansible与Saltstack最大的区别是Ansible无需在被控主机部署任何客户端代理,默认直接通过SSH通道进行远程命令执行或下发配置:相同点是都具备功能强大、灵活的系统管理、状态配置,两者都提供丰富的模板及API,对云计算平台、大数据都有很好的支持。


ansible特点


    部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作;

    默认使用SSH协议对设备进行管理;

    主从集中化管理;

    配置简单、功能强大、扩展性强;

    支持API及自定义模块,可通过Python轻松扩展;

    通过Playbooks来定制强大的配置、状态管理;

    对云计算平台、大数据都有很好的支持;

    提供一个功能强大、操作性强的Web管理界面和REST API接口——AWX平台。

    幂等性:一种操作重复多次结果相同
    轻量级:无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;
    支持脚本:批量任务执行可以写成脚本,而且不用分发到远程就可以执行;
    基于python:使用python编写,维护更简单,ruby语法过于复杂;
    支持sudo:可以在无root权限的情况下完成任务。
    网上提供大量playbook,roles供使用

ansible架构


QQ图片20161116111536.png-155.9kB

Ansible:Ansible的核心程序  Host
 Lnventory:记录了每一个由Ansible管理的主机信息,信息包括ssh端口,root帐号密码,ip地址等等。可以通过file来加载,可以通过CMDB加载

Playbooks:YAML格式文件,多个任务定义在一个文件中,使用时可以统一调用,“剧本”用来定义那些主机需要调用那些模块来完成的功能.

Core
 Modules:ansible核心模块,Ansible执行任何管理任务都不是由Ansible自己完成,而是由核心模块完成;Ansible管理主机之前,先调用core
 Modules中的模块,然后指明管理Host Lnventory中的主机,就可以完成管理主机。

Custom Modules:自定义模块,完成Ansible核心模块无法完成的功能,此模块支持任何语言编写。

Connection Plugins:连接插件,Ansible和Host通信使用
 插件(plugins):完成模块功能的补充,借助于插件完成记录日志、邮件等功能。
 Ansible采用paramiko协议库(Fabric也使用这个),通过SSH或者ZeroMQ等连接主机。
 Ansible在控制主机将Ansible模块通过SSH协议(或者Kerberos、LDAP)推送到被管节点执行,执行完之后自动删除,可以使用SVN等来管理自定义模块及编排。排。从上图可以了解到,控制主机与被管节点之间支持local、SSH、ZeroMQ三种连接方式,默认使用基于SSH的连接。在规模较大的情况下使用ZeroMQ连接方式会明显改善执行速度。


ansible任务执行模式

Ansible系统由控制主机对被管节点的操作方式可分为两类,即ad-hoc和playbook:

·ad-hoc模式使用单个模块,支持批量执行单条命令。

·playbook模式是Ansible主要管理方式,也是Ansible功能强大的关键所在。playbook通过多个task集合完成一类功能,如Web服务的安装部署、数据库服务器的批量备份等。可以简单地把playbook理解为通过组合多条ad-hoc操作作的配置文件。

QQ图片20161114153134.png-209.1kB

ansible安装


ansible信息:
[root@cloud ~]# yum info ansible
Loaded plugins: fastestmirror, security
Loading mirror speeds from cached hostfile
 * base: centos.01link.hk
 * epel: free.nchc.org.tw
 * extras: centos.01link.hk
 * updates: centos.01link.hk
Available Packages
Name        : ansible
Arch        : noarch
Version     : 2.1.2.0
Release     : 1.el6
Size        : 3.5 M
Repo        : epel
Summary     : SSH-based configuration management, deployment, and task execution system
URL         : http://ansible.com
License     : GPLv3+
Description : 
            : Ansible is a radically simple model-driven configuration management,
            : multi-node deployment, and remote task execution system. Ansible works
            : over SSH and does not require any software or daemons to be installed
            : on remote nodes. Extension modules can be written in any language and
            : are transferred to managed machines automatically.
ansible安装:
yum install ansible -y
如果yum报错找不到,则尝试添加epel源:
 yum install epel* -y
安装生成如下文件:
[root@cloud ~]# rpm -ql ansible |head -n 20
/etc/ansible
/etc/ansible/ansible.cfg
/etc/ansible/hosts
/etc/ansible/roles
/usr/bin/ansible
/usr/bin/ansible-console
/usr/bin/ansible-doc
/usr/bin/ansible-galaxy
/usr/bin/ansible-playbook
/usr/bin/ansible-pull
/usr/bin/ansible-vault
/usr/lib/python2.6/site-packages/ansible
#输出内容过多 省略
其中程序文件为:
/etc/ansible  #ansible主程序
/usr/bin/ansible-doc  #ansible文档查看器
/usr/bin/ansible-galaxy 
#你可以把他理解成ansible的pip,可以从galaxy.ansible.com下载官方收录的playbooks
/usr/bin/ansible-playbook #playbook就是 用这个跑的
/usr/bin/ansible-pull  #支持直接从git下载playbook执行,需要遵循其规定的目录格式。
/usr/bin/ansible-vault 
# 如果你的配置文件中含有敏感信息,你可能并不希望他能被人看到,vault可以帮你加密/解密这个配置文件,高级用法,请参照http://blog.ansibleworks.com/2014/02/19/ansible-vault/
其中生成的配置文件为:
[root@cloud ~]# rpm -qc ansible 
/etc/ansible/ansible.cfg  #ansible主配置文件
/etc/ansible/hosts  # ansible主机列表

ansible 配置文件


ansible配置文件加载顺序:
    ansible配置文件是以ini格式存储配置数据的,在Ansible中,几乎所有的配置项都可以通过
    Ansible的playbook或环境变量来重新赋值。在运行Ansible命令时,命令将会按照预先设定的顺         序查找配置文件,如下所示:
    (1)ANSIBLE_CONFIG:首先,Ansible命令会检查环境变量,及这个环境变量将指向的配置文件。
    (2)/ansible.cfg:接着ansible会当前目录下的./ansible.cfg文件
    (3)~/.ansible.cfg:接着检查当前用户home目录下的.ansible.cfg文件
    (4)/etc/ansible/ansible.cfg:最后会检查/etc/ansible/ansible.cfg
注意:如果你通过发行版的提供的软件包管理工具(yum之类的)或者pip安装的ansible,那么在你的
/etc/ansible目录下已经有了ansible.cfg配置文件,如果你是通过GitHub仓库安装的,在你复制的仓库中examples目录下可以找到ansible.cfg,你可以把它拷贝到/etc/ansible目录下。

ansible配置选项:


可以使用环境变量的方式来进行配置:
     大多数的ansible参数都可以通过使用带有ANSIBLE_开头的环境变量进行配置,参数名称必须都是大写字母。比如:
     export ANSIBLE_SUDO_USER=root
     设置了环境变量之后,ANSIBLE_SUDO_USER就可以在playbook中直接引用。


设置ansible.cfg配置参数,ansible有许多参数,下面列出常用的参数:
     inventory:
             这个参数表示资源清单inventory文件的位置,资源清单就是一些Ansible需要连接管理的主             机列表。这个参数的配置实例如下:
         inventory = /etc/ansible/hosts
 library:Ansible的操作动作,无论是本地或远程,都使用一小段代码来执行,这小段代码称为模块,这个library参数就是指向存放Ansible模块的目录。配置实例如下:
  library = /usr/share/ansible
  Ansible支持多个目录方式,只要用冒号(:)隔开就可以,同时也会检查当前执行playbook位置下的./library目录。
     forks:
         设置默认情况下Ansible最多能有多少个进程同时工作,
         从Ansible 1.3开始,fork数量默认自动设置为主机数量或者潜在的主机数量,默认设置最多5个进         程并行处理。具体需要设置多少个,可以根据控制主机的性能和被管节点的数量来确定,可能是
         50或100。默认值5是非常保守的值,配置实例如下:
                         forks = 5
     sudo_user:
         这是设置默认执行命令的用户,也可以在playbook中重新设置这个参数。配置实例如下:

            sudo_user = root
remote_port:
    这是指定连接被管节点的管理端口,默认是22。除非设置了特殊的SSH端口,不然这个参数一般是         不需要修改的。配置实例如下:

        remote_port = 22
host_key_checking:
    这是设置是否检查SSH主机的密钥。可以设置为True或False,配置实例如下:
        host_key_checking = False
timeout:
    这是设置SSH连接的超时间隔,单位是秒。配置实例如下:
            timeout = 60
log_path:
    Ansible系统默认是不记录日志的,如果想把Ansible系统的输出记录到日志文件中,需要设置log_path来指定一个存储Ansible日志的文件。配置实例如下:
    log_path = /var/log/ansible.log
  另外需要注意,执行Ansible的用户需要有写入日志的权限,模块将会调用被管节点的syslog来记录,口令是不会出现在日志中的。

配置ansible使用公钥验证

    虽然ansible支持其他主机认证方式,但是我们最常用的的还是基于秘钥的认证:

1、首先生成秘钥

ssh-keygen -N ''
或者:
ssh-keygen -P '' -f ~/.ssh/id_rsa -t rsa

2、然后向主机分发秘钥:

 ssh-copy-id root@  #@后面跟主机名或者IP地址

3、如果出现以下情况:

# ssh-copy-id -i ~/.ssh/id_rsa.pub 10.1.6.72    
-bash: ssh-copy-id: command not found

请尝试:

yum -y install openssh-clients

ansible命令使用说明
 命令格式:

    ansible <host-pattern> [-f forks] [-m module_name] [-a args]

我们可以通过 ansible -h查看帮助

Usage: ansible <host-pattern> [options]

Options:
  -a MODULE_ARGS, --args=MODULE_ARGS    模块的参数,如果执行默认COMMAND的模块,即是命令参数,如:“date”,"pwd"等等
                        module arguments    模块参数
  -k, --ask-pass        ask for SSH password  登录密码,提示输入SSH密码而不是假设基于密钥的验证
  --ask-su-pass         ask for su password    su切换密码
  -K, --ask-sudo-pass   ask for sudo password  提示密码使用sudo,sudo表示提权操作
  --ask-vault-pass      ask for vault password
  -B SECONDS, --background=SECONDS     后台运行超时时间
                        run asynchronously, failing after X seconds
                        (default=N/A)
  -C, --check           don't make any changes; instead, try to predict some    只是测试一下会改变什么内容,不会真正去执行;相反,试图预测一些可能发生的变化
                        of the changes that may occur
  -c CONNECTION, --connection=CONNECTION   连接类型使用。可能的选项是paramiko(SSH),SSH和地方。当地主要是用于crontab或启动。
                        connection type to use (default=smart)
  -f FORKS, --forks=FORKS   并行任务数。NUM被指定为一个整数,默认是5
                        specify number of parallel processes to use
                        (default=5)
  -h, --help            show this help message and exit   打开帮助文档API
  -i INVENTORY, --inventory-file=INVENTORY    指定库存主机文件的路径,默认为/etc/ansible/hosts
                        specify inventory host file
                        (default=/etc/ansible/hosts)
  -l SUBSET, --limit=SUBSET    进一步限制所选主机/组模式  --limit=192.168.91.135 只对这个ip执行
                        further limit selected hosts to an additional pattern
  --list-hosts          outputs a list of matching hosts; does not execute
                        anything else
  -m MODULE_NAME, --module-name=MODULE_NAME   执行模块的名字,默认使用 command 模块,所以如果是只执行单一命令可以不用 -m参数
                        module name to execute (default=command)
  -M MODULE_PATH, --module-path=MODULE_PATH    要执行的模块的路径,默认为/usr/share/ansible/
                        specify path(s) to module library
                        (default=/usr/share/ansible/)
  -o, --one-line        condense output      压缩输出,摘要输出.尝试一切都在一行上输出。
  -P POLL_INTERVAL, --poll=POLL_INTERVAL    调查背景工作每隔数秒。需要- b
                        set the poll interval if using -B (default=15)
  --private-key=PRIVATE_KEY_FILE    私钥路径,使用这个文件来验证连接
                        use this file to authenticate the connection
  -S, --su              run operations with su    用 su 命令
  -R SU_USER, --su-user=SU_USER      指定SU的用户,默认是root用户
                        run operations with su as this user (default=root)
  -s, --sudo            run operations with sudo (nopasswd)    
  -U SUDO_USER, --sudo-user=SUDO_USER    sudo到哪个用户,默认为 root  
                        desired sudo user (default=root)
  -T TIMEOUT, --timeout=TIMEOUT    指定SSH默认超时时间,  默认是10S
                        override the SSH timeout in seconds (default=10)
  -t TREE, --tree=TREE  log output to this directory     将日志内容保存在该输出目录,结果保存在一个文件中在每台主机上。
  -u REMOTE_USER, --user=REMOTE_USER    远程用户, 默认是root用户
                        connect as this user (default=root)
  --vault-password-file=VAULT_PASSWORD_FILE  
                        vault password file
  -v, --verbose         verbose mode (-vvv for more, -vvvv to enable    详细信息
                        connection debugging)
  --version             show program's version number and exit   输出ansible的版本

ansible主机清单设置
     编辑/etc/ansible/hosts:

#vim /etc/ansible/hosts

定义方式:
1、直接指明主机地址或主机名:

www.desperadochn.vip  192.1682.125

2、定义一个主机组[组名]把地址或主机名加进去

[mysql_test]
192.168.253.159
192.168.253.160
192.168.253.153  
#组成员可以使用通配符来匹配,如下  
192.168.2.[1:6]  #表示匹配从192.168.2.1——192.168.2.6的主机

3、如果你没有使用公钥,想要使用密码,你也可以这样写(适用于第一次登陆控制):

  格式:【主机名】 【主机地址】 【主机密码】  默认是root用户来进行的

  [keepalived]
  keepalived1  ansible_ssh_host=192.168.146.136 ansible_ssh_pass="test"
  keepalived2  ansible_ssh_host=192.168.146.137 ansible_ssh_pass="test"

ansible-doc


一般用法:

ansible-doc -l 获取模块信息

ansible-doc -s MOD_NAME 获取指定模块的使用帮助


查看 ansible-doc 的使用说明:

# ansible-doc  -h
Usage: ansible-doc [options] [module...]

Options:
  -h, --help            show this help message and exit  # 显示命令参数API文档
  -l, --list            List available modules  #列出可用的模块
  -M MODULE_PATH, --module-path=MODULE_PATH   #指定模块的路径
                        specify path(s) to module library (default=None)
  -s, --snippet         Show playbook snippet for specified module(s)  
  #显示playbook制定模块的用法
  --version             show program's version number and exit  #  显示ansible-doc的版本号

查看模块列表:

# ansible-doc -l

查看指定模块参数(举例):

[root@ansiable ~]# ansible-doc -s mysql_replication
- name: Manage MySQL replication
  action: mysql_replication
      config_file            # Specify a config file from which user and password are to be read
      connect_timeout        # The connection timeout when connecting to the MySQL server.
      login_host             # Host running the database
      login_password         # The password used to authenticate with
      login_port             # Port of the MySQL server. Requires login_host be defined as other then localhost if login_port is used
      login_unix_socket      # The path to a Unix domain socket for local connections
      login_user             # The username used to authenticate with
      master_auto_position   # does the host uses GTID based replication or not
      master_connect_retry   # same as mysql variable
      master_host            # same as mysql variable
      master_log_file        # same as mysql variable
      master_log_pos         # same as mysql variable
      master_password        # same as mysql variable
      master_port            # same as mysql variable
      master_ssl             # same as mysql variable
      master_ssl_ca          # same as mysql variable
      master_ssl_capath      # same as mysql variable
      master_ssl_cert        # same as mysql variable
      master_ssl_cipher      # same as mysql variable
      master_ssl_key         # same as mysql variable
      master_user            # same as mysql variable
      mode                   # module operating mode. Could be getslave (SHOW SLAVE STATUS), getmaster (SHOW MASTER STATUS), changemaster (CHANGE MASTER TO), startslave (START SLAVE), stopslave (STOP SLAVE), resetslave (RESET SLAVE), resetslaveall (RESET SLAVE ALL)
      relay_log_file         # same as mysql variable
      relay_log_pos          # same as mysql variable
      ssl_ca                 # The path to a Certificate Authority (CA) certificate. This option, if used, must specify the same certificate as used by the server.
      ssl_cert               # The path to a client public key certificate.
      ssl_key                # The path to the client private key.

ansible ad-hoc实战

1、主机连通性测试:

 #ansible all -m ping

执行效果如下:

[root@desperadochn ~]# ansible all -m ping
192.168.253.138 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
192.168.253.137 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

2、command:在远程主机执行命令;不支持|管道命令

[root@desperadochn ~]# ansible all -m command -a 'ifconfig'
192.168.253.137 | SUCCESS | rc=0 >>
eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.253.137  netmask 255.255.255.0  broadcast 192.168.253.255
        inet6 fe80::20c:29ff:fef6:313f  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:f6:31:3f  txqueuelen 1000  (Ethernet)
        RX packets 296  bytes 97349 (95.0 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 267  bytes 78840 (76.9 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 0  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
192.168.253.138 | SUCCESS | rc=0 >>
eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.253.138  netmask 255.255.255.0  broadcast 192.168.253.255
        inet6 fe80::20c:29ff:fe63:6347  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:63:63:47  txqueuelen 1000  (Ethernet)
        RX packets 248  bytes 93662 (91.4 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 213  bytes 40660 (39.7 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 0  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
[root@ansiable ~]# ansible webservers -m command -a 'cat /etc/passwd |grep "root"'  #实验结果可见 不支持管道
192.168.253.142 | FAILED | rc=1 >>
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
#输出结果过多省略
192.168.253.151 | FAILED | rc=1 >>
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
#输出结果过多省略

3、shell模块在远程主机上调用shell解释器运行命令,支持shell的各种功能,例如管道等 :

[root@ansiable ~]# ansible webservers -m shell -a 'cat /etc/passwd |grep "root"'
192.168.253.142 | SUCCESS | rc=0 >>
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

192.168.253.151 | SUCCESS | rc=0 >>
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

ps:当你不熟悉ansible模块时可以用这个模块,就和你在shell下操作差不多

4、copy:复制文件到远程主机,可以改权限等


用法:
(1) 复制文件
   -a "src=  dest=  "
(2) 给定内容生成文件
       -a "content=  dest=  "

[root@ansiable ~]# ansible webservers -m copy -a 'content="hello\nworld" dest=/tmp/test.ansible mode=666'
192.168.253.151 | SUCCESS => {
    "changed": true, 
    "checksum": "7db827c10afc1719863502cf95397731b23b8bae", 
    "dest": "/tmp/test.ansible", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "9195d0beb2a889e1be05ed6bb1954837", 
    "mode": "0666", 
    "owner": "root", 
    "secontext": "unconfined_u:object_r:admin_home_t:s0", 
    "size": 11, 
    "src": "/root/.ansible/tmp/ansible-tmp-1476904825.49-108215123145144/source", 
    "state": "file", 
    "uid": 0
}
192.168.253.142 | SUCCESS => {
    "changed": true, 
    "checksum": "7db827c10afc1719863502cf95397731b23b8bae", 
    "dest": "/tmp/test.ansible", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "9195d0beb2a889e1be05ed6bb1954837", 
    "mode": "0666", 
    "owner": "root", 
    "secontext": "unconfined_u:object_r:admin_home_t:s0", 
    "size": 11, 
    "src": "/root/.ansible/tmp/ansible-tmp-1476904825.52-218080449424453/source", 
    "state": "file", 
    "uid": 0
}
[root@ansiable ~]# ansible webservers -m shell -a 'cat /tmp/test.ansible'
192.168.253.142 | SUCCESS | rc=0 >>
hello
world

192.168.253.151 | SUCCESS | rc=0 >>
hello
world

相关选项如下: backup:在覆盖之前,将源文件备份,备份文件包含时间信息。有两个选项:yes|no
 content:用于替代“src”,可以直接设定指定文件的值
 dest:必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录
 directory_mode:递归设定目录的权限,默认为系统默认权限
 force:如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,如果为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes
 others:所有的file模块里的选项都可以在这里使用
 src:被复制到远程主机的本地文件,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用“/”来结尾,则只复制目录里的内容,如果没有使用“/”来结尾,则包含目录在内的整个内容全部复制,类似于rsync。


5、file 设置文件属性:
创建目录:-a "path= state=directory"
创建链接文件:-a "path= src=   state=link"
删除文件:-a "path=   state=absent"

[root@ansiable ~]# ansible webservers -m file -a 'path=/tmp/test state=directory'
192.168.253.151 | SUCCESS => {
    "changed": true, 
    "gid": 0, 
    "group": "root", 
    "mode": "0755", 
    "owner": "root", 
    "path": "/tmp/test", 
    "secontext": "unconfined_u:object_r:user_tmp_t:s0", 
    "size": 6, 
    "state": "directory", 
    "uid": 0
}
192.168.253.142 | SUCCESS => {
    "changed": true, 
    "gid": 0, 
    "group": "root", 
    "mode": "0755", 
    "owner": "root", 
    "path": "/tmp/test", 
    "secontext": "unconfined_u:object_r:user_tmp_t:s0", 
    "size": 6, 
    "state": "directory", 
    "uid": 0
}
[root@ansiable ~]# ansible webservers -m shell -a 'ls -ld /tmp/test'
192.168.253.142 | SUCCESS | rc=0 >>
drwxr-xr-x. 2 root root 6 10月 17 02:46 /tmp/test

192.168.253.151 | SUCCESS | rc=0 >>
drwxr-xr-x. 2 root root 6 10月 17 02:21 /tmp/test

其他选项如下:

force:需要在两种情况下强制创建软链接,一种是源文件不存在,但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no
 group:定义文件/目录的属组 mode:定义文件/目录的权限 owner:定义文件/目录的属主 path:必选项,定义文件/目录的路径
 recurse:递归设置文件的属性,只对目录有效 src:被链接的源文件路径,只应用于state=link的情况
 dest:被链接到的路径,只应用于state=link的情况 state:
        directory:如果目录不存在,就创建目录
        file:即使文件不存在,也不会被创建
        link:创建软链接
        hard:创建硬链接
        touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
        absent:删除目录、文件或者取消链接文件

6、fetch从远程某主机获取文件到本地:


dest:用来存放文件的目录,例如存放目录为backup,源文件名称为/etc/profile在主机pythonserver中,那么保存为/backup/pythonserver/etc/profile
 Fail_on_missing:当源文件不存在的时候,标识为失败
 Flat:允许覆盖默认行为从hostname/path到/file的,如果dest以/结尾,它将使用源文件的基础名称
 Src:在远程拉取的文件,并且必须是一个file,不能是目录 Validate_checksum:当文件fetch之后进行md5检查


实例:

[root@ansiable ~]# ansible webservers -m fetch -a 'src=/var/log/messages dest=/root'
192.168.253.142 | SUCCESS => {
    "changed": true, 
    "checksum": "5b28cfc1e2926a64441fa3a7e3a6968fe3cdb416", 
    "dest": "/root/192.168.253.142/var/log/messages", 
    "md5sum": "f843282c8246d545ef07205d5094ada7", 
    "remote_checksum": "5b28cfc1e2926a64441fa3a7e3a6968fe3cdb416", 
    "remote_md5sum": null
}
192.168.253.151 | SUCCESS => {
    "changed": true, 
    "checksum": "42e78594b997f0a5881a8d58451984830176d4b7", 
    "dest": "/root/192.168.253.151/var/log/messages", 
    "md5sum": "3fee43ed3aa7c344be6a7527363bf8be", 
    "remote_checksum": "42e78594b997f0a5881a8d58451984830176d4b7", 
    "remote_md5sum": null
}
[root@ansiable ~]# pwd
/root[root@ansiable ~]# pwd
/root[root@ansiable ~]# pwd
/root

[root@ansiable ~]# ll
总用量 5264
drwxr-xr-x. 3 root root      16 10月 20 04:08 192.168.253.142
drwxr-xr-x. 3 root root      16 10月 20 04:08 192.168.253.151
-rw-------. 1 root root     927 10月  6 09:37 anaconda-ks.cfg
-rw-r--r--. 1 root root    7786 10月 16 23:25 hellodb.sql
drwxr-xr-x. 2 root root      26 10月 16 15:05 inventory
-rw-r--r--. 1 root root      76 10月 16 15:05 inventory.cfg
-rw-r--r--. 1 root root     699 10月 16 14:36 my.cnf
-rw-r--r--. 1 root root    2471 10月 19 23:18 nginx.conf
-rw-r--r--. 1 root root 5361532 10月 16 23:25 percona-xtrabackup-2.3.4-1.el7.x86_64.rpm
-rw-r--r--. 1 root root     749 10月 19 23:25 test.yml

[root@ansiable 192.168.253.142]# tree /root/192.168.253.142/
/root/192.168.253.142/
└── var
    └── log
        └── messages

2 directories, 1 file

7、cron 管理cron计划任务:


  • a "": 设置管理节点生成定时任务
     action: cron backup=    # 如果设置,创建一个crontab备份  
     cron_file=          #如果指定, 使用这个文件cron.d,而不是单个用户
     crontab day=       #日应该运行的工作( 1-31, *, */2,  )  
     hour=      # 小时 ( 0-23, *, */2, )
     job=       #指明运行的命令是什么  
     minute=    #分钟( 0-59, *, */2, )  
     month=     # 月( 1-12, *, /2,  )  
     name=     #定时任务描述  
     reboot    # 任务在重启时运行,不建议使用,建议使用special_time  
     special_time       #特殊的时间范围,参数:reboot(重启时),annually(每年),monthly(每月),weekly(每周),daily(每天),hourly(每小时)
     state        #指定状态,prsent表示添加定时任务,也是默认设置,absent表示删除定时任务
     user         # 以哪个用户的身份执行  
     weekday      # 周 ( 0-6 for Sunday-Saturday,
    ,  )

[root@ansiable ~]#  ansible mysql_test -m cron -a 'name="sync time from ntpserver" minute="*/10" job="/sbin/ntpdate  asia.pool.ntp.org &>/dev/null" '
192.168.253.153 | SUCCESS => {
    "changed": true, 
    "envs": [], 
    "jobs": [
        "sync time from ntpserver"
    ]
}
192.168.253.160 | SUCCESS => {
    "changed": true, 
    "envs": [], 
    "jobs": [
        "sync time from ntpserver"
    ]
}
192.168.253.159 | SUCCESS => {
    "changed": true, 
    "envs": [], 
    "jobs": [
        "sync time from ntpserver"
    ]
}
[root@ansiable ~]#  ansible mysql_test -m shell -a 'ntpdate asia.pool.ntp.org'  #手动与远程时间服务器对时
192.168.253.160 | SUCCESS | rc=0 >>
19 Oct 11:27:44 ntpdate[15538]: adjust time server 157.7.208.12 offset 0.062686 sec

192.168.253.153 | SUCCESS | rc=0 >>
19 Oct 11:27:44 ntpdate[13818]: step time server 157.7.208.12 offset 69154.488409 sec

192.168.253.159 | SUCCESS | rc=0 >>
19 Oct 11:27:45 ntpdate[15592]: adjust time server 157.7.208.12 offset 0.062411 sec
[root@ansiable ~]# ansible mysql_test -m shell -a 'date'   #查看时间是否一致
192.168.253.153 | SUCCESS | rc=0 >>
2016年 10月 19日 星期三 11:31:52 CST

192.168.253.159 | SUCCESS | rc=0 >>
2016年 10月 19日 星期三 11:31:52 CST

192.168.253.160 | SUCCESS | rc=0 >>
2016年 10月 19日 星期三 11:31:52 CST
[root@ansiable ~]# ansible mysql_test -m shell -a 'crontab -l'   #查看是否启用时间同步的计划任务
192.168.253.153 | SUCCESS | rc=0 >>
#Ansible: sync time from ntpserver
*/10 * * * * /sbin/ntpdate  asia.pool.ntp.org &>/dev/null

192.168.253.160 | SUCCESS | rc=0 >>
#Ansible: sync time from ntpserver
*/10 * * * * /sbin/ntpdate  asia.pool.ntp.org &>/dev/null

192.168.253.159 | SUCCESS | rc=0 >>
#Ansible: sync time from ntpserver
*/10 * * * * /sbin/ntpdate  asia.pool.ntp.org &>/dev/null

8、yum yum安装软件,也可以使用apt,zypper等工具:


conf_file         #设定远程yum安装时所依赖的配置文件。如配置文件没有在默认的位置。

disable_gpg_check    #是否禁止GPG checking,只用于`present' or `latest'。

disablerepo   #临时禁止使用yum库。 只用于安装或更新时。

enablerepo    #临时使用的yum库。只用于安装或更新时。

name=            #所安装的包的名称

state               #present安装, latest安装最新的, absent 卸载软件。

update_cache  #强制更新yum的缓存。
[root@ansiable ~]# ansible webservers -m yum -a 'name=htop state=present'  #安装个htop试试
192.168.253.142 | SUCCESS => {
    "changed": true, 
    "msg": "", 
    "rc": 0, 
    "results": [
        "Loaded plugins: fastestmirror\nLoading mirror speeds from cached hostfile\n * base: mirrors.tuna.tsinghua.edu.cn\n * epel: mirrors.tuna.tsinghua.edu.cn\n * extras: mirror.bit.edu.cn\n * updates: mirror.bit.edu.cn\nResolving Dependencies\n--> Running transaction check\n---> Package htop.x86_64 0:2.0.2-1.el7 will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package         Arch              Version                Repository       Size\n================================================================================\nInstalling:\n htop            x86_64            2.0.2-1.el7            epel             98 k\n\nTransaction Summary\n================================================================================\nInstall  1 Package\n\nTotal download size: 98 k\nInstalled size: 207 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Installing : htop-2.0.2-1.el7.x86_64                                      1/1 \n  Verifying  : htop-2.0.2-1.el7.x86_64                                      1/1 \n\nInstalled:\n  htop.x86_64 0:2.0.2-1.el7                                                     \n\nComplete!\n"
    ]
}
192.168.253.151 | SUCCESS => {
    "changed": true, 
    "msg": "", 
    "rc": 0, 
    "results": [
        "Loaded plugins: fastestmirror\nLoading mirror speeds from cached hostfile\n * base: mirrors.163.com\n * epel: repo.fedoralinux.ir\n * extras: mirrors.cn99.com\n * updates: centos.ustc.edu.cn\nResolving Dependencies\n--> Running transaction check\n---> Package htop.x86_64 0:2.0.2-1.el7 will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package         Arch              Version                Repository       Size\n================================================================================\nInstalling:\n htop            x86_64            2.0.2-1.el7            epel             98 k\n\nTransaction Summary\n================================================================================\nInstall  1 Package\n\nTotal download size: 98 k\nInstalled size: 207 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Installing : htop-2.0.2-1.el7.x86_64                                      1/1 \n  Verifying  : htop-2.0.2-1.el7.x86_64                                      1/1 \n\nInstalled:\n  htop.x86_64 0:2.0.2-1.el7                                                     \n\nComplete!\n"
    ]
}
[root@ansiable ~]# ansible webservers -m shell -a 'htop'   #成功
192.168.253.151 | SUCCESS | rc=0 >>


192.168.253.142 | SUCCESS | rc=0 >>

9、service: 服务程序管理


arguments         #命令行提供额外的参数  
 enabled           #设置开机启动。  
 name=        #服务名称  
 runlevel          #开机启动的级别,一般不用指定。  
 sleep             #在重启服务的过程中,是否等待。如在服务关闭以后等待2秒再启动。  
 state     #started启动服务, stopped停止服务, restarted重启服务, reloaded重载配置


启动nginx服务并设置范围自启动:

[root@ansiable ~]# ansible webservers -m service -a 'name=nginx state=started enabled=true'
192.168.253.142 | SUCCESS => {
    "changed": false, 
    "enabled": true, 
    "name": "nginx", 
    "state": "started"
}
192.168.253.151 | SUCCESS => {
    "changed": false, 
    "enabled": true, 
    "name": "nginx", 
    "state": "started"
}

10、User 用户管理:


-a "" action: user comment    # 用户的描述信息  
 createhom  # 是否创建家目录  
 force      # 在使用state=absent'是, 行为与userdel –force'一致.  
 group      # 指定基本组  
 groups     # 指定附加组,如果指定为('groups=')表示删除所有组  
 home       # 指定用户家目录
 login_class     #可以设置用户的登录类 FreeBSD, OpenBSD and NetBSD系统.  
 move_home
   # 如果设置为home='时, 试图将用户主目录移动到指定的目录  
 name=           # 指定用户名  
 non_unique      # 该选项允许改变非唯一的用户ID值  
 password        # 指定用户密码  
 remove          # 在使用
state=absent'时, 行为是与 `userdel –remove'一致.
 shell           #指定默认shell  
 state           #设置帐号状态,不指定为创建,指定值为absent表示删除  
 system        # 当创建一个用户,设置这个用户是系统用户。这个设置不能更改现有用户。  
 uid             #指定用户的uid  
 update_password  # 更新用户密码  
 expires         #指明密码的过期时间


创建用户baibudonghei并添加密码,uid为1234

[root@ansiable ~]# ansible webservers -m user -a 'name=baibudonghei uid=1234 password=321654RESTa'
192.168.253.151 | SUCCESS => {
    "changed": true, 
    "comment": "", 
    "createhome": true, 
    "group": 1234, 
    "home": "/home/baibudonghei", 
    "name": "baibudonghei", 
    "password": "NOT_LOGGING_PASSWORD", 
    "shell": "/bin/bash", 
    "state": "present", 
    "system": false, 
    "uid": 1234
}
192.168.253.142 | SUCCESS => {
    "changed": true, 
    "comment": "", 
    "createhome": true, 
    "group": 1234, 
    "home": "/home/baibudonghei", 
    "name": "baibudonghei", 
    "password": "NOT_LOGGING_PASSWORD", 
    "shell": "/bin/bash", 
    "state": "present", 
    "system": false, 
    "uid": 1234
}
[root@ansiable ~]# ansible webservers -m shell -a 'id baibudonghei'
192.168.253.151 | SUCCESS | rc=0 >>
uid=1234(baibudonghei) gid=1234(baibudonghei) 组=1234(baibudonghei)

192.168.253.142 | SUCCESS | rc=0 >>
uid=1234(baibudonghei) gid=1234(baibudonghei) 组=1234(baibudonghei)

11、group组管理:


gid       # 设置组的GID号
name=     # 管理组的名称
state     # 指定组状态,默认为创建,设置值为absent为删除
system    # 设置值为yes,表示为创建系统组

创建名为desperadousa的组并设置gid为6666

[root@ansiable ~]# ansible webservers -m group -a 'name=desperadousa gid=6666 '
192.168.253.142 | SUCCESS => {
    "changed": true, 
    "gid": 6666, 
    "name": "desperadousa", 
    "state": "present", 
    "system": false
}
192.168.253.151 | SUCCESS => {
    "changed": true, 
    "gid": 6666, 
    "name": "desperadousa", 
    "state": "present", 
    "system": false
}
[root@ansiable ~]# ansible webservers -m shell -a 'cat /etc/group'
192.168.253.151 | SUCCESS | rc=0 >>
root:x:0:
bin:x:1:
#中间因篇幅问题省略部分
zabbix:x:992:
baibudonghei:x:1234:
desperadousa:x:6666:

192.168.253.142 | SUCCESS | rc=0 >>
root:x:0:
bin:x:1:
#中间因篇幅问题省略部分
zabbix:x:992:
baibudonghei:x:1234:
desperadousa:x:6666:

12、setup:获取指定主机的facts。


facts组件是Ansible用于采集被管机器设备信息的一个功能,我们可以使用setup模块查机器的所有facts信息,可以使用filter来查看指定信息。整个facts信息被包装在一个JSON格式的数据结构中,ansible_facts是最上层的值。
 facts就是变量,内建变量 。每个主机的各种信息,cpu颗数、内存大小等。会存在facts中的某个变量中。调用后返回很多对应主机的信息,在后面的操作中可以根据不同的信息来做不同的操作。如redhat系列用yum安装,而debian系列用apt来安装软件。


获取主机变量:

[root@ansiable ~]# ansible webservers -m setup
192.168.253.151 | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "192.168.253.151"
        ], 
        "ansible_all_ipv6_addresses": [
            "fe80::20c:29ff:fe56:5671"
        ], 
        "ansible_architecture": "x86_64", 
        "ansible_bios_date": "07/31/2013", 
        "ansible_bios_version": "6.00", 
        "ansible_cmdline": {
            "BOOT_IMAGE": "/vmlinuz-3.10.0-327.el7.x86_64", 
            "LANG": "zh_CN.UTF-8", 
            "crashkernel": "auto", 
            "quiet": true, 
            "rd.lvm.lv": "centos/swap", 
            "rhgb": true, 
            "ro": true, 
            "root": "/dev/mapper/centos-root"
        }, 
      #中间因篇幅问题省略n行
        "ansible_userspace_bits": "64", 
        "ansible_virtualization_role": "guest", 
        "ansible_virtualization_type": "VMware", 
        "module_setup": true
    }, 
    "changed": false
}
192.168.253.142 | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "192.168.253.142"
        ], 
        "ansible_all_ipv6_addresses": [
            "fe80::20c:29ff:fe56:217b"
        ], 
        "ansible_architecture": "x86_64", 
        "ansible_bios_date": "07/31/2013", 
        "ansible_bios_version": "6.00", 
        "ansible_cmdline": {
            "BOOT_IMAGE": "/vmlinuz-3.10.0-327.el7.x86_64", 
            "LANG": "zh_CN.UTF-8", 
            "crashkernel": "auto", 
            "quiet": true, 
            "rd.lvm.lv": "centos/swap", 
            "rhgb": true, 
            "ro": true, 
            "root": "/dev/mapper/centos-root"
        }, 
       #中间省略n行
        "ansible_system_capabilities_enforced": "True", 
        "ansible_system_vendor": "VMware, Inc.", 
        "ansible_uptime_seconds": 28593, 
        "ansible_user_dir": "/root", 
        "ansible_user_gecos": "root", 
        "ansible_user_gid": 0, 
        "ansible_user_id": "root", 
        "ansible_user_shell": "/bin/bash", 
        "ansible_user_uid": 0, 
        "ansible_userspace_architecture": "x86_64", 
        "ansible_userspace_bits": "64", 
        "ansible_virtualization_role": "guest", 
        "ansible_virtualization_type": "VMware", 
        "module_setup": true
    }, 
    "changed": false
}

13、script 发送脚本到各被管理节点,并执行。不需要参数


发送脚本test.py至远程主机并执行:

[root@ansiable ~]# cat test.py 
#!/usr/bin/python
print("hellow world")
[root@ansiable ~]# ansible webservers -m script -a 'test.py'
192.168.253.151 | SUCCESS => {
    "changed": true, 
    "rc": 0, 
    "stderr": "", 
    "stdout": "hellow world\r\n", 
    "stdout_lines": [
        "hellow world"
    ]
}
192.168.253.142 | SUCCESS => {
    "changed": true, 
    "rc": 0, 
    "stderr": "", 
    "stdout": "hellow world\r\n", 
    "stdout_lines": [
        "hellow world"
    ]
}

小结

ansible的出现确实省去了许多繁琐的工作,作为一个运维狗必须好好学习,下一次会写一篇ad-hoc实战配服务的博文。

参考文献
http://www.178linux.com/58381   《Ansible 详细用法说明》 作者:qzx
《ansible自动化运维技术与最佳实践》  作者:陈金窗 沈灿 刘政委

原创文章,作者:Net17_desperado,如若转载,请注明出处:http://www.178linux.com/59472

(0)
Net17_desperadoNet17_desperado
上一篇 2016-11-21
下一篇 2016-11-21

相关推荐

  • 程序包管理

    什么是程序包管理器?     顾名思义,就是将编译好的应用程序的各组成文件打包成一个或多个程序包文件,从而更方便地实现程序包的安装、升级、卸载还有查询等管理操作。 那么一个程序包又由哪些部分组成呢? 程序包的组成清单:   文件清单(每个程序包都单独实现):       安装或卸载时运行的脚本,有如下四类:     preinstall : 安装过程开始之前…

    Linux干货 2016-12-16
  • test

    test the URL.

    Linux干货 2016-12-03
  • 浅谈DNS基本原理以及实现方法(二)

             DNS作为互联网服务的一个基础型服务,了解和掌握DNS服务的原理和配置将是每一个运维人员必备的技能,这就如同闯荡江湖的侠客不但要有的招式,还要懂的运用这些招式的心法一样,接下来我将从DNS的正反向解析、主从同步、子域授权以及Bind view这四个方面来揭开它神…

    Linux干货 2015-12-19
  • 第十一周

    1、详细描述一次加密通讯的过程,结合图示最佳。 2、描述创建私有CA的过程,以及为客户端发来的证书请求进行办法证书。 CA 服务器端: (1)生成 CA 服务器的私钥 (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096) (2)生成 CA服务器自谦证书 openssl req …

    Linux干货 2017-03-30
  • grep命令

    ]# chmod -R 700 /home/tuser1 ]# ll /home/tuser1/ total 0 drwx——. 2 root root 72 Nov 20 17:33 skel 新增用户与组: 显示/proc/meminfo: 显示shell 非 /sbin/nologin 的用户 找出/etc/passwd文件中一…

    Linux干货 2016-11-20