Ansible系列命令

Ansible系列命令有如下:

  • ansible:这个命令是日常工作中使用率非常高的命令之一,主要用于临时一次性操作;
  • ansible-doc:是Ansible模块文档说明,针对每个模块都有详细的用法说明和应用案例介绍;
  • ansible-galaxy:可以简单的理解为Github或PIP的功能,通过ansible-galaxy,我们可以下载安装优秀个Roles;
  • ansible-playbook:是日常应用中使用频率最高的命令,其工作机制是,通过读取预先编写好的playbook文件实现批量管理;
  • ansible-pull:Ansible的另一种工作模式,pull模式,ansible默认使用push模式;
  • ansible-vault:主要用于配置文件加密;
  • ansible-console:让用户可以在ansible-console虚拟出来的终端上像Shell一样使用Ansible内置的各种命令;

上一篇已经介绍过ansibleansible-doc的基本用法,下面再来介绍一下其他系列命令的用法。

ansible-galaxy

用法:ansible-galaxy [delete|import|info|init|install|list|login|remove|search|setup] [--help] [options] ...

去 https://galaxy.ansible.com/ 上传或下载优秀的Playbook(roles)

#列出所有已安装的galaxy
ansible-galaxy list#安装galaxy
ansible-galaxy install geerlingguy.redis#删除galaxy
ansible-galaxy remove geerlingguy.redis

ansible-valut

用法:ansible-vault [create|decrypt|edit|encrypt|rekey|view] [--help] [options] vaultfile.yml

ansible-vault encrypt hello.yml  # 加密
ansible-vault decrypt hello.yml  # 解密
ansible-vault view hello.yml  # 查看

ansible-console

root@mageduweb (2)[f:10] $ service name=httpd state=stoppedroot@mageduweb (2)[f:10] $
执行用户@当前操作的主机组 (当前组的主机数量)[f:并发数]$设置并发数: forks n  例如: forks 10
切换组: cd groupname  例如: cd mageduweb
列出当前组主机列表: list
列出所有的内置模块: ?

ansible-playbook

Usage: ansible-playbook playbook.yml

playbook就是一个用yaml语法把多个模块堆起来的一个文件而已。

1.简介
yaml是一个可读性高的用来表达资料序列的格式。YAML参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822等。Clark Evans在2001年在首次发表了这种语言,另外Ingy döt Net与Oren Ben-Kiki也是这语言的共同设计者。

2.特点

  • YAML的可读性好
  • YAML和脚本语言的交互性好
  • YAML使用实现语言的数据类型
  • YAML有一个一致的信息模型
  • YAML易于实现
  • YAML可以基于流来处理
  • YAML表达能力强,扩展性好

YAML的语法和其他高阶语言类似,并且可以简单表达清单、散列表、标量等数据结构。其结构(Structure)通过空格来展示,序列(Sequence)里的项用"-"来代表,Map里的键值对用":"分隔。下面是一个示例。

- hosts: 10.1.0.1        #定义主机vars:                      #定义变量var1: valuevar2: valuetasks:                    #定义任务- name:           #任务名称。#这里就可以开始用模块来执行具体的任务了。handlers:     #定义触发通知所作的操作。里面也是跟tasks一样,用模块定义任务。- name:remote_user:             #远程主机执行任务时的用户。一般都是root,一般也不用指定。- hosts: webvars:tasks:handlers:remote_user:

YAML文件扩展名通常为.yaml,如example.yaml

Playbooks:

核心组件:

  • Hosts:执行的远程主机列表
  • Tasks:任务,由模块定义的操作的列表;
  • Varniables:内置变量或自定义变量在playbook中调用
  • Templates:模板,即使用了模板语法的文本文件;
  • Handlers:和nogity结合使用,为条件触发操作,满足条件方才执行,否则不执行;
  • Roles:角色;
