ansible一些常用知识。
全局变量
用在所有的组里的变量。
在hosts里指定所有的组,声明变量:
1 | [all:vars] |
取一个路径的文件名或目录
参考: https://github.com/yteraoka/ansible-tutorial/wiki/path-filter
文件名:
1 | {{ path | basename }} |
目录:
1 | {{ path | dirname }} |
shell-chdir
1 | shell: xxx |
变量比较
一开始以为需要使用:{{var}}=='dsdd'
后来发现只需要: var=="dsdd"
1 | tasks: |
find-kill-pid
1 | - name: find running pid |
replace
1 | - name: replace |
对于有引号的内容,直接写就行:
1 | - name: modify keepalived conf |
也可以使用: ansible-doc -s lineinfile
unarchive
解压包,从src到dest:
1 | - name: unarchive |
2个地方需要注意:
- remote_src=true代表src是远程的,默认是本地的
- xxx.tar.gz 解压后会在远程地址创建一个xxx的目录,所以,远程就不要手动创建
设置自己的变量set_fact
1 | tasks: |
获取主机IP
1 | "inventory_hostname": "192.168.17.70", |
1 | - debug: var=hostvars |
判断文件是否存在
1 | - name: check if application-prod.yml exists |
只运行一次
假如,我在一个组下需要pull最新代码,而这个组里有多个机器,那么他们会并发执行,
但是git 模块只需要执行一次,否则会报错,这时候就需要执行一次:
1 | - name: pull code |
sudo操作
执行sudo命令有2种情况
sudo cmd
: 输入的是当前登录用户的密码,但是如果当前用户不在root用户组,则不行1
2
3[yunwei@h1 ~]$ sudo ls
[sudo] password for yunwei:
yunwei 不在 sudoers 文件中。此事将被报告。- 直接切换到root用户:
su - root
,这时候就是输入root用户密码。
而ansible默认是第一种,由become_method
标示,参考。
所以,要使用第二种情况,需要设置:become_method: su
.
完整示例:
1 | # hosts |
ansible清空目录
file absent
会删除整个目录,而有时只想清除目录下的文件, 清空或者清除部分文件:
find + file命令:先找出来,再删除
1 | - name: list all jar files |