chaoz的杂货铺

生命有息、学无止境、折腾不止

0%

Ansible复盘

在线手册

网站架构从0起步系列文章总目录
Ansible手册
man rsync翻译(rsync命令中文手册)

常用模块

注意

-k 参数:不配密匙,不配账号密码,手动输入。
ansible 192.168.30.101-m ping -k
仅支持询问第一个 ip,多个 ip 不支持。

inventory 文件遵循 INI 文件风格,中括号中的字符为组名。可以将同一个主机同时归并到多个不同的组中;此外,当如若目标主机使用了非默认的SSH端口,还可以在主机名称之后使用冒号加端口号来标明。

如果主机名称遵循相似的命名模式,还可以使用列表的方式标识各主机示例:
[websrvs]
www[01:100].example.com
[dbsrvs]
db-[a:f]example.com

1
2
3
4
5
6
7
8
9
10
11
12
ansible命令执行过程
1.加载自己的配置文件默认/etc/ansible/ansible.cfg
2.加载自己对应的模块文件,如command
3.通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数字/xXx.PY文件
4.给文件+x执行
5.执行并返回结果
6.删除临时py文件,sleep O退出

执行状态:
绿色:执行成功并且不需要做改变的操作
黄色:执行成功并且对目标主机做变更
红色:执行失败

1
2
3
加入环境变量:
echo "export PATH=$PATH:/usr/git/bin" >> /etc/profile
source /etc/profile //使修改的文件生效

配置文件

1
2
3
4
5
6
7
8
9
10
11
12
Ansible配置文件/etc/ansible/ansible.cfg(一般保持默认)
[defaults]
#inventory =/etc/ansible/hosts#主机列表配置文件#library =/usr/share/my_modules/#库文件存放目录
#remote_tmp =$HOME/.ansible/tmp#临时py命令文件存放在远程主机目录
#local_tmp=$HOME/.ansible/tmp#本机的临时命令执行目录
#forks=5#默认并发数
#sudo_user =root#默认sudo 用户
#ask_sudo_pass=True#每次执行ansible命令是否询问ssh密码
#ask_pass =True
#remote_port =22
#host_key_checking=False#检查对应服务器的host_key,建议取消注释
#log_path=/var/log/ansible.log#日志文件

简单参数

1
2
3
4
5
6
7
8
9
10
11
Ansible通过ssh实现配置管理、应用部署、任务执行等功能,建议配置ansible端能基于密钥认证的方式联系各被管理节点
ansible <host-pattern>[-m module_name][-a args]
--version显示版本
-m module指定模块,默认为command
-V详细过程-Vw-vwv更详细
--list-hosts 显示主机列表,可简写-list
-k,--ask-pass 提示输入ssh连接密码,默认Key验证-K,--ask-become-pass 提示输入sudo时的口令
-C,--check 检查,并不执行
-T,--timeout=TIMEOUT执行命令的超时时间,默认10s
-u,--user=REMOTE_USER 执行远程执行的用户
-b,--become代替旧版的sudo切换

ansible dbsrvs -u root -k-m command -a'ls /root'
ansible dbsrvs -m command -a'ls /root'-u wang-k -b -K

host-pattern

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
ansible的Host-pattern

匹配主机的列表
All:表示所有 Inventory 中的所有主机
ansible all -m ping

*:通配符
ansible "*" -m ping
ansible 192.168.1.* -m ping
ansible "*srvs" -m ping

或关系
ansible "websrvs:appsrvs" -m ping
ansible "192.168.1.10:192.168.1.20" -m ping

逻辑与
ansible "websrvs:&dbsrvs" -m ping 在 websrvs 组并且在 dbsrvs 组中的主机

逻辑非
ansible websrvs:ldbsrvs' -m ping 在 websrvs 组,但不在 dbsrvs 组中的主机
注意:此处为单引号

综合逻辑
ansible ‘websrvs:dbsrvs:&appsrvs:lftpsrvs' -m ping 正则表达式
ansible "websrvs:&dbsrvs" -m ping ansible"~(webldb).*\.magedu\.com" -m ping

shell 模块

1
2
3
4
5
6
7
8
9
ansible-doc -s shell
- name: Execute commands in nodes.
action: shell
chdir # 在执⾏命令前,先cd到指定的⽬录下
free_form:# 要执行的linux指令
creates # ⽤于判断命令是否要执⾏。如果指定的⽂件(可以使⽤通配符)存在,则不执⾏。
removes # ⽤于判断命令是否要执⾏。如果指定的⽂件(可以使⽤通配符)不存在,则不执⾏。
executable # 不再使⽤默认的/bin/sh解析并执⾏命令,⽽是使⽤此处指定的命令解析。
# 例如使⽤expect解析expect脚本。必须为绝对路径。

