CentOS7安装Ansible
环境说明
测试环境说明,有3台机器,一台作为ansible控制节点,两台作为被管节点。
角色 | IP | 组名 |
---|---|---|
ansible控制节点 | 192.168.18.130 | - |
被管节点 | 192.168.18.131 | webserver |
被管节点 | 192.168.18.132 | webserver |
控制节点系统环境说明:
[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