Ansible

运维工具的分类:
agent(有客户端):puppet(重量级) func, ...
agentless(无客户端ssh):ansible(轻量级), fabric

1.Ansible简介

Ansible是一个简单的自动化运维工具,可用于自动化部署。可以自动化部署应用,配置等。

2.为什么选择Ansible?

· Ansible完全基于Python开发,方便Ansible二次开发

· 丰富的内置模块

· Ansible去中心化,一次简单的复制即可完成配置中心的迁移

· Ansible无客户端只有主机端

· 底层基于OpenSSH

· 没有额外的软件包消耗系统性能

3.Ansible核心主要组件

1.jpg

Ansible:Ansible的核心程序

Host Lnventory:记录了每一个由Ansible管理的主机信息,信息包括ssh端口,root帐号密码,ip地址等等。可以通过file来加载,可以通过CMDB加载

Playbooks:YAML格式文件,多个任务定义在一个文件中,使用时可以统一调用,“剧本”用来定义那些主机需要调用那些模块来完成的功能.

Core Modules:Ansible执行任何管理任务都不是由Ansible自己完成,而是由核心模块完成;Ansible管理主机之前,先调用core Modules中的模块,然后指明管理Host Lnventory中的主机,就可以完成管理主机。

Custom Modules:自定义模块,完成Ansible核心模块无法完成的功能,此模块支持任何语言编写。

Connection Plugins:连接插件,Ansible和Host通信使用

4.Ansible执行过程

2.jpg

5.Ansible目录结构介绍

♥ 配置文件目录: /etc/ansible/

· ansible.cfg:自身配置文件
· hosts:资产清单

♥ 执行文件目录:/usr/bin/ 
♥ Lib库依赖目录: /usr/lib/pythonX.X/site-packages/ansible/
♥ Help文档目录:/usr/share/doc/ansible-X.X.X/ 
♥ Man文档目录:/usr/share/man/man1 
♥ 插件目录:/usr/share/ansible_plugins

6.工具集

Ansible命令执行的方式有Ad-HOC、Ansible-playbook两种方式
(1)ansible命令
主要运用场景:

  • 非固化需求
    比如工作共临时查看某个服务器是否存活
ansible一般用三种颜色来表示返回结果:

   绿色:所有任务均正常执行

   红色:执行过程中有异常,一般会不执行剩下所有的任务

   橘黄色:执行过程中没有异常,但是结束后目标有状态的变化

  • 临时一次性操作

  • 二次开发调用接口

(2)ansible-galaxy
GitHub或PIP功能,通过ansible-galaxy命令,我们可以根据下载量和关注量等信息,查找和安装优秀的Role。下载地址为https://galaxy.ansible.com

ansible-galaxy命令分为三大部分:

1)[init|info|install|list|remove|login|import|delete|setup]等

♥ init:初始化本地的Roles配置,以备上传Roles至galaxy

♥ info:列表指定Role详细信息

♥ install:下载并安装galaxy指定的Roles到本地

♥ list:列出本地已下载Roles

♥ remove:删除本地已下载的Roles

2)help用法显示[--help]
eg:
ansible-galaxy init --help

3)参数项[options]
eg:
ansible-galaxy init [options] role_name

(4)ansible-pull
该指令涉及Ansible另外一种工作模式:pull模式 (ansible默认使用push模式)
ansible-pull [options] [playbook.yml]

ansible-pull一般在配置大批量机器的场景下会使用,灵活性稍有欠缺,但是效率性会有所提升
此模式适合以下场景:

①有数据巨大的机器需要配置,即使使用高并发线程依旧要花费很多时间;

②要在刚启动的,没有网络联机的主机上运行ansible;

(5)ansible-doc
ansible-doc是模块文档说明,相当于Linux系统man命令类似
ansible-doc [option] [module...]

eg:
ansible-doc -l #列出支持的模块
ansible-doc ping #ping 模块功能说明

(6)ansible-playbook

工作中使用频率最高的命令,工作机制是:通过读取预先编写好的playbook文件实现批量管理。
要实现的功能和ansible一样。

ansible-playbook命令后面跟yaml格式的playbook文件,执行实现编排好的任务集 eg:
 ansible-playbook playbook.yaml

