CentOS7安装Ansible

环境说明

测试环境说明,有3台机器,一台作为ansible控制节点,两台作为被管节点。

角色IP组名
ansible控制节点192.168.18.130-
被管节点192.168.18.131webserver
被管节点192.168.18.132webserver

控制节点系统环境说明:

[root@syushin ~]# cat /etc/redhat-release 
CentOS Linux release 7.7.1908 (Core)
[root@syushin ~]# uname -a
Linux syushin 3.10.0-1062.el7.x86_64 #1 SMP Wed Aug 7 18:08:02 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
[root@syushin ~]# getenforce 
Disabled
[root@syushin ~]# hostname -I
192.168.18.130

安装Ansible

控制节点操作

# 配置epel源
[root@syushin ~]# wget -O /etc/yum.repos.d/epel-7.repo http://mirrors.aliyun.com/repo/epel-7.repo  

# 清空本地yum缓存
[root@syushin ~]# yum clean all

# 更新缓存
[root@syushin ~]# yum makecache

# 安装ansible
[root@syushin ~]# yum install -y ansible

# 查看ansible版本
[root@syushin ~]# ansible --version
ansible 2.9.13
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 2.7.5 (default, Aug  7 2019, 00:51:29) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]

Ansible介绍

ansible.cfg

Ansible的主要配置文件

[root@syushin ~]# tree /etc/ansible/
/etc/ansible/
├── ansible.cfg # Ansible主配置文件
├── hosts               # 主机清单文件
└── roles               # 存放角色的目录

ansible主配置文件的内容大部分不需要修改,只列出一些主要的配置:

[defaults]
#inventory      = /etc/ansible/hosts #定义主机清单配置文件
#library        = /usr/share/my_modules/ # 库文件存放目录
#remote_tmp     = ~/.ansible/tmp # 临时py命令文件存放在远程主机目录
#local_tmp      = ~/.ansible/tmp # 本地的临时命令执行目录
#forks          = 5 # 默认并发数
#sudo_user      = root # 默认sudo用户
#ask_sudo_pass = True # 每次执行ansible命令是否询问ssh密码
#ask_pass      = True
#remote_port    = 22 
#module_name    = command # 默认模块,可以修改为shell模块
#host_key_checking = False # 检查对应服务器的host_key,建议取消注释(第一次使用ssh密钥连接时需要手动输入yes,将其设置为false,就不需要手动输入了)
#log_path = /var/log/ansible.log # 日志文件,建议启用

ansible常用命令工具

  • /usr/bin/ansible:主程序,临时命令执行工具
  • /usr/bin/ansible-playbook:定制自动化任务,编排剧本工具
  • /usr/bin/ansible-doc:查看配置文档,模块功能查看工具
  • /usr/bin/ansible-galaxy:上传和下载优秀代码或者Roles模块的官网平台
  • /usr/bin/ansible-pull:远程执行命令工具
  • /usr/bin/ansible-console:基于console界面与用户交互的执行工具

日常主要用ansible的管理方式:

  • Ad-Hoc : 即用ansible命令,主要用于临时命令,一次性任务的使用场景。
  • ansible-playbook : 主要用于长期规划好的,大型项目的场景,需要有前期的规划过程。

ansible-doc示例:

$ ansible-doc -l # 列出所有模块
$ ansible-doc ping # 查看指定模块帮助用法
$ ansible-doc -s ping # 显示指定模块的playbook片段

ansible 命令格式:

$ ansible <host-pattern> [-m module_name] [-a args]
  • <host-pattern>:指定目标主机,可以与/etc/ansible/hosts的格式一样
  • -m:指定模块名
  • -a:指定模块参数
  • -k:输入此选项使用密码认证(不建议使用)
  • -b:指定sudo到哪个用户,如-b root
  • -C:检查,不执行
  • --list-hosts:查看主机列表,可简写--list
  • -v:显示详细的执行过程,要想更详细的信息-vv-vvv

Inventory

ansible的主要功用在于批量主机操作,为了便携地使用其中部分主机,可以在inventory file中将其分组命名,默认的inventory file是/etc/ansible/hosts。inventory file可以有多个,且可以通过Dynamic Inventory来动态生成。

主机清单文件格式

  • Inventory文件遵循INI文件风格、中括号中的字符表示组名,可以将同一个主机同时归并到多个不同的组中。
  • 如果目标主机使用了非默认的SSH端口,可以在主机名称之后使用冒号加端口号标明
  • 如果主机遵循相似的命名模式,还可以使用列表的方式标识主机

示例:

$ cat /etc/ansible/hosts
192.168.18.131

[dbserver]
db1.example.com
db2.example.com

[web1]
www.web[1:100].example.com

[web2]
web[a:f].example.com

[appserver]
10.0.0.[1:100]

Inventory内置了一些参数,这些参数在日常工作中经常用到,可以直接在inventory中使用它们。常见参数如下:

参数说明示例
ansible_ssh_host定义hosts ssh地址ansible_ssh_host=192.169.18.131
ansible_ssh_port定义hosts ssh端口ansible_ssh_port=30022
ansible_ssh_user定义hosts ssh用户ansible_ssh_user=admin
ansible_ssh_pass定义hosts 认证密码ansible_ssh_pass='123456'

3.4 host-pattern

一个pattern通常关联到一系列组(主机的集合) 。host-pattern支持的写法有很多种形式,如下:

通配符写法

ansible "*" -m ping
ansible all -m ping

可以写IP地址或者主机名或者组

ansible 192.168.18.131 -m ping
ansible 192.168.18.* -m ping
ansible "webserver" -m ping

或关系,主机可以存在多个组中,多组之间用冒号隔开表示或的关系

ansible "web1:web2" -m ping

逻辑与,可以求两个组的交集,即同时在两个组中的主机

ansible "web1:&web2" -m ping

逻辑非,在web1组中,但是不在web2组中的主机

ansible "web1:!web2" -m ping

也支持正则表达式写法,比如下面命令会匹配主机web1.test.com 或者web2.test.com

 ansible "~(web1|web2).*\.test\.com" -m ping

ansible小试牛刀

前面环境说明中,有控制节点130和两个被管节点131与132,现在配置环境进行测试

分发秘钥

ansible是自动化运维工具,是基于SSH的。为了避免Ansible下发指令输入目标主机密码,可以用过证书签名达到SSH无密登录。在主节点进行配置,配置步骤如下:

[root@syushin ~]# ssh-keygen -t rsa           # 生成秘钥

[root@syushin ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.18.131      # 将秘钥分发给被管主机

[root@syushin ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.18.132      # 将秘钥分发给被管主机

# 验证是否可以无密登录
[root@syushin ~]# ssh root@192.168.18.131
Last login: Tue Oct 13 16:08:59 2020 from 192.168.18.130
[root@localhost ~]# exit
登出
Connection to 192.168.18.131 closed.
[root@syushin ~]# ssh root@192.168.18.132
Last login: Tue Oct 13 16:08:59 2020 from 192.168.18.130
[root@localhost ~]# 

定义主机清单

[root@syushin ~]# cat /etc/ansible/hosts # 编辑inventory文件,内容如下:
[web1]
192.168.18.131

[web2]
192.168.18.132

测试

[root@syushin ~]# ansible web1 -m ping
192.168.18.131 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
[root@syushin ~]# ansible web2 -m ping
192.168.18.132 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
[root@syushin ~]# ansible web2 -m shell -a "pwd"
192.168.18.132 | CHANGED | rc=0 >>
/root