86113651 2019-06-28
Ansible是一个IT自动化工具。它可以配置系统、部署软件、以及编排更高级的IT任务,例如持续部署或零宕机滚动升级。
Ansible的目标是简单易用。它还很注重安全和可靠性,具有最小化的移动部件,使用OpenSSH传输(使用其他传输和拉取模式做替代品),并且语言是围绕人们可审计设计的,即便这些人对程序不太熟悉。
我们相信简单性和所有环境规模有关,所以我们为各种类型的繁忙用户进行设计: 包括开发人员、发布工程师、IT管理员、以及中间的所有人。Ansible适用于管理所有环境,从具有少量实例的小型设置到具有数千实例的企业环境。
Ansible用一种较少代理的方式管理机器。从来没有如何升级远程守护进程的问题,或因为守护进程不能卸载而不能管理系统的问题。因为OpenSSH是最受同行评议的开源组件之一,极大的降低了安全性的暴露。Ansible是无中心的,它依赖于你现有操作系统凭证来控制远程机器的。 如果需要,ansible可以很容易使用Kerberos(是一种计算机网络授权协议,用来在非安全网络中,对个人通信以安全的手段进行身份认证。)、LDAP、以及其他中心化授权管理系统来进行连接。
这里只介绍一种安装方式, 使用pip install ansible。其他更多安装方法可以参照链接: https://docs.ansible.com/ansi...
我们采用pip install的方式进行安装,因此默认是没有创建相关配置文件的。下面介绍如何配置ansible。
我使用的是macbook, 因此主要介绍macbook下面的配置。
# 1. 创建目录 mkdir ~/.ansible mkdir /etc/ansible # 2. 创建hosts文件 touch ~/.ansible/hosts # 3. 创建ansible配置文件ansible.cfg touch ~/.ansible/ansible.cfg # 4. 建立软链 ln -s ~/.ansible/hosts /etc/ansible/hosts ls -s ~/.ansible/ansible.cfg /etc/ansible/ansible.cfg
上面是创建目录、配置文件的命令操作,注意目录和文件权限问题。
以下是ansible配置文件内容:
[defaults] inventory = /etc/ansible/hosts library = /usr/share/my_modules/ remote_tmp = $HOME/.ansible/tmp pattern = * forks = 5 poll_interval = 15 sudo_user = root #执行sudo的默认用户 ask_sudo_pass = False #在执行sudo之前是否询问sudo密码 ask_pass = False #执行命令时是否询问密码 deprecation_warnings = False host_key_checking = False transport = smart remote_port = 22 module_lang = C gathering = implicit # 关闭第一次使用ansible连接客户端是输入命令提示 host_key_checking = False remote_user = root # 指定私钥文件路径 private_key_file = ~/.ssh/id_rsa #添加ansible日志 log_path = /var/log/ansible/ansible.log
ansible的所有参数都可以在ansible-playbook中或使用命令行标志来覆盖。ansible会读取配置文件的顺序如下(按查找的优先顺序列举出来的):
对于我这里的来说,首先找到/etc/ansible/ansible.cfg文件,因为我建立了软链。
下面介绍基本参数及含义:
gathering: 使用它的话,默认会收集事实,包括远程机器的信息。
还有其他更多配置参数可以参照后面的配置文件样本来查看。
要实现自动化运维,需要远程机器对本地机器进行认证。通过ssh-keygen产生公私匙,并通过ssh-copy-id命令向远程机器复制对本地机器的信任。
ssh-copy-id会将本地公匙复制到远程机器的~/.ssh/authorized_keys文件中。 这样本地机器ssh的时候可以使用本地私匙进行远程机器访问。
ssh-keygen -t rsa ssh-copy-id root@远程机器IP
在~/.ansible/hosts文件中添加如下内容:
# vim /etc/ansible/hosts [Client] angent_host_ip_1 angent_host_ip_2
# 定义域名 www.example.com # 定义IP 192.168.222.22 # 定义别名 Monitor ansible_ssh_port=12345 ansible_ssh_host=192.123.123.11
www[01:99].example.com db-[a-z].example.com
[webservers] 191.111.111.11 111.121.121.11 [dbservers] 112.232.12.12 121.121.121.11
使用下面命令进行ansible测试:
$ ansible Client -m ping 132.11.36.122 | SUCCESS => { "changed": false, "ping": "pong" }
显示如上类似内容表示配置ansible成功了。
出现这中错误的原因,一般是ssh到远程机器失败。 原因大致上可以有如下几种:
下面分别为具体远程机器设置ssh的用户名、密码以及端口号。
# ~/.ansible/hosts 192.168.128.83 ansible_port=22 ansible_user=root ansible_ssh_pass=root
具体在inventory中可以使用的参数列表如下:
更多参数介绍参照链接: https://docs.ansible.com/ansi...。
ansible支持很多模块,支持的模块分类大致如下:
另外还有大量的其他类型的模块,比如消息队列模块、监控模块、网络工具模块、网络模块、通知模块、远程管理模块、源码控制模块、存储模块等等。
更多模块参见: https://docs.ansible.com/ansi...。
ansible命令执行的模式如: ansible <host-pattern> [options], 通过指定主机模式和选项参数来执行。
例如:
ansible webservers -m command -a "free -m" 232.132.16.22 | SUCCESS | rc=0 >> total used free shared buff/cache available Mem: 992 101 69 0 821 725 Swap: 0 0 0
上面命令对远程主机组webservers执行free -m命令。
再例如下面的命令执行远程机器上的一个shell脚本:
ansible webservers -m shell -a "/data/servers/bin/restart.sh"
以下命令将本地/home/qiao/app下面的东西都拷贝到远程主机组webservers的/tmp目录下面,拷贝过去的文件所属用户和组都为root, 文件权限为0755。
ansible webservers -m copy -a "src=/home/qiao/app/* dest=/tmp owner=root group=root mode=0755
我们可以使用stat模块,获取远程文件的atime, ctime, mtime, md5, uid, gid等信息。
ansible test -m stat -a "path=/etc/syctl.conf"
ansible还可以使用远程主机进行翻墙下载文件,并传到本地, 而且还支持sha256sum文件校验。这个功能是不是很有用呢? 哈哈哈。
shell > ansible fanqiang -m get_url -a "url=http://www.baidu.com dest=/tmp/index.html mode=0440 force=yes"
通过ansible可以对远程主机进行crontab配置。
ansible webservers -m cron -a "name='check dirs' hour='5,2' job='ls -lah > /dev/null'" #效果如下: #* 5,2 * * * ls -alh > /dev/null
ansible Client -m mount -a "name=/mnt/data src=/dev/sd0 fstype=ext4 opts=ro state=present"
使用ansible还可以对远程主机系统服务进行管理,例如nginx的重启、停止、启动等操作。
ansible Client -m service -a "name=nginx state=stoped" ansible Client -m service -a "name=nginx state=restarted" ansible Client -m service -a "name=nginx state=reloaded"
有点碉堡的感觉。
shell > ansible Client -m user -a "name=wang comment='user wang'" shell > ansible Client -m user -a "name=wang state=absent remove=yes" # 添加删除用户
playbook是ansible的配置、部署以及编排语言。它们能描述一套你希望远程系统强制执行的策略,或者在IT过程中通用的一组步骤。
详细介绍见参考链接。
# vim batch-httpd.yml - hosts: webservers remote_user: root vars: httpd_port=80 tasks: - name: install httpd yum: name=http state=present - name: install php yum: name=php state=present - name: start httpd service: name=httpd state=started enabled=true
vim /root/second.yml - hosts: web1 remote_user: root vars: username: bob password: 123 tasks: - name: add user user: name={{ username }} state=present when: ansible_os_family == "Debian" - name: set password shell: echo {{ password }} |passwd --stdin {{ username }} - name: install httpd php yum: name={{ item }} state=present with_items: - httpd - php - name: add two users user: name={{ item }} state=present groups={{ item.groups }} with_items: - { name: 'user1', groups: 'group1'} - { name: 'user2', groups: 'group2'}
还有更多实例参见参考链接。
本文仅为个人学习记录使用,如有侵权,敬请告知,我会做调整。