copy、template 模块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ansible-doc -s copy
- name: Copies files to remote locations.
action: copy
backup=[yes|no] # 拷贝的同时也创建⼀个包含时间戳信息的备份⽂件,默认为no
dest= # ⽬标路径,只能是绝对路径,如果拷贝的⽂件是⽬录,则⽬标路径必须也是⽬录
content # 直接以content给定的字符串或变量值作为⽂件内容保存到远程主机上,它会替代src选项
directory_mode # 当对⽬录做递归拷贝时,设置了directory_mode将会使得只拷贝新建⽂件,
# 旧⽂件不会被拷贝。默认未设置
follow=[yes|no] # 是否追踪到链接的源⽂件。
force=[yes|no] # 设置为yes(默认)时,将覆盖远程同名⽂件。设置为no时,忽略同名⽂件的拷贝。
group # 设置远程⽂件的所属组
owner # 设置远程⽂件的所有者
mode= # 设置远程⽂件的权限。使⽤数值表⽰时不能省略第⼀位,如0644。
# 也可以使⽤'u+rwx'或'u=rw,g=r,o=r'等⽅式设置。
src= # 拷贝本地源⽂件到远程,可使⽤绝对路径或相对路径。如果路径是⽬录,且 ⽬录后加了斜杠"/",则只会拷贝⽬录中的内容到远程,如果 ⽬录后不加斜杠,则拷贝⽬录本⾝和⽬录内的内容到远程。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 ansible-doc -s template
- name: Templates a file out to a remote server.
action: template
backup # 拷贝的同时也创建⼀个包含时间戳信息的备份⽂件,默认为no
dest= # ⽬标路径
force # 设置为yes (默认)时,将覆盖远程同名⽂件。设置为no时,忽略同名⽂件的拷贝
group # 设置远程⽂件的所属组
owner # 设置远程⽂件的所有者
mode # 设置远程⽂件的权限。使⽤数值表⽰时不能省略第⼀位,如0644。
# 也可以使⽤'u+rwx' or 'u=rw,g=r,o=r'等⽅式设置
src= # ansible控制器上Jinja2格式的模板所在位置,可以是相对或绝对路径
validate # 在复制到⽬标主机后但放到⽬标位置之前,执⾏此选项指定的命令。
# ⼀般⽤于检查配置⽂件语法,语法正确则保存到⽬标位置。
# 如果要引⽤⽬标⽂件名,则使⽤%s,下⾯的⽰例中的s%即表⽰⽬标机器上的/etc/nginx/nginx.conf。

file 模块

fetch拉取⽂件模块

rsync模块synchronize

包管理模块yum

配置yum源模块yum_repository

服务管理模块service

systemd模块

⽤户管理模块user

authorzied_key模块

debug模块

定时任务模块cron

归档模块archive

解包模块unarchive

wait_for模块

script模块

Playbook

列表、字典、分行写

向模块传递参数

3 种方式:
1、直接卸载模块后面
2、直接携程字典形式
3、使用内置属性 args

什么时候使用引号

remote_user

remote_user实际上并不是执⾏任务的绝对⾝份,它只是ssh连接过去的⾝份,只不过没有
指定become的时候,它正好就⽤此⾝份来运⾏任务。

notify和handler

执⾏ task 任务时,如果捕捉到 changed=true,那么就会触发notify,notify下定义了待调⽤的handler。

handler 的定义和 tasks 的定义完全⼀样,唯⼀需要限定的是 handler 中 task 的 name 必须和 notify 中定义的名称相同。

notify 是在执⾏完⼀个 play 中所有 task 后被触发的,在⼀个 play 中也只会被触发⼀次。意味着如果⼀个 play 中有多个 task 出现了 changed=true,它也只会触发⼀次。

标签

可以为 playbook 中的每个任务都打上标签,标签的主要作⽤是可以在 ansible-playbook 中设置只执⾏哪些被打上 tag 的任务或忽略被打上 tag 的任务。

迭代

with_items迭代列表
with_dict迭代字典项
with_fileglob迭代⽂件
with_nested嵌套迭代

条件判断

逻辑或、逻辑与、取反

直接引⽤布尔值的变量、可以使⽤jinja2的def ined来测试变量是否已定义,使⽤undef ined可以取反表⽰未定义。

CMDB

喜欢这篇文章?打赏一下作者吧!

欢迎关注我的其它发布渠道