(7) ansible-vault
ansible-vault主要用于配置文件加密,如编写的playbo配置文件中包含敏感信息,不希望其他人
随意查看,ansible-vault可加密/解密这个配置文件

ansible-vault [create|decrypt|edit|encrypt|rekey|view] [--help] [options] file-name

eg:

1)设定如下密码,加密a.yml文件

ansible-vault encrypt a.yml

2)解密后正常查看

ansible-vault decrypt a.yaml

(8)ansible-console
ansible-console是Ansible为用户提供的一款交互式工具

一般主要用到的三个是:ansible,ansible-playbook,ansible-doc

7.Ansible Iventory(资产清单)配置及详解

Inventory是Ansible管理主机信息的配置文件,相当于系统的Hosts功能,默认放
在/etc/ansible/hosts里。如果有多个可以用-i指定。

eg:
ansible -i /etc/ansible/inven webs -m ping

如果只有一个Inventory时可不用指定路径,默认读取/etc/ansible/hosts

1) 定义主机和组

· Inventory配置文件遵循INI风格,中括号中的字符为组名

· 支持将一个主机同时归并到多个不同的组中

· 若目标主机使用了非默认的SSH端口,还可以使用冒号加端口来标明,默认端口是22

· 可以直接使用IP地址

· 支持hostname
eg:

[webserver]

10.10.10.1

10.10.10.1:2222

ymd

ymd:2222

连续主机也可以用数字或字母表示:


web[1:10] 相当于web1,web2...web10

db-[a-c] 相当于db-a,db-b.db-c

2) Iventory参数列表

  • ansible_ssh_host:
将要连接的远程主机名.与你想要设定的主机的
别名不同的话,可通过此变量设置.
  • ansible_ssh_port:
ssh端口号如果不是默认的端口号,通过此变量设置.
  • ansible_ssh_user :
默认的 ssh 用户名 root
  • ansible_ssh_pass:
ssh 密码(这种方式并不安全,我们强烈建议使用 --ask-pass 或 SSH 密钥)
  • ansible_sudo_pass:
sudo 密码(这种方式并不安全,我们强烈建议使用 --ask-sudo-pass)
  • ansible_connection:
与主机的连接类型.比如:local, ssh 或者 paramiko. Ansible 1.2 以前默认使用 
paramiko.1.2 以后默认使用 'smart','smart' 方式会根据是否支持 ControlPersist, 来判断'ssh' 方
式是否可行
  • ansible_ssh_private_key_file ssh :
使用的私钥文件.适用于有多个密钥,而你不想使用 SSH 代理的情况.
  • ansible_shell_type :
目标系统的shell类型.默认情况下,命令的执行使
用 'sh'  语法,可设置为 'csh' 或 'fish'.
  • ansible_python_interpreter :
目标主机的 python 路径.适用于的情况: 系统中有多个 Python, 或者命令路径不
是"/usr/bin/python",比如 \*BSD, 或者 /usr/bin/python 不是 2.X 版本的 Python.我们
不使用 "/usr/bin/env" 机制,因为这要求远程用户的路径设置正确,且要求 "python" 可执行程序名
不可为 python以外的名字(实际有可能名为python26). 与 ansible_python_interpreter 的工
作方式相同,可设定如 ruby 或 perl 的路径...

3) Ansible与正则
(1)all(全量)匹配

匹配所有主机,all护着*(星号)功能相同,但星号需引起来

eg:

ansible all -m ping

ansible "*" -m ping

检查10.10.10.1/24网段所有主机存活状况

ansible 192.168.1.* -m ping

(2)逻辑或(or)匹配

如果我们希望对多个主机或者多个组同时执行,相互之间用“:”(冒号)

eg:
ansible "web1:web2"  -m ping

(3)逻辑非(!)匹配

主要针对多重条件的匹配原则

eg:
webserver:!staging
//所有在webserver组里面而不再staging组里面

(4)逻辑与(&)匹配

eg:
webserver:&staging
//webserver和staging组里面共同的主机

(5)模糊匹配

*通配符表示0或者多个字符
eg:
*.com

(6)域切割

[webservers]

cobweb