* 安装http脚本实现:#!/bin/bash
# 安装Apache
yum install --quiet -y httpd httpd-devel   # command: yum install --quiet -y httpd httpd-devel
# 复制配置文件
cp /path/to/config/httpd.conf /etc/httpd/conf/httpd.conf -f
cp/path/to/httpd-vhosts.conf /etc/httpd/conf/httpd-vhosts.conf -f
# 启动Apache,并设置开机启动
service httpd start
chkconfig httpd on* 安装httpd ansible-playbook实现---
- hosts: alltasks:- name: "安装Apache"command: yum install --quiet -y httpd httpd-devel- name: "复制配置文件"command: cp /tmp/httpd.conf /etc/httpd/conf/httpd.confcommand: cp /tmp/httpd-vhosts.conf /etc/httpd/conf/httpd-vhosts.conf- name: "启动Apache,并设置开机启动"command: service httpd startcommand: chkconfig httpd on

playbook的基础组件:

Hosts:运行指定任务的目标主机;
remote_user:在远程主机以哪个用户身份执行;sudo_user:非管理员需要拥有sudo权限;
tasks:任务列表模块,模块参数:格式:(1) action: module arguments(2) module: arguments

示例:
vim test.yaml,后缀也可以是.yml

- hosts: allremote_user: roottasks:- name: install a groupgroup: name=mygrp system=true - name: install a useruser: name=user1 group=mygrp system=true- hosts: websrvs      remote_user: roottasks:- name: install httpd packageyum: name=httpd- name: start httpd service service: name=httpd state=started

运行playbook,使用ansible-playbook命令:

检测语法:

  • ansible-playbook –syntax-check /path/to/playbook.yaml

测试运行,即不真正执行:

  • ansible-playbook -C /path/to/playbook.yaml
  • ansible-playbook –check /path/to/playbook.yaml
    --list-hosts--list-tasks--list-tags

运行:

  • ansible-playbook /path/to/playbook.yaml
    -t TAGS, --tags=TAGS--skip-tags=SKIP_TAGS  跳过指定的标签--start-at-task=START_AT 从哪个任务后执行

tags: 标签,给指定的任务定义一个调用标识;

- name: NAMEmodule: argumentstags: TAG_ID

指定某条任务执行:ansible-playbook --tags=user useradd.yml

- hosts: mageduwebremote_user: roottasks:- name: add group nginxtags: useruser: name=nginx state=present- name: add user nginxuser: name=nginx state=present group=nginx- name: Install Nginxyum: name=nginx state=present- name: Start Nginxservice: name=nginx state=started enabled=yes

可以一次调用多个名称相同的标签。也可以调用不同的标签用 “,” 分割。

示例:
我们把httpd的监听端口改为8080

用playbook把这个文件传到node3,4上

指明标签的检查

从标签位置开始执行

跳过标签

handlers 和 notify 结合使用触发条件,让playbook在满足一定触发条件时才去执行某条task

- name: TASK_NAMEmodule: argumentsnotify: HANDLER_NAME
handlers:
- name: HANDLER_NAMEmodule: arguments

第一次的话都会运行,后边如果文件内容发生改变就会触发notify,然后会直接执行handlers的内容(这里notify后边的事件就都不会执行了)。估计是md5那种的校验。删了个#号竟然也会通知。

---- hosts: mageduwebremote_user: roottasks:- name: add group nginxtags: useruser: name=nginx state=present- name: add user nginxuser: name=nginx state=present group=nginx- name: Install Nginxyum: name=nginx state=present- name: config copy: src=/root/config.txt dest=/etc/nginx/config.txtnotify:- Restart Nginx- Check Nginx Processhandlers:- name: Restart Nginxservice: name=nginx state=restarted enabled=yes- name: Check Nginx Processshell: ss -tnl | grep 80

playbook 变量使用

变量来源:
(1)ansible setup facts远程主机的所有变量都可以用
(2)自定义变量

a. 在/etc/ansible/hosts 定义变量,在主机组中的主机单独定义,优先级高于组中公共变量

b. 在/etc/ansible/hosts 定义变量,针对主机组中的所有主机集中定义变量

c. 通过命令行指定变量,优先级最高

