Ansible的特性
- 模块化:调用特定的模块,完成特定任务
- 基于:
Paramiko
,PyYAML
,Jinja2
- 支持自定义模块
- 基于
Python
语言实现
- 部署简单,基于
python
和SSH(默认已安装),agentless
- 安全,基于
OpenSSH
- 支持
playbook
编排任务
- 幂等性:一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况
- 无需代理不依赖
PKI
(无需ssl)
- 可使用任何编程语言写模块,比如:
java
、Golang
…
YAML
格式,编排任务,支持丰富的数据结构
- 较强大的多层解决方案
1.0 基础配置操作
1.0.1 主机清单inventory
1
2
|
# 当没有加入主机清单的时候,可以采用-k选项输入用户密码进行登录.
ansible 10.1.6.87 -m ping -k
|
1
2
3
|
[webserver]
192.168.1.10[1:103] 或者 192.168.1.10[1:3] # 代表的是192.168.101~103的主机
192.168.1.101:2222 # 如果对方的默认SSH端口不是22,需要制指定默认端口
|
1.0.2 加速SSH访问
1
2
3
4
|
# 将下面的配置选项修改为no即可
UseDNS no
GSSAPIAuthentication no
GSSAPICleanupCredentials no
|
1.0.3 主配置文件详解
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
[defaults]
#inventory = /etc/ansible/hosts # 主机清单文件
#library = /usr/share/my_modules/ # 模块库存放目录
#module_utils = /usr/share/my_module_utils/ # 模块路径
#remote_tmp = ~/.ansible/tmp
#local_tmp = ~/.ansible/tmp
#plugin_filters_cfg = /etc/ansible/plugin_filters.yml # 插件的配置
#forks = 5 # 并发执行,先执行5个主机
#poll_interval = 15 # 监控
#sudo_user = root # 默认执行用户
#ask_sudo_pass = True
#ask_pass = True
#transport = smart
#remote_port = 22
#module_lang = C
#host_key_checking = False # 检查服务器对应的host_key 建议取消注释
#module_set_locale = False
log_path = /var/log/ansible.log # 开启ansible操作日志记录
|
2.0 Ansible命令使用
2.0.1 ansible-doc
1
2
3
4
5
6
7
8
9
10
|
ansible-doc: 显示模块帮助
ansible-doc [options] [module...]
-a 显示所有模块的文档
-l, --list 列出可用模块
-s, --snippet 显示指定模块的playbook片段(简化版,便于查找语法)
示例:
ansible-doc -l 列出所有模块
ansible-doc ping 查看指定模块帮助用法
ansible-doc -s ping 查看指定模块帮助用法
|
2.0.2 ansible
ansible
<host-pattern>
[-m module_name]
[-a args]
1
2
3
4
5
6
7
8
9
10
11
12
13
|
ansible <host-pattern> [-m module_name] [-a args]
ansible +被管理的主机(ALL) +模块 +参数
--version 显示版本
-m module 指定模块,默认为command
-v 详细过程 –vv -vvv更详细
--list-hosts 显示主机列表,可简写 --list
-k, --ask-pass 提示输入ssh连接密码,默认Key验证
-C, --check 检查,并不执行
-T, --timeout=TIMEOUT 执行命令的超时时间,默认10s
-u, --user=REMOTE_USER 执行远程执行的用户
-b, --become 代替旧版的sudo切换
--become-user=USERNAME 指定sudo的runas用户,默认为root
-K, --ask-become-pass 提示输入sudo时的口令
|
2.0.3 ansible的Host-pattern
匹配主机的列表
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
All :表示所有Inventory中的所有主机
ansible all –m ping
* :通配符
ansible "*" -m ping (*表示所有主机)
ansible 192.168.1.* -m ping # 表示192.168.1.*的所有主机
ansible "*srvs" -m ping
或关系 ":"
ansible "websrvs:appsrvs" -m ping # 表示执行websrvs或appsrvs的主机清单
ansible “192.168.1.10:192.168.1.20” -m ping #
逻辑与 ":&"
ansible "websrvs:&dbsrvs" –m ping # 表示在websrvs组并且在dbsrvs组的主机才会执行
在websrvs组并且在dbsrvs组中的主机
逻辑非 ":!"
ansible 'websrvs:!dbsrvs' –m ping # 在websrvs组,但不在dbsrvs组中的主机
在websrvs组,但不在dbsrvs组中的主机
注意:此处为单引号
综合逻辑
ansible 'websrvs:dbsrvs:&appsrvs:!ftpsrvs' –m ping
正则表达式
ansible "websrvs:&dbsrvs" –m ping
ansible "~(web|db).*\.magedu\.com" –m ping
|
2.0.4 ansible执行过程
- 加载自己的配置文件 默认
/etc/ansible/ansible.cfg
- 加载自己对应的模块文件,如command
- 通过ansible将模块或命令生成对应的临时py文件,并将该文件传输远程服务器的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件
- 给文件+x执行
- 执行并返回结果
- 删除临时py文件,sleep 0退出
2.0.5 ansible-galaxy
通过连接https://galaxy.ansible.com 下载相应的roles
1
2
3
|
ansible-galaxy list # 列出已经安装的galaxy
ansible-galaxy install geerlingguy.nginx # 安装一个geerlingguy.nginx角色
ansible-galaxy remove geerlingguy.nginx # 删除
|
2.0.6 ansible-pull
2.0.7 加密剧本
- 通过
ansible-vault encrypt
进行对剧本的加密
1
2
3
4
|
ansible-vault encrypt [剧本文件]
ansible-vault encrypt hello.yaml
New Vault password:
Confirm New Vault password:xxxxxxxxxx anansible-vault encrypt hello.yaml New Vault password: Confirm New Vault password:
|
加密的剧本不可直接运行
2.0.8 解密剧本
- 通过
ansible-vault decrypt
解密
1
|
ansible-vault decrypt hello.yaml
|
2.0.9 ansible-console
2.0
新加的,可以交互式执行命令
- root@all (1)[f:5]$
root
:表示操作的用户
all
: 表示当前要对那些主机进行操作
(1)
: 表示包括几个主机
[f:5]
: 并发请求数量
1
2
3
4
|
cd test # 进入test主机列表
forks 100 # 修改并发数
command ls /etc # 执行远程命令
hostname name=ansible2 # 用法跟命令行一样
|
3.0 Ansible常用模块详解
3.0.1 Command 模块
1
2
|
ansible srvs -m command -a 'service vsftpd start'
ansible srvs -m command -a 'echo adong |passwd --stdin 123456'
|
此命令不支持 $VARNAME < > | ; & 等,用shell模块实现
chdir: 进入到被管理主机目录
creates: 如果有一个目录是存在的,步骤将不会运行Command命令
removes: 如果一个目录不存在,则不会运行命令
3.0.2 Shell模块
Shell
:和command
相似,用shell执行命令
1
2
3
|
ansible all -m shell -a 'getenforce' # 查看SELINUX状态
ansible all -m shell -a "sed -i 's/SELINUX=.*/SELINUX=disabled' /etc/selinux/config"
ansible all -m shell -a 'echo magedu |passwd –stdin wang'
|
调用bash执行命令 类似 cat /tmp/stanley.md | awk -F'|' '{print $1,$2}' &> /tmp/example.txt
3.0.3 Script模块
1
|
ansible all -m script -a /data/test.sh
|
3.0.4 COPY模块
- 从主控端复制文件到远程主机
src
: 源文件 指定拷贝文件的本地路径 (如果有/ 则拷贝目录内容,比拷贝目录本身)
dest
: 指定目标路径
mode
: 设置权限
backup
: 备份源文件
content
: 代替src 指定本机文件内容,生成目标主机文件
owner
: 应该拥有文件系统对象的用户的名称
1
2
3
4
|
# 如果目标存在,默认覆盖,此处指定先备份
ansible all -m copy -a "src=/root/test1.sh dest=/tmp/test2.showner=wang mode=600 backup=yes"
# 指定内容,直接生成目标文件
ansible all -m copy -a "content='test content\nxxx' dest=/tmp/test.txt"
|
注意:如果两个文件的内容一样,则backup=yes不会进行备份.
3.0.5 Fetch模块
- 从客户端获取文件到服务端
- 目前不支持目录,可以先打包,再提取文件
1
|
ansible all -m fetch -a 'src=/root/test.sh dest=/data/scripts'
|
3.0.6 FILE模块
path
: 要管理的文件路径 (强制添加)
recurse
: 递归,文件夹要用递归
src
: 创建硬链接,软链接时,指定源目标,配合’state=link’ ‘state=hard’ 设置软链接,硬链接
state
: 状态
absent
: 删除文件
touch
: 创建一个空文件
direcory
: 建立一个文件夹
link
: 建立软连接
1
2
3
4
|
# 创建新文件
ansible all -m file -a 'path=/root/java.log state=touch'
# 删除
ansible all -m file -a 'path=/root/java.log state=absent'
|
3.0.7 Hostname模块
1
2
|
ansible all -m hostname -a "name=app.adong.com" 更改一组的主机名
ansible 192.168.38.103 -m hostname -a "name=app2.adong.com" 更改单个主机名
|
3.0.8 Cron模块
- 支持时间:
minute
,hour
,day
,month
,weekday
注意:name
和job
是必须添加的
1
2
3
4
5
6
|
# 每五分钟自动同步一次ntp时间服务器
ansible websrvs -m cron -a "minute=*/5 job='/usr/sbin/ntpdate 172.16.0.1 &>/dev/null' name=Synctime"
# 删除任务
ansible websrvs -m cron -a 'state=absent name=Synctime'
# 禁用任务,任务不生效
ansible websrvs -m cron -a 'minute=*/10 job='/usr/sbin/ntpdate 172.30.0.100" name=synctime disabled=yes'
|
3.0.9 Yum模块
- 包管理工具
state
present
: 安装包
absent
: 卸载包
latest
: 如果包不是最新版本,则会进行更新
update_cache
: 检查是否需要更新缓存
validate_certs
: 是否检查SSL认证
disable_gpg_check
: 是否禁用gpg检查
1
2
3
|
ansible all -m yum -a 'list=httpd' # 查看程序列表
ansible all -m yum -a 'name=httpd state=present' # 安装
ansible all -m yum -a 'name=httpd state=absent' # 删除
|
3.1.0 Service 模块
- 用于管理服务的
state
stopped
:停止服务
started
: 启动服务
reloaded
: 重新加载服务
restarted
: 重启服务
1
2
3
4
|
ansible all -m service -a 'name=httpd state=stopped' # 停止服务
ansible all -m service -a 'name=httpd state=started enabled=yes' # 启动服务,并设为开机自启
ansible all -m service -a 'name=httpd state=reloaded' # 重新加载
ansible all -m service -a 'name=httpd state=restarted' # 重启服务
|
3.1.1 User模块
- 用于管理用户
home
指定家目录路径
system
指定系统账号
group
指定组
remove
清除账户
shell
指定shell类型
1
2
3
4
5
|
ansible all -m user -a 'name=user1 comment="test user" uid=2048 home=/app/user1 group=root'
ansible all -m user -a 'name=sysuser1 system=yes home=/app/sysuser1'
ansible all -m user -a 'name=user1 state=absent remove=yes' # 清空用户所有数据
ansible all -m user -a 'name=app uid=88 system=yes home=/app groups=root shell=/sbin/nologin password="$1$zfVojmPy$ZILcvxnXljvTI2PhP2Iqv1"' # 创建用户
ansible websrvs -m user -a 'name=app state=absent' # 不会删除家目录
|
3.1.2 Group模块
1
2
|
ansible srv -m group -a "name=testgroup system=yes" # 创建组
ansible srv -m group -a "name=testgroup state=absent" # 删除组
|
3.1.3 Setup模块
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
ansible test -m setup -a 'filter=*hostname*'
[root@bogon ~]# ansible test -m setup -a 'filter=*ipv4*'
10.1.6.171 | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"10.1.6.171"
],
"ansible_default_ipv4": {
"address": "10.1.6.171",
"alias": "ens192",
"broadcast": "10.1.6.255",
"gateway": "10.1.6.254",
"interface": "ens192",
"macaddress": "00:0c:29:ee:66:b2",
"mtu": 1500,
"netmask": "255.255.255.0",
"network": "10.1.6.0",
"type": "ether"
},
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false
}
|
常用的几个就先到这,后续在进行补充