webbing

weber
这相当于一个数组:

webservers=[cobweb,webbing,weber]

可以用数组下表获取对应的变量值:
webservers[0] //cobweb
webservers[0:1] //cobweb,webbing

(7)支持正则匹配

8.ansible命令介绍:

Ansible [option] Options:

-a MODULE_ARGS, --args=MODULE_ARGS    模块的参数,如果执行默认COMMAND模块,即是命令参数,如:“date”,"pwd"等等

-k, --ask-pass  登录密码,提示输入SSH密码而不是假设基于密钥的验证

--ask-su-pass  su切换密码

-K, --ask-sudo-pass  提示密码使用sudo,sudo表示提权操作

--ask-vault-pass   vault密码

-B SECONDS, --background=SECONDS     后台运行超时时间

-C, --check       只是测试一下会改变什么内容,不会真正去执行

-c CONNECTION, --connection=CONNECTION   连接类型使用。可能的选项是paramiko(SSH),SSH和地方。当地主要是用于crontab或启动。

-f FORKS, --forks=FORKS   并行任务数。NUM被指定为一个整数,默认是5

-h, --help   打开帮助文档API

-i INVENTORY, --inventory-file=INVENTORY    指定库存主机 文件的路径,默认为/etc/ansible/hosts

-l SUBSET, --limit=SUBSET    进一步限制所选主机/组模式  --limit=192.168.91.135 只对这个ip执行

--list-hosts 列出符合条件的主机列表

-m MODULE_NAME, --module-name=MODULE_NAME   执行模块的名字,默认使用 command 模块,所以如果是只执行单一命令可以不用 -m参数

-M MODULE_PATH, --module-path=MODULE_PATH    要执行的模块的路径,默认为/usr/share/ansible/

-o, --one-line    标准输出至一行

-P POLL_INTERVAL, --poll=POLL_INTERVAL 定期返回后台进度

--private-key=PRIVATE_KEY_FILE    私钥路径,使用这个文件来验证连接

-S, --su              run operations with su    用 su 命令

-R SU_USER, --su-user=SU_USER      指定SU的用户,默认是root用户

-s, --sudo         相当于Linux系统下的sudo命令

-U SUDO_USER       sudo到哪个用户,默认为 root  

-T TIMEOUT, --timeout=TIMEOUT    指定SSH默认超时时间,  默认是10S

-t TREE, --tree=TREE   将日志内容保存在该输出目录,结果保存在一个文件中在每台主机上。

-u REMOTE_USER, --user=REMOTE_USER    远程用户, 默认是root用户

--vault-password-file=VAULT_PASSWORD_FILE

-v, --verbose 详细信息

--version 输出ansible的版本

9.Ansible常用模块

(1)ping:探测目标主机是否存活;

eg:
# ansible hosts -m ping

(2)command:在远程主机执行命令;不支持|管道命令

相关选项:

creates:一个文件名,当该文件存在,则该命令不执行

free_form:要执行的linux指令

chdir:在执行指令之前,先切换到该目录

removes:一个文件名,当该文件不存在,则该选项不执行

executable:切换shell来执行指令,该执行路径必须是一个绝对路径
eg:

- name: test

  command: /usr/bin/make_database.sh arg1 arg2

  args:

    chdir: somedir/

    creates: /path/to/database

(3)shell:在远程主机上调用shell解释器运行命令,支持shell的各种功能,例如管道等 ;

注意:command和shell模块的核心参数直接为命令本身;而其它模块的参数通常为“key=value”格式;
eg:

---

- hosts: node1

  gather_facts: flase  #(gather_facts获取节点的信息)

  tasks:

    - name: "hello world"

      shell: echo "hello world" `date` by `hostname` > /tmp/hello.log

(4)copy:复制本地文件到远程或者远程到远程主机,此时的远程主机为一个,可以改权限等

用法:

(1) 复制文件

    -a "src=  dest=  "

(2) 给定内容生成文件

        -a "content=  dest=  "
相关选项如下:

backup:在覆盖之前,将源文件备份,备份文件包含时间信息。有两个选项:yes|no content:用于替代“src”,可以直接设定指定文件的值

dest:必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录