在hosts Inventory(/etc/ansible/hosts)中为每个主机定义专用变量值;
[all]
172.16.47.103 aaa=nginx
172.16.47.104 aaa=httpd###############################
- hosts: allremote_user: roottasks:- name: install web packageyum: name={{ aaa }} state=latest
(a) 向不同的主机传递不同的变量;IP/HOSTNAME variable_name=value[web]10.1.6.72 qzx=httpd10.1.6.73 qzx=nginx(b) 向组内的所有主机传递相同的变量 ;[groupname:vars]variable_name=value[web:qzx]qzx=httpd[web]10.1.6.7210.1.6.73

变量调用方式:
{{ variable_name }} 通过{{ }} 调用变量,且变量和{}两头之间必须有空格

额外介绍的是:
在playbook中调用变量时,有时"{{ variable_name }}"需要要双引号引起来方可生效,有时候必须不能用""引起来

d.在playbook中定义,建议使用这个!

vars:- var_name: value- var_name: value

e.Inventory还可以使用参数

用于定义ansible远程连接目标主机时使用的属性,而非传递给playbook的变量;ansible_ssh_hostansible_ssh_portansible_ssh_useransible_ssh_passansible_sudo_pass...

f.在角色调用时传递

roles:
- { role: ROLE_NAME, var: value, ...}

templates模版

文本文件,内部嵌套有模板语言脚本(使用模板语言编写)

Jinja2 是由python编写的。 在我们打算使用基于文本的模板语言时,jinja2是很好的解决方案。yeml是写playbookjinja2是写配置文件模板的。

功能:
将模板的文件的变量值转换成对应的本地主机的确定值。例如:ansible端写一个内建变量{{ ansible_processor_vcpus }},当这个文件被复制到对应主机时会自动生成对应主机 cpu的颗数的结果替换之。

Jinja2语法:

字面量:字符串:使用单引号或双引号; 数字:整数、浮点数;列表:[item1, item2, ...]元组:(item1, item2, ...)字典:{key1:value1, key2:value2, ...}布尔型:true/false算术运算:+, -, *, /, //, %, **比较操作:==, !=, >, <, >=, <=逻辑运算:and, or, not

执行模板文件中的脚本,并生成结果数据流,需要使用template模块

template:使用了Jinjia2格式作为文件模版,进行文档内变量的替换的模块。相当于copy。

将jinja2的文件模板理解并执行,转化为各个主机间的对应值

backup       建立个包括timestamp在内的文件备份,以备不时之需.
dest       远程节点上的绝对路径,用于放置template文件。
group      设置远程节点上的的template文件的所属用户组
mode       设置远程节点上的template文件权限。类似Linux中chmod的用法
owner      设置远程节点上的template文件所属用户
src        本地Jinjia2模版的template文件位置。

注意:此模板不能在命令行使用,而只能用于playbook;用法同copy

(1) templates文件必须存放于目录名为templates下,且命名为 .j2 结尾
(2)yaml/yml playbook文件需和templates目录平级,目录结构如下:./├── temnginx.yml└── templates└── nginx.conf.j2

案例1:

// templates/nginx.conf.j2{% for vhost in  nginx_vhosts %}
server {listen {{ vhost }}}{% endfor %}// temnginx.yml
---- hosts: mageduwebremote_user: rootvars:nginx_vhosts:- web1- web2- web3#  nginx_vhosts:#    - listen: 8080tasks:- name: template config to remote hoststemplate: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf

生成的结果:

