Ansible(3) Ansible-playbook常用模块

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模板中引用。

你可能感兴趣的:(Ansible(3) Ansible-playbook常用模块)