directory_mode:递归设定目录的权限,默认为系统默认权限 force:如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,如果为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为

yes others:所有的file模块里的选项都可以在这里使用

src:被复制到远程主机的本地文件,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用“/”来结尾,则只复制目录里的内容,如果没有使用“/”来结尾,则包含目录在内的整个内容全部复制,类似于rsync。

(5)file :设置文件属性。

用法:

(1) 创建目录:

-a "path=。。。  state=directory"

(2) 创建链接文件:

-a "path=。。。  src=...  state=link"

(3) 删除文件:

-a "path=。。。  state=absent"

相关选项如下:

force:需要在两种情况下强制创建软链接,一种是源文件不存在,但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no

group:定义文件/目录的属组

mode:定义文件/目录的权限

owner:定义文件/目录的属主

path:必选项,定义文件/目录的路径

recurse:递归设置文件的属性,只对目录有效

src:被链接的源文件路径,只应用于state=link的情况

dest:被链接到的路径,只应用于state=link的情况

state: 

directory:如果目录不存在,就创建目录

file:即使文件不存在,也不会被创建

link:创建软链接 

hard:创建硬链接 

touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间 

absent:删除目录、文件或者取消链接文件

(6)fetch:从远程某一个主机获取文件到本地

Dest: 用来存放文件的目录

Fail_on_missing:当源文件不存在的时候,标识为失败

Flat:允许覆盖默认行为从hostname/path到/file,如果 dest以/结尾,它将使用源文件的基础名称

Src:在远程拉去的文件,并且必须是一个file,不能是目录

Validate_checksum:当文件fetch之后进行md5检查

注意:在拉取的时候,必须是文件,不能拉取文件夹

(7)raw:类似于shell,推荐优先使用raw

(8)cron: 管理cron计划任务

- a "": 设置管理节点生成定时任务

action: 

cron backup=  #如果设置,创建一个crontab备份

cron_file=  #如果指定, 使用这个文件cron.d,而不是单个用户crontab day= #日应该运行的工作( 1-31, *, */2, etc ) hour= # 小时 ( 0-23, *, */2, etc )

job= #指明运行的命令是什么

minute= #分钟( 0-59, *, */2, etc )

month= #月( 1-12, *, */2, etc )

name= #定时任务描述

reboot #任务在重启时运行,不建议使用,建议使用special_time special_time   # 特殊的时间范围,参数:reboot(重启时),annually(每年),monthly(每月),weekly(每周),daily(每天),hourly(每小时)

state        #指定状态,prsent表示添加定时任务,也是默认设置,absent表示删除定时任务

user #以哪个用户的身份执行 weekday   # 周 ( 0-6 for Sunday-Saturday, *, etc )

(9)yum:yum安装软件,也有apt,zypper

conf_file #设定远程yum安装时所依赖的配置文件。如配置文件没有在默认的位置。

disable_gpg_check#是否禁止GPG checking,只用于`present' or `latest'。

disablerepo   #临时禁止使用yum库。只用于安装或更新时。

enablerepo    #临时使用的yum库。只用于安装或更新时。

name=    #所安装的包的名称

state  #present安装, latest安装最新的, absent 卸载软件。

update_cache  #强制更新yum的缓存。

(10)service: 服务程序管理

arguments   #命令行提供额外的参数

enabled     #设置开机启动。

name=       #服务名称

runlevel    #开机启动的级别,一般不用指定。

sleep       #在重启服务的过程中,是否等待。如在服务关闭以后等待2秒再启动。

state     #started启动服务, stopped停止服务, restarted重启服务, reloaded重载配置

(11)group: 组管理

[root@node1 ~]# ansible-doc -s group

- name: 添加或删除组

action: group

gid       # 设置组的GID号

name=     # 管理组的名称

state     # 指定组状态,默认为创建,设置值为absent为删除

system    # 设置值为yes,表示为创建系统组

(11)User:用户管理

-a ""

action: user

comment    # 用户的描述信息

createhom  # 是否创建家目录

force      # 在使用`state=absent'是, 行为与`userdel --force'一致.

group      # 指定基本组

groups     # 指定附加组,如果指定为('groups=')表示删除所有组