server {listen web1}server {listen web2}server {listen web3}
案例2:shell脚本与Jinja语法对比:
-- shell脚本中写法
for i in {1..10}
docon
doneif [ xx ];thencon
elifcon
elsecon
fi-- Jinja写法://  templates/nginx.conf.j2{% for vhost in  nginx_vhosts %}
server {listen {{ vhost.listen  }}}{% endfor %}* 生成的结果server {listen 8080}* playbook调用文件
//  temnginx.yml---- hosts: mageduwebremote_user: rootvars:nginx_vhosts:- listen: 8080tasks:- name: template config to remote hoststemplate: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf* 案例3// temnginx.yml---- hosts: mageduwebremote_user: rootvars:nginx_vhosts:- web1:listen: 8080server_name: "web1.magedu.com"root: "/var/www/nginx/web1/"- web2:listen: 8080server_name: "web2.magedu.com"root: "/var/www/nginx/web2/"- web3:listen: 8080server_name: "web3.magedu.com"root: "/var/www/nginx/web3/"## 案例1#  nginx_vhosts:#    - web1#    - web2#    - web3## 案例2tasks:- name: template config to remote hoststemplate: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf// templates/nginx.conf.j2{% for vhost in  nginx_vhosts %}
server {listen {{ vhost.listen }}server_name {{ vhost.server_name }}root  {{ vhost.root }}}{% endfor %}* 生成结果:server {listen 8080server_name web1.magedu.comroot  /var/www/nginx/web1/}server {listen 8080server_name web2.magedu.comroot  /var/www/nginx/web2/}server {listen 8080server_name web3.magedu.comroot  /var/www/nginx/web3/}* 案例4
// templates/nginx.conf.j2{% for vhost in  nginx_vhosts %}
server {listen {{ vhost.listen }}{% if vhost.server_name is defined %}server_name {{ vhost.server_name }}{% endif %}root  {{ vhost.root }}}{% endfor %}// temnginx.yml---- hosts: mageduwebremote_user: rootvars:nginx_vhosts:- web1:listen: 8080#server_name: "web1.magedu.com"root: "/var/www/nginx/web1/"- web2:listen: 8080server_name: "web2.magedu.com"root: "/var/www/nginx/web2/"- web3:listen: 8080server_name: "web3.magedu.com"root: "/var/www/nginx/web3/"## 案例1#  nginx_vhosts:#    - web1#    - web2#    - web3## 案例2tasks:- name: template config to remote hoststemplate: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf* 执行命令ansible-playbook temnginx.yml* 生成的结果server {listen 8080root  /var/www/nginx/web1/}server {listen 8080server_name web2.magedu.comroot  /var/www/nginx/web2/}server {listen 8080server_name web3.magedu.comroot  /var/www/nginx/web3/}### ansible-playbook when条件判断---- hosts: mageduwebremote_user: roottasks:- name: add group nginxtags: useruser: name=nginx state=present- name: add user nginxuser: name=nginx state=present group=nginx- name: Install Nginxyum: name=nginx state=present- name: restart Nginxservice: name=nginx state=restartedwhen: ansible_distribution_major_version == "6"### ansible-playbook with_items 列表---- hosts: mageduwebremote_user: roottasks:- name: create rsyncd filecopy: src={{ item }} dest=/tmp/{{ item }}with_items:- a- b- c- d- name: yum install httpdyum: name={{ item }}  state=present with_items:- apr- apr-util- httpd* with_itmes 嵌套子变量---- hosts: mageduwebremote_user: roottasks:- name: add several usersuser: name={{ item.name }} state=present groups={{ item.groups }}with_items:- { name: 'testuser1' , groups: 'wheel'}- { name: 'testuser2' , groups: 'root'}

1、普通示例:

这里/root/nginx.conf内容发生了改变。

  - hosts: ngxsrvsremote_user: roottasks:- name: install nginx packageyum: name=nginx state=latest- name: install conf filetemplate: src=/root/nginx.conf.j2 dest=/etc/nginx/nginx.conftags: ngxconfnotify: reload nginx service- name: start nginx serviceservice: name=nginx state=started enabled=truehandlers:- name: reload nginx serviceshell: /usr/sbin/nginx -s reload

2、条件测试:

when语句:在tasks中使用,Jinja2的语法格式;

-     hosts: allremote_user: roottasks:- name: install nginx packageyum: name=nginx state=latest- name: start nginx service on CentOS6shell: service nginx startwhen: ansible_distribution == "CentOS" and ansible_distribution_major_version == "6"- name: start nginx serviceshell: systemctl start nginx.servicewhen: ansible_distribution == "CentOS" and ansible_distribution_major_version == "7"

3、循环:迭代,需要重复执行的任务;

对迭代项的引用,固定变量名为"item”,使用with_item属性给定要迭代的元素; 这个是以任务为中心,围绕每个任务来跑主机,如果中间某个任务中断,那么所有主机以后的任务就无法安装。

