Ansible安装使用

简介

Ansible 简单的说是一个配置管理系统(configuration management system)。官方的title是“Ansible is Simple IT Automation”——简单的自动化IT工具。你只需要可以使用 ssh 访问你的服务器或设备就行。你可以将代码部署到任意数量的服务器上! Ansible跟其他IT自动化技术的区别在于其关注点并非配置管理、应用部署或IT流程工作流,而是提供一个统一的界面来协调所有的IT自动化功能,因此Ansible的系统更加易用,部署更快。
Ansible可以让用户避免编写脚本或代码来管理应用,同时还能搭建工作流实现IT任务的自动化执行。IT自动化可以降低技术门槛及对传统IT的依赖,从而加快项目的交付速度。

安装

因为Ansible是基于python编写的,所以我这里使用pip安装
命令

pip install ansible

因为pip安装是不会生成配置文件,一切都用默认的运行,如果需要修改默认配置的话,所以需要自己生成模板可以自己下载,然后在用户主目录下生成一个ansible.cfg文件,把模板复制进去就好了
然后

➜  ~ 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表示服务器使用的用户,

参数说明
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目录

cd ~/.ssh
ssh-keygen -t rsa (四个回车)  
#执行完这个命令后,会生成两个文件id_rsa(私钥)、id_rsa.pub(公钥)  
#将公钥拷贝到要免登陆的机器上:
ssh-copy-id <host>

这样就可以实现SSH免密码(秘钥验证)登录了

使用

查看主机是否连通

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

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
}

就创建好了
我们登录主机查看一下

[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

发现软链接已经好了

还有删除文件
➜  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"

验证一下

[root@zabbix ~]# cd 123
[root@zabbix 123]# ll
总用量 0

还有修改文件权限

➜  ansible ansible -i  /home/ansible/hosts  192.168.30.106 -m file -a  "path=/testdir/abb mode=0644"

shell 模块

如果我们没有模块,我们将运行任意的shell命令,我们也可以使用bash脚本。这是一个任意shell命令看起来像在Ansible

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的使用,你们可以去百度,因为我也在学。

文章目录
  1. 1. 简介
  2. 2. 安装
    1. 2.1. 参数说明
  3. 3. 使用
    1. 3.1. 模块是使用Ansible 的方法
    2. 3.2. file模块
    3. 3.3. 参数
    4. 3.4. 还有删除文件
  4. 4. shell 模块