home       # 指定用户家目录

login_class     #可以设置用户的登录类 FreeBSD, OpenBSD and NetBSD系统.

move_home       # 如果设置为`home='时, 试图将用户主目录移动到指定的目录

name=           # 指定用户名

non_unique      # 该选项允许改变非唯一的用户ID值

password        # 指定用户密码

remove          # 在使用 `state=absent'时, 行为是与 `userdel --remove'一致.

shell           # 指定默认shell

state           #设置帐号状态,不指定为创建,指定值为absent表示删除

system          # 当创建一个用户,设置这个用户是系统用户。这个设置不能更改现有用户。

uid             #指定用户的uid

update_password  # 更新用户密码

expires         #指明密码的过期时间

10、playbook

3.png

1.基本YAML语法

1)文件必须以yaml或者yml结尾
2) “- - -”(3个减号)是文件的开始行,表明一个文件的开始;“...”表示一个文件的结束 
3)#号代表注释 
4)缩进代表层级关系,缩进必须统一,不能空格和Tab混用 
5)缩进级别一致必须左对齐 
6)大小写敏感 
7)元素用键值(k/v)方式写,使用“:”冒号分割,冒号后空一格,再写值 
8)一个完整的代码块功能最少元素须包括name和task 
9)每个“:”和“-”后边都需要跟一个空格 
10)一个name只能包含一个task

2.playbook 组成结构

  • hosts:执行这个剧本的主机或者主机组

    tasks:任务 即调用模块完成的某操作

    - name:简述任务的功能
    
      moudule:option
    
      Vars:变量
    
      Templates:模板 根据客户端的情况来生成一些的数据
    
      Handlers:处理器 由某条件满足能触发执行的操作
    

Roles:角色

(1)playbook中的每一个play的目的都是为了让某个或者某些主机以某个指定的用户身份来执行任务

如下面所示
- hosts: webnodes
 remote_user: root

hosts: 是用于指定要执行的指定任务的主机,其可以是一个或者多个以冒号分割的主机组,

remote_users:则用于指定远程主机上的执行任务的用户

不过 remote_users 也可以用于每个task中,也可以通过指定其通过sudo的方式在远程的主机上执行任务,其可以于play全局或者某任务中,此外,甚至可以在sudo时使用sudo_user 指定sudo时切换的用户

- hosts: webnodes

  remote_user: bds

  tasks:

  - name: test connection

    ping:

    remote_user: bds   

    sudo: yes

(2)任务列表和action

play的主体部分是task list

task list中的各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任
务后在开始第二个任务,在运行自上而下某个playbook时,如果中途发生错误,所有已经执行的任务都会讲回滚,因此,在更正playbook后重新执行一次即可

task目的是使用指定的参数执行模块,而在模块参数中可以使用变量,模块执行是具有幂等性的,这意味着多次执行是安全的,因为其结构均一致

每个task都应该有其name ,用于playbook执行结果输出,建议其内容尽可能清晰地描述任务执行步骤,如果未提供name,则action的结果将用于输出

定义task的可以使用“action: module option”或者module: options

推荐使用后者以实现向后兼容,如果action 一行的内容过多,也可以使用在行首使用几个空白字符进行换行。

tasks:

- name: make sure apache is running

  service: name=httpd state=running

在众多模块中,只用command和shell模块仅需要给定一个列表而无需使用“key=value”格式例如

tasks:

- name: disable selinux

  shell: /sbin/setenforce 0

(3)执行playbook
ansible-playbook命令来执行剧本

1)- -limit:我们可以通过"-hosts:"字段来指定哪些主机将会应用Playbook操作,也可以直接用ansible-playbook执行

eg:
ansible-playbook palybook.yaml --limit node1

2)--list-hosts:被执行的主机

eg:
ansible-playbook palybook.yaml --limit-hosts


3)用户权限设置 
(1)--remote-user
如果在playbook中,hosts字段下面没有定义users关键字,那么Ansible将使用Inventory文件中定义的用户,如果Inventory也没有定义用户,Ansible将默认使用系统用户身份来通过SSH连接远程主机。我们也可以在playbook中使用--remote-user选项指定用户。
(2)--ask=sudo-pass
为了保证可以传递sudo密码到远程主机,可以用此选项来交互式的输入密码
(3)--sudo
使用--sudo选项,可以强制所有play都使用sudo用户,同时使用--sudo-user选项指定sudo可以执行哪个用户的权限,如果不指定,则默认以root身份运行