元素:

  • 列表
  • 字符串
  • 字典

基于字符串列表给出元素示例:

-   hosts: websrvsremote_user: roottasks:- name: install packagesyum: name={{ item }} state=latestwith_items:- httpd- php- php-mysql- php-mbstring- php-gd

基于字典列表给元素示例:item.name .后边的表示键

- hosts: allremote_user: roottasks:- name: create groupsgroup: name={{ item }} state=presentwith_items:- groupx1- groupx2- groupx3- name: create usersuser: name={{ item.name }} group={{ item.group }} state=presentwith_items:- {name: 'userx1', group: 'groupx1'}- {name: 'userx2', group: 'groupx2'}- {name: 'userx3', group: 'groupx3'}

角色:roles

以特定的层级目录结构进行组织的tasks、variables、handlers、templates、files等;相当于函数的调用把各个事件切割成片段来执行。

mkdir ./{nginx,memcached,httpd,mysql}/{file,templates,vars,handlers,meta,default,tasks} -pv

role_name/

    files/:存储由copy或script等模块调用的文件; tasks/:此目录中至少应该有一个名为main.yml的文件,用于定义各task;其它的文件需要由main.yml进行“包含”调用;handlers/:此目录中至少应该有一个名为main.yml的文件,用于定义各handler;其它的文件需要由main.yml进行“包含”调用;vars/:此目录中至少应该有一个名为main.yml的文件,用于定义各variable;其它的文件需要由main.yml进行“包含”调用;templates/:存储由template模块调用的模板文本;meta/:此目录中至少应该有一个名为main.yml的文件,定义当前角色的特殊设定及其依赖关系;其它的文件需要由main.yml进行“包含”调用;default/:此目录中至少应该有一个名为main.yml的文件,用于设定默认变量;

在playbook中调用角色的方法:

- hosts: HOSTSremote_user: USERNAMEroles:- ROLE1- ROLE2- { role: ROLE3, VARIABLE: VALUE, ...}- { role: ROLE4, when: CONDITION }

事例: 基于角色的方式安装 nginx

1.创建需要的文件

mkdir ./{nginx,memcached,httpd,mysql}/{files,templates,vars,handlers,meta,default,tasks} -pv

2.复制相应的安装包和模板到对应目录下

3.写tasks/下的主main.yml

- name: copy nginx packagecopy: src=nginx-1.10.0-1.el7.ngx.x86_64.rpm dest=/tmp/nginx-1.10.0-1.el7.ngx.x86_64.rpm- name: install nginx packageyum: name=/tmp/nginx-1.10.0-1.el7.ngx.x86_64.rpm  state=present- name: install nginx.conf filetemplate: src=nginx.conf.j2 dest=/etc/nginx/nginx.conftags: ngxconfnotify: reload nginx service- name: install default.conf filetemplate: src=default.conf.j2 dest=/etc/nginx/conf.d/default.conftags: ngxconfnotify: reload nginx service- name: start nginx serviceservice: name=nginx enabled=true state=started

4.根据需要修改nginx的配置文件模板。(这里改的是work进程生成数和监听的端口)

5.写handlers目录和vars/下的main.yml 文件

6.写需要运行的主yml文件

7.测试

8.运行

安装成功

9.改端口测试,通过传递参数方式

修改成功!!!

推荐资料

http://galaxy.ansible.com
https://galaxy.ansible.com/explore#/
http://github.com/
http://ansible.com.cn/
https://github.com/ansible/ansible
https://github.com/ansible/ansible-examples

最后打个广告,Stanley老师的Ansible权威指南,你,值得拥有

转载于:https://www.cnblogs.com/ilurker/p/6421637.html

