简介
Ansible 简单的说是一个配置管理系统(configuration management system)。官方的title是“Ansible is Simple IT Automation”——简单的自动化IT工具。你只需要可以使用 ssh 访问你的服务器或设备就行。你可以将代码部署到任意数量的服务器上! Ansible跟其他IT自动化技术的区别在于其关注点并非配置管理、应用部署或IT流程工作流,而是提供一个统一的界面来协调所有的IT自动化功能,因此Ansible的系统更加易用,部署更快。 Ansible可以让用户避免编写脚本或代码来管理应用,同时还能搭建工作流实现IT任务的自动化执行。IT自动化可以降低技术门槛及对传统IT的依赖,从而加快项目的交付速度。
安装
因为Ansible是基于python编写的,所以我这里使用pip安装 命令
代码语言:javascript复制pip install ansible
因为pip安装是不会生成配置文件,一切都用默认的运行,如果需要修改默认配置的话,所以需要自己生成模板可以自己下载,然后在用户主目录下生成一个ansible.cfg文件,把模板复制进去就好了 然后
代码语言:javascript复制➜ ~ ansible --version
ansible 2.7.8
config file = /home/kevin/ansible.cfg
configured module search path = ['/home/kevin/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /home/kevin/.pyenv/versions/3.6.1/lib/python3.6/site-packages/ansible
executable location = /home/kevin/.pyenv/versions/3.6.1/bin/ansible
看到config file=
有输出就好了
ansible有个主机清单的文件
如果你用centos的yum源安装的话会在/etc/ansibe/hosts
,但是因为我是pip安装的所以需要自己指定,
mkdir /ansible
vi hosts
#添加自己的主机ip,如果有dns服务的可以填自己服务器的FQDN
[test]
192.168.30.105 ansible_ssh_user=root
192.168.30.106 ansible_ssh_user=root
192.168.30.107 ansible_ssh_user=root
后面的ansible_ssh_user=root表示服务器使用的用户,
参数说明
代码语言:javascript复制ansible_ssh_host
将要连接的远程主机名.与你想要设定的主机的别名不同的话,可通过此变量设置.
ansible_ssh_port
ssh端口号.如果不是默认的端口号,通过此变量设置.
ansible_ssh_user
默认的 ssh 用户名
ansible_ssh_pass
ssh 密码(这种方式并不安全,我们强烈建议使用 --ask-pass 或 SSH 密钥)
ansible_sudo_pass
sudo 密码(这种方式并不安全,我们强烈建议使用 --ask-sudo-pass)
ansible_sudo_exe (new in version 1.8)
sudo 命令路径(适用于1.8及以上版本)
ansible_connection
与主机的连接类型.比如:local, ssh 或者 paramiko. Ansible 1.2 以前默认使用 paramiko.1.2 以后默认使用 'smart','smart' 方式会根据是否支持 ControlPersist, 来判断'ssh' 方式是否可行.
ansible_ssh_private_key_file
ssh 使用的私钥文件.适用于有多个密钥,而你不想使用 SSH 代理的情况.
ansible_shell_type
目标系统的shell类型.默认情况下,命令的执行使用 'sh' 语法,可设置为 'csh' 或 'fish'.
ansible_python_interpreter
目标主机的 python 路径.适用于的情况: 系统中有多个 Python, 或者命令路径不是"/usr/bin/python",比如 *BSD, 或者 /usr/bin/python
不是 2.X 版本的 Python.我们不使用 "/usr/bin/env" 机制,因为这要求远程用户的路径设置正确,且要求 "python" 可执行程序名不可为 python以外的名字(实际有可能名为python26).
与 ansible_python_interpreter 的工作方式相同,可设定如 ruby 或 perl 的路径....
然后如果你不喜欢特别制定SSH密码的话,可以建立SSH互信,
进入到我的home目录
代码语言:javascript复制cd ~/.ssh
ssh-keygen -t rsa (四个回车)
#执行完这个命令后,会生成两个文件id_rsa(私钥)、id_rsa.pub(公钥)
#将公钥拷贝到要免登陆的机器上:
ssh-copy-id <host>
这样就可以实现SSH免密码(秘钥验证)登录了
使用
查看主机是否连通
代码语言:javascript复制ansible -i /home/ansible/hosts test -m ping
192.168.30.106 | SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.30.107 | SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.30.105 | SUCCESS => {
"changed": false,
"ping": "pong"
}
-i 指定主机清单的位置,-m 使用的模块(命令)
ansible是基于模块来使用的,ansible使用“模块”来完成大部分的任务。模块可以做安装软件,复制文件,使用模板等等。
模块是使用Ansible 的方法
这里介绍几个常用的模块,也算是我的笔记
file模块
file模块主要用于远程主机上的文件操作。 创建文件夹、文件夹,定义文件/目录权限属主等等
参数
state:如果是directory,表示创建目录(如果它们不存在);link表示软链接;若是absent,目录或文件会被递归删除;touch代表生成一个空文件;hard代表硬链接; path:必须参数,定义文件路径 src:要被链接的源文件路径,只应用于state=link的情况 force参数 : 当state=link的时候,可配合此参数强制创建链接文件,当force=yes时,表示强制创建链接文件。不过强制创建链接文件分为三种情况。情况一:当要创建的链接文件指向的源文件并不存在时,使用此参数,可以先强制创建出链接文件。情况二:当要创建链接文件的目录中已经存在与链接文件同名的文件时,将force设置为yes,会将同名文件覆盖为链接文件,相当于删除同名文件,创建链接文件。情况三:当要创建链接文件的目录中已经存在与链接文件同名的文件,并且链接文件指向的源文件也不存在,这时会强制替换同名文件为链接文件。
实例 给/root/123.txt创建一个软链接,链接地址是/root/123/目录下的456.txt
代码语言:javascript复制ansible -i /home/ansible/hosts 192.168.30.106 -m file -a "path=/root/123/456.txt state=touch"
192.168.30.106 | CHANGED => {
"changed": true,
"dest": "/root/123/456.txt",
"gid": 0,
"group": "root",
"mode": "0644",
"owner": "root",
"secontext": "unconfined_u:object_r:admin_home_t:s0",
"size": 0,
"state": "file",
"uid": 0
}
ansible -i /home/ansible/hosts 192.168.30.106 -m file -a "path=/root/123.txt state=link force=yes src=/root/123/123.txt"
192.168.30.106 | SUCCESS => {
"changed": false,
"dest": "/root/123.txt",
"gid": 0,
"group": "root",
"mode": "0777",
"owner": "root",
"secontext": "unconfined_u:object_r:admin_home_t:s0",
"size": 17,
"src": "/root/123/456.txt",
"state": "link",
"uid": 0
}
就创建好了 我们登录主机查看一下
代码语言:javascript复制[root@zabbix ~]# ll
总用量 135280
drwxr-xr-x. 1 root root 21 2月 27 10:55 123
lrwxrwxrwx. 1 root root 17 2月 27 10:53 123.txt -> /root/123/456.txt
发现软链接已经好了
还有删除文件
代码语言:javascript复制➜ ansible ansible -i /home/ansible/hosts 192.168.30.106 -m file -a "path=/root/123/456.txt state=absent"
192.168.30.106 | CHANGED => {
"changed": true,
"path": "/root/123/456.txt",
"state": "absent"
验证一下
代码语言:javascript复制[root@zabbix ~]# cd 123
[root@zabbix 123]# ll
总用量 0
还有修改文件权限
代码语言:javascript复制➜ ansible ansible -i /home/ansible/hosts 192.168.30.106 -m file -a "path=/testdir/abb mode=0644"
shell 模块
如果我们没有模块,我们将运行任意的shell命令,我们也可以使用bash脚本。这是一个任意shell命令看起来像在Ansible
代码语言:javascript复制ansible -i /home/ansible/hosts test -m shell -a 'apt-get install nginx'
其实这还是一个模块(shell),后面的-a是把指定的命令传给模块,但是这样不能保证结果,一般会使用apt
模块来安装
ansible -i /home/ansible/hosts test -m apt -a 'name=nginx state=installed update_cache=true'
我们可以通过这种特殊方式运行我们所需要的所有任务(通过模块),但是让我们来做这个更具管理性。我们将把这个任务移动到一个Playbook中,(感觉有点类似dockerfile)它可以运行和协调多个Tasks。 关于Playbook的使用,你们可以去百度,因为我也在学。