eg:
ansible-playbook playbook,yaml --sudo --sudo-user=ymd --ask-sudo-pass

执行过程中,会要求用户输入ymd密码

4)--syntax-check

检测playbook语法

5)--forks=NUM(-f NUM)

指定迸发时的任务数

6)-verbose(v)
显示详细输出,-vvv更详细输出

7)--connection=type (-c TYPE)

指定连接远程主机的连接方式,默认是SSH,设为local时,则在本地执行playbook,建议不做修改

8)inventory=PATH (-i PATH)

指定inventory文件,默认文件是/etc/ansible/hosts

9)--start-at-task="task_name"

运行某个特定的task

10)--check

检测执行,并不是真正执行

3.playbook条件和循环

条件判断使用when,循环使用with_items 1)条件判断 需要开启gather_facts功能,默认开启

eg:

---

- hosts: node1,node2

  gather_facts: yes

  tasks:

   - name: "RedHat"

     shell: echo "RedHat" `date` by `hostname` >> /tmp/hello.log

     when: ansible_os_family == "RedHat"

  - name: "other linux"

    shell: echo "Not RedHat" `date` by `hostname` >> /tmp/hello.log  

    when: ansible_os_family == "RedHat"

2)标准循环

- hosts: node1,node2

  tasks:

    - name: "with_items"

      shell: echo {{item}} `date` by `hostname` >> /tmp/hello.log

      with_items:

       - item1

       - item2

       - item3

4.playbook中使用变量

1)将变量定义在inventory文件(默认为/etc/ansible/hosts)

eg:定义一个linux_os变量

---

#针对单个主机定义变量

10.10.10.1 linux_os=RedHat

[test]

10.10.10.1

#组定义变量

[test:vars]

linux_os=centos

注意:

①组定义变量的作用范围是租下的所有主机

②当两种定义方式同时存在时,ansible会优先采用单个主机定义的变量值
# cat  test.yaml

---

- hosts:

  remote_user: root

  tasks:

    - name: debug

      debug: msg="The {{ iventory_hostname }} Value is {{ keyvalue }}"

2)通过ansible-playbook命令行转入

ansible-playbook test.yaml -e "linux_os=RedHat"

3)直接在yaml文件中使用vars字段定义

eg:
# cat test.yaml
---
 - hosts: test
   vars:
     linux_os: playbook
   tasks:
    - name: debug
      debug: msg="The {{ iventory_hostname }} Value is {{ keyvalue }}"

4)通过host_var和group_vars目录来定义变量

在/etc/ansible目录文件下创建host_vars和group_vars两个目录用来存放定义变量的文件。

①针对单机定义的变量

cat host_vars/10.10.10.1

---

linux_os: 10.10.10.1@host_vars

②针对test组变量

cat group_vars/test

---

linux_os: test@group_vars

ansible变量使用的优先级:

ansible-playbook命令直接传入变量

yaml文件定义vars关键字

host_vars下定义变量

inventory中定义主机变量

group_vars下定义变量

inventory中组定义变量

5)在yaml文件中使用vars_files字段定义

eg:

# cat test.yaml

---

 - hosts: test

   vars_files:

     - vars.yaml  #定义变量的文件

   tasks:

    - name: debug

      debug: msg="The {{ iventory_hostname }} Value is {{ keyvalue }}"

6)使用register传递变量 register用于在task之间传递变量

cat register.yaml

---

- hosts: test

  tasks:

     - name: register test

       shell: hostname

       register: info

     - name: display info

       debug: msg="Hostname is {{ info }}"

register定义的info变量在第二个task中用来查看第一个task中执行的hostname命令的结果


[图片上传中...(5.jpg-22a77e-1539335940237-0)]

如果只想看到stdout部分信息,可以通过info['stdout']来引用

cat register.yaml

---

- hosts: test

  tasks:

     - name: register test

       shell: hostname

       register: info

     - name: display info

       debug: msg="Hostname is {{ info['stdout'] }}"