Ansible详解(二)相关推荐

  1. 安卓 linux init.rc,[原创]Android init.rc文件解析过程详解(二)

    Android init.rc文件解析过程详解(二) 3.parse_new_section代码如下: void parse_new_section(struct parse_state *state ...

  2. [转]文件IO详解(二)---文件描述符(fd)和inode号的关系

    原文:https://www.cnblogs.com/frank-yxs/p/5925563.html 文件IO详解(二)---文件描述符(fd)和inode号的关系 ---------------- ...

  3. PopUpWindow使用详解(二)——进阶及答疑

    相关文章: 1.<PopUpWindow使用详解(一)--基本使用> 2.<PopUpWindow使用详解(二)--进阶及答疑> 上篇为大家基本讲述了有关PopupWindow ...

  4. Android init.rc文件解析过程详解(二)

    Android init.rc文件解析过程详解(二) 3.parse_new_section代码如下: void parse_new_section(struct parse_state *state ...

  5. linux 进程间通信 dbus-glib【实例】详解二(下) 消息和消息总线(ListActivatableNames和服务器的自动启动)(附代码)

    linux 进程间通信 dbus-glib[实例]详解一(附代码)(d-feet工具使用) linux 进程间通信 dbus-glib[实例]详解二(上) 消息和消息总线(附代码) linux 进程间 ...

  6. linux 进程间通信 dbus-glib【实例】详解二(上) 消息和消息总线(附代码)

    linux 进程间通信 dbus-glib[实例]详解一(附代码)(d-feet工具使用) linux 进程间通信 dbus-glib[实例]详解二(上) 消息和消息总线(附代码) linux 进程间 ...

  7. Android Gradle 自定义Task详解二:进阶

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/78523958 本文出自[赵彦军的博客] 系列目录 Android Gradle使用 ...

  8. Android Loader 异步加载详解二:探寻Loader内部机制

    Android Loader 异步加载详解二:探寻Loader内部机制 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/7025991 ...

  9. EXT核心API详解(二)-Array/Date/Function/Number/String

    EXT核心API详解(二)-Array/Date/Function/Number/String Array类 indexOf( Object o )  Number object是否在数组中,找不到返 ...

  10. OS--进程间通信详解(二)

    OS–进程间通信详解(二) 文章目录 OS--进程间通信详解(二) 一.进程间通信 1.互斥量 Futexes Pthreads中的互斥量 2.管程 3.消息传递 消息传递系统的设计要点 用消息传递解 ...

最新文章

  1. 【.NET开发之美】如何提高.NET DataMap中的加载速度
  2. 全球20大智慧城市排行榜揭晓:无锡列中国第一,银川、杭州上榜!
  3. python_day6.2
  4. 短序列组装Sequence Assembly(转载)
  5. 手把手教你将H5游戏打包为手游
  6. [SDOI2011]计算器 BSGS
  7. Javascript 对象一(对象详解)
  8. rhel5 给grub 加密,亲测!
  9. python计算凸包并绘制凸包曲线
  10. linux CentOS普通用户无法从ssh登录解决方案
  11. mariadb用户群体mysql_mysql(mariadb)新建用户及用户授权管理
  12. 10个基于 Ruby on Rails 构建的顶级站点
  13. 线程的常用方法(1)
  14. VS2010创建OCX控件
  15. 上瘾啦,又用 Python 制作销售数据可视化看板
  16. EasySwoole3 Crontab的使用
  17. Java代码的.equest的空指针异常
  18. 【工具使用系列】TeX宏包之绘图宏包pgf/tikz
  19. 三星note20u计算机功能,【三星Note20U上手简单评测】
  20. Geometric Distortion Correction 畸变矫正

热门文章

  1. 字符串 拼接方法,公司内部的方法,用集合转换成拼接的字符串
  2. android webview gettitle,Android-webview加载网页去除标题
  3. socket read阻塞_go tcp中的ioutil.ReadAll阻塞的问题
  4. java string 连续字符_Java中字符串中连续相同字符去重方法
  5. Java设计模式(备忘录模式-解释器模式-状态模式-策略模式-职责链模式)
  6. 人工神经网络发展历史及算法应用综述
  7. 会开了一天,赛题有结果了吗?
  8. 智能车竞赛技术报告 | 智能车视觉 - 武汉理工大学 - WHY
  9. 第十六届全国大学生智能车参赛与防疫承诺书
  10. Carmaer 500W 逆变器初步测试