Ansible-playbook命令常用参数:
ansible-playbook
-i 指定inventory文件
-v 详细输出,-vvv更详细,-vvvv更更详细
-f 并发数
-e 定义Playbook中使用的变量,格式"key=value,key=value"
--remote-user #远程用户
--ask-pass #远程用户密码
--sudo #使用sudo
--sudo-user #sudo的用户,默认root
--ask-sudo-pass #sudo密码
模块初识:
案例:
- name: 判断域名是否可以解析
shell: ping mirrors.intra.openredcloud.com -c 2
register: dns_useful
ignore_errors: True
Shell是执行一条shell命令,代表某一个模块,这里是shell模块
register是将shell的返回值注入到dns_useful变量中,这是一种声明临时变量的方式。 Ignore_errors是忽略错误,对应echo $?这样的查看前面命令执行的结果,shell结果不为0都会认为是失败,ignore_errors默认是flase,失败后会使整个ansible脚本终端,所以一般可能失败而又不能影响后续的操作记得要配置成true。
Command模块:
- name: yum-clean-metadata
command: yum clean all
args:
warn: no
与shell模块的功能是重复的,但是shell比command更灵活,看下官方的command与shell区别的解释:
“ so variables like $HOME and operationslike “<”, “>”, “|”, and "&"will not work (use the shell module if you need these features).”
总结就是简单的没特殊字符的用command,command搞不定的用shell,当然也可以全部用shell。
Yum模块:
- name: remove epel if installed
yum:
name: epel-release
state: absent
ignore_errors: true
name表示要操作的软件包的名字;state标识要做什么操作, present:默认的,表示为安装;lastest:安装为最新的版本, absent:表示删除
yum常用的name有很多,这里操作的是:epel-release:Extra Packages for EnterpriseLinux,此外还有
dnsmasq:内网的DNS+DHCP配置工具
selinux:加强安全
等
Copy模块:
- name: config system reslov.conf
copy:
src: resolv.conf
dest: /etc/resolv.conf
src要指向把本地(宿主机)的文件,在/files目录下去找;
dest:服务器上的目的地址
Template模块:
- name: config dnsmasq.conf
template:
src: dnsmasq.conf.j2
dest: /etc/dnsmasq.conf
template模块是专门为jinjia2模板提供服务的,jinjia2文件是一种以.j2后缀的模板文件,预留了变量供使用时初始化。
src要指定宿主机上的jinjia2模板文件,去/templates目录下去找
dest好理解,就是目的服务器上的位置
此外还有owner、group、mode,对应linux里的概念,也很好理解。
我们来看下dnsmasq.conf.j2的结构:
resolv-file= {{ resolv_file }}
listen-address=127.0.0.1
no-hosts
cache-size={{ cache_size }}
local-ttl={{ ttl }}
all-servers
{{ }}中的内容就会被自动填充,填充规则上一篇讲过,有多种方式不同的优先级,我个人推荐的是命令指定和/vars目录下预设两种方式。
File模块
大部分属性与template模块类似,该模块是对远程文件进行操作管理的模块,与template最大的区别是state属性:
state:
touch:创建一个新的空文件
directory:创建一个新的目录,当目录存在时不会进行修改
link:创建软连接,结果src一起使用此选项才生效
hard:创建硬连接
absent:删除文件,目录,软连接
Wait_for模块:
等待事情发生,例如等待数据库启动、web容器启动等。
- name: wait for dnsmasq port 53
wait_for:
port: 53
timeout: 10
port:等待某端口号必须启动
path:等待某文件必须创建
host:默认是127.0.0.1,为了满足等待其它远程服务器的场景
timeout的单位是秒
state:默认是started,也就是等待启动或创建,也可能存在等待删除或停止等场景。对象是端口的时候start状态会确保端口是打开的,stoped状态会确认端口是关闭的;对象是文件的时候,present或者started会确认文件是存在的,而absent会确认文件是不存在的。
Service模块:
如果说yum模块是对linux组件的增删改,那么service模块就是对linux组件的操纵。
- name: restarting dnsmasq
service: name=dnsmasq state=restarted enabled=yes
name:组件的名称
state:对组件进行的操作
enabled:这个注意了,默认是no,拿本案例来说如果配置成false就是restart了之后就不关心结果了,配置成yes是要关心结果。
Lineinfile文件编辑模块:
- name: edit /etc/sysconfig/init
lineinfile:
dest=/etc/sysconfig/init
regexp="^ulimit "
line="ulimit -n {{ ulimit_num | default('65536') }}"
create=/etc/sysconfig/init
ignore_errors: yes
dest:被编辑的文件
regexp:使用正则表达式进行匹配
line:编辑的内容
create:如果dest不存在,那么就创建,默认没有create,找不到dest的文件就会失败
sysctl模块:
远程主机sysctl配置
- name: config sysctl.conf
sysctl:
name: "{{ item.key }}"
value: "{{ item.value }}"
state: present
reload: no
with_dict: "{{ sysctl_dict }}"
name+value:sysctl模块是以key:value的方式来配置的,name和value分别对应着key、value
state:state=present修改,state=absent 删除
reload :reload=yes 重载 sysctl.conf 文件
Pip模块:
Python的pip安装或卸载,该模块比较好理解
- name: Ensure Supervisor is installed (specific version).
pip:
name: supervisor
state: present
version: "{{ supervisor_version }}"
Group和user模块:
相当于linux里对group和user的操作
案例(判断某group是否存在):
- name: Ensure supervisor_user group exists
group:
name: "{{ supervisor_user }}"
state: present
同理,将group替换成user就是对用户的判断。
Git模块:
对于git版本服务的操作模块
- name: ANSISTRANO | GIT | Update remote repository
git:
repo: "{{ ansistrano_git_repo }}"
dest: "{{ ansistrano_deploy_to }}/repo"
version: "{{ ansistrano_git_branch }}"
accept_hostkey: true
update: yes
force: yes
register: ansistrano_git_result_update
when: ansistrano_git_identity_key_path|trim == '' and ansistrano_git_identity_key_remote_path|trim == ''
repo:git仓库的地址
dest:仓库中的相对目录
version:哪个版本
accept_hostkey:如果ssh_opts包含” -o StrictHostKeyChecking=no”,此参数可以省略,如果配置成true或yes,需要添加hostkey
update:是否要更新新版本
force:配置成yes,本地仓库将永远被仓库服务端覆盖
与git相似的是svn操作,也就是subversion模块,如果自己代码是用svn管理的可以自己去了解下subversion模块,这里不再做介绍。
unarchive模块:
于解压包,支持 zip、tar、jar 等
- name: codelivery | Unarchive | Unarchive source
unarchive:
copy: no
src: "{{ codelivery_releases_dir }}/{{ codelivery_product_url | basename }}"
dest: "{{ codelivery_releases_dir }}"
src和dest很好理解,不再解释
copy:在哪里解压,no代表的是压缩包传到dest目的机后在目的机解压,yes代表在ansible宿主机上解压完毕后再将加压后的文件上传到目的机。
get_url模块,
也就是download操作:
- name: codelivery | download | Download artifact
get_url:
url: "{{ codelivery_product_url }}"
dest: "{{ codelivery_releases_dir }}/{{ codelivery_product_url | basename }}"
force_basic_auth: "{{ codelivery_download_force_basic_auth | default(omit) }}"
headers: "{{ codelivery_download_headers | default(omit) }}"
url:http的地址
dest:下载文件到目的机的路径
force_basic_auth:在发起请求前是否发出权限校验信息
headers:报文头信息
uri模块:
比get_url功能更强大的http请求模块,可以发起get、post、put等各种请求方式,也可以处理返回值及内容
- name: codelivery | healthcheck | urlcheck status==200?
uri:
url: "http://{{ codelivery_urlcheck_addr }}:{{ codelivery_urlcheck_port }}{{ codelivery_urlcheck_url }}"
method: GET
headers:
Host: "{{ codelivery_urlcheck_host }}"
timeout: 10
status_code: 200
return_content: no
属性如字面意思,比较好理解,不再做解释。
常用魔数:
ansible_distribution=Ubuntu
ansible_distribution_version=14.04
ansible_distribution_major_version:系统的大版本号
ansible_os_family:系统的操作系统(‘RedHat’,’Debian’,’FreeBSD’)
其他小细节:
自定义报错:
- name: check curl environment | 2
fail: msg="curl不支持nss"
when: curl_nss | failed
很明显curl_nss是前面register下来的参数,通过这种方式可以封装一个自定义的友好的报错信息。
自定义局部变量并赋值:
- name: Define nginx_user.
set_fact:
nginx_user: "{{ __nginx_user }}"
when: nginx_user is not defined
通过set_fact可以设置一个局部的变量,可以在后续脚本或jinjia2模板中引用。