5.jpg

7)使用vars_prompt交互式传入变量 在playbook中定义vars_prompt变量名和交互式提示信息,就可以实现在运行playbook时,通过交互的传入变量值。


cat prompt.yaml

---

- hosts: test

  vars_prompt:

    - name: "var1"

      prompt: "input value for var1"

      private: no

    - name: "var2"

      prompt: "input value for var2"

      private: yes

      default: 'test vars'

  tasks:

    - name: display var1

      debug: msg="The value of var1 is {{ var1 }}"

    - name: display var2

      debug: msg="The value of var1 is {{ var2 }}"

5.handle触发之后才可执行


# cat handler.yaml

- hosts: 10.10.10.1

  remote_user: root

  tasks:

  - name: install nginx

    yum: name=nginx state=present

  - name: installl configure file

    notify: restart httpd service

    template: src=nginx.conf.j2 dest=/etc/nginx/conf/nginx.conf

  - name:start nginx service

    service: name=nginx state=started

  handlers:

  - name: restart nginx service

    service: name=nginx state=restarted

某任务的状态在运行后为changed时,可通过“notify”通知给相应的handlers;

6.运行playbook

1)从制定的任务开始执行playbook,使用“--start-at”选项:


ansible-playbook playbook.yaml --start-at="install packages"

上面的命令就会从名字为“install packages”的任务开始执行你的playbook

2)分步运行playbook --step选项来交互式的执行playbook:

ansible-playbook playbook.yaml --step

(y/n/c):

y:会执行该任务

n:回答会跳过该任务

c:回答会继续执行剩余的所有任务而不再询问你

拷贝远程主机文件到FTP主机


# cat lftp.yaml

- hosts: YMD_ZONE

  tasks:

    - name: Tansfer file to 10ftp

      raw: lftp -c "open -u ftpuser,ftpuser ftp://10.10.10.1;mkdir {{ ansible_date_time.date }};cd {{ ansible_date_time.date }};mkdir {{ ansible_hostname }};cd {{ ansible_hostname }};put /root/app/testfile/test.dat"

角色(roles):

    角色集合:
        roles/
            mysql/
            httpd/
            nginx/
            memcached/
            
    每个角色,以特定的层级目录结构进行组织:
        mysql/
            files/ :存放由copy或script模块等调用的文件;
            templates/:template模块查找所需要模板文件的目录;
            tasks/:至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含;
            handlers/:至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含;
            vars/:至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含;
            meta/:至少应该包含一个名为main.yml的文件,定义当前角色的特殊设定及其依赖关系;其它的文件需要在此文件中通过include进行包含;
            default/:设定默认变量时使用此目录中的main.yml文件;
在playbook调用角色方法1:
        - hosts: websrvs
          remote_user: root
          roles:
          - mysql
          - memcached
          - nginx
在playbook调用角色方法2:传递变量给角色
        - hosts: 
          remote_user:
          roles:
          - { role: nginx, username: nginx }
            键role用于指定角色名称;后续的k/v用于传递变量给角色;
            
        还可以基于条件测试实现角色调用;
        roles:
        - { role: nginx, when: "ansible_distribution_major_version == '7' " }
        
ansible-vcs:
    https://github.com/andrewrothstein/ansible-vcs \
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容

  • 一.ansible (1) ansible: ansible是一款新出现的自动化运维系统,基于python开发并集...
    楠人帮阅读 1,873评论 0 8
  • ansible介绍ansible常用模块使用playbooktemplates,模板条件测试和循环迭代roles,...
    哈喽别样阅读 1,369评论 0 3
  • 安装ansible 1.yum安装:RHEL(Centos)7版本: 2.Apt(Ubuntu)安装方式: 3.h...
    爱吃土豆的程序猿阅读 11,059评论 0 12
  • 作为背锅侠运维工作的基本流程 运维工具的分类 : ansible的模块化: ansible密钥登陆 ansible...
    二郎5阅读 4,081评论 0 10
  • ansible-playbook playbook简介 playbook是ansible用于配置,部署,和管理被控...
    bdslinux阅读 10,668评论 1 12