一、简介

一、Ansible简介
Ansible是一个开源的计划管理引擎,使用Python编写,是一个无代理的化解方案,通过默许的OpenSSH连接到一个受控节点。由Cobbler的撰稿人和Func框架的合作者迈克尔DeHaan开发。Ansible于二零一五年5月被开源巨头RedHat收购,希望未来Ansible能结合RedHat系统发挥巨大功用。

利用命令生成秘钥(机器互信)

[root@ansible ~]# ssh-keygen 

将公钥发送到所有安装 客户端的主机

[root@ansible ~]# ssh-copy-id 192.168.163.170

[root@ansible ~]# ssh-copy-id 192.168.163.171

###### Ansible总结

眼看有过多的运维自动化工具( 配置管理
),例如:Ansible、SaltStack、Puppet、Fabric 等。

澳门金沙国际 1
二、安装Ansible
1.环境
角色 主机名 IP 组名 系统
Master test.elisun.com 192.168.1.209 ———— CentOS 6.5
Node1 test1.elisun.com 192.168.1.210 webservers CentOS 6.5
Node2 test2.elisun.com 192.168.1.211 dbservers CentOS 6.5

安装 Ansible 软件

[root@ansible ~]# yum install -y ansible

修改配置文件,将客户机添加进组,

(在文末添加即可)

[root@ansible ~]# vim /etc/ansible/hosts 

[webserver]

192.168.163.170

192.168.163.171

##### 运维工作: 
系统装置(物理机、虚拟机)–>程序包安装、配置、服务启动 –>
对主机批量操作 –> 程序版本更新 –>监控

Ansible 一种集成 IT 系统的配备管理、应用布署、执行一定职务的开源平台,是
AnsibleWorks 集团归属的类型,该集团由 Cobbler 及 Func 的撰稿人于 2012
年创设创立。

2.安装Ansible
由于方今ansible还并未被并入到红帽的默许yum仓库中,所以要求安装epel。
# rpm -Uvh

# yum install ansible
三、Ansible基本配置
1.ansible主机和主机组定义
默许定义主机的公文为/etc/ansible/hosts
192.168.1.210
test2.elisun.com
test[1:2].elisun.com
[webservers]
192.168.1.210
[dbservers]
192.168.1.211
[WebsAndDbs:children]
webservers
dbservers
概念规则:
主机可以用域名、IP、别名举行标识,[webservers]、[dbservers]为组名,组名的花花世界为组的成员,所以对于单个主机来说,一定要靠上写。
可以行使通配符、范围等象征主机群(例如test[1:2].elisun.com,表示七个主机)。
支撑组嵌套,父组名+”:children”,如[WebsAndDbs:children],其下跟上要包涵的组名,可以用”ansible
WebsAndDbs –list-hosts”命令列出其下富含的主机。
2./etc/ansible/ansible.cfg
ansible的主配置文件,可以修改许多默许配置,无需重启,例如可以打开日志记录,去掉’log_path
= /var/log/ansible.log’前面的’#’即可。
3.安顿SSH无密码验证
是因为ansible是遵照ssh举办操作的,所以每趟操作都亟需输入密码依旧将密码写入到安插文件,所以为了便于和安全选择ssh无密码原则,配置请自行检索。
四、 Ansible常用模块(命令行操作格式为:ansible 主机 -m 模块名 -a
‘模块参数’)

ansible(主)命令体验:

1.ping

ansible all -m ping 

!检测机器是不是可登录,ping模块不须要传送参数

!注:那里的ping模块并非调用了系统的ping命令,而是类似于登录到长途机器再echo出一个新闻。

2.command

!可以实施任意命令,但不接受管道命令和重定向符号,即使想利用那个,则必要利用Shell模块。

ansible all -m command -a “ls” #在享有匹配主机上举办ls命令

playbook:

– name: test for command

command: ls

3.copy

#复制一个文件到长途服务器

ansible all -m copy -a “src=/tmp/text.txt dest=/home/tmp/”

#将本地text.txt文件复制到所有匹配主机的/home/tmp/路径下。

playbook:

– name: test for copy

copy: src=/tmp/text.txt dest=/home/tmp/ force=yes

4.file

本条模块本次创设系统中并没有使用,官方的表达是用来设置文件、文件夹或快链的品质,或者去除文件、快链、文件夹。

创立一个文本夹,若是目的不设有

ansible webservers -m file -a “path=/tmp/tdir state=directory mode=0755”

playbook

– name: create a directory if it doesn’t exist

– file:

path: /etc/some_directory

state: directory

mode: 0755

5.get_url

!从服务器上下载一个文本到长途主机指定的目录

ansible webservers -m get_url -a “url=’
dest=/tmp/ba.html”

playbook

– name: download foo.conf

get_url:

url:

dest: /etc/foo.conf

mode: 0440

6.yum

专门适用于批量装置一些凭借包的时候

ansible webservers -m yum -a “name=httpd state=latest”

ansible webservers -m yum -a “name=httpd state=absent” !删除包

playbook

– name: install the latest version of Apache

yum:

name: httpd

state: latest 

7.service

支配远程服务器上的服务

ansible webservers -m service -a “name=nginx state=restart”

playbook

– name: restart rmote nginx

service: name=nginx state=restart

8.setup

收集远程服务器音信

ansible all -m setup

在playbook中,那项义务默许是实践的,不需求列出。

9.server start

ansbile all -m service -a ‘name=httpd state=started

10.script

ansibleall -m script -a ‘/root/123.sh

11.shell

ansible all -m shell -a “echo $RANDOM | tr’0-9′ ‘a-z’ > /root/123”

    OS Provisioning:

Ansible 基于 Python 语言落成,由 Paramiko 和 PyYAML 多少个重大模块创设。

  1. Ping模块
    Ping模块验证与目的主机的连通性。
    # ansible webservers -m ping
  2. 远程命令模块
    模块包涵command、script、shell,都得以兑现长途shell命令运行。command作为Ansible的默许模块,可以运行远程权限限制内装有shell命令;script功用是在中远距离主机执行主控端存储的shell脚本;shell成效是履行远程主机的shell脚本文件。
    # ansible webservers -m command -a “df -h”
    # ansible webservers -m script -a “/tmp/test.sh”
    # ansible webservers -m shell -a “/tmp/test.sh”
  3. copy模块
    贯彻主控端向目的拷贝文件,类似于scp的职能。
    # ansible webservers -m copy -a “src=/etc/httpd/conf/httpd.conf
    dest=/tmp/ owner=www group=www mode=0644”
  4. stat模块
    得到远程文件状态新闻,包含atime、ctime、mtime、md5、uid、gid等新闻。
    # ansible webservers -m stat -a “path=/etc/passwd”
  5. get_url模块
    心想事成在长途主机下载指定URL到本地,辅助sha256sum文书校验。
    # ansible webservers -m get_url -a “url=
    dest=/tmp/index.html mode=0440 force=yes”
  6. yum模块
    在长途机器上设置软件。
    # ansible webservers -m yum -a “name=httpd state=latest”
  7. cron模块
    长距离主机定时任务。
    # ansible webservers -m cron -a “name=’a job for time sync’
    minute=*/30 job=’/usr/sbin/ntpdate 1.asia.pool.ntp.org && /sbin/hwclock
    -w'”
    效用如下:
    #Ansible: a job for time sync
    */30 * * * * /usr/sbin/ntpdate 1.asia.pool.ntp.org && /sbin/hwclock
    -w
  8. user模块
    长距离主机用户管理。
    # ansible webservers -m user -a “name=eli comment=elisun” (创建)
    # ansible webservers -m user -a “name=eli state=absent remove=yes”
    (删除)
  9. Setup模块
    本条模块帮忙我们采集系统的连锁音讯。
    # ansible webservers -m setup
  10. 模块扶助
    # ansible-doc -l //查看帮助的模块
    # ansible-doc 模块名 //查看该模块的鼎力相助音讯
    五、 Ansible playbook
    本子(playbook)是布局指令的联谊,这几个指令也号称演出(plays)。使用剧本的裨益是足以结合几个Ansible模块。playbook是通过YAML格式进行描述定义的,文件名类同以yml为后缀。
  11. 本子举例 web服务器剧本:apache.yml


    • hosts: webservers
      tasks:
    • name: deploy apache
      yum: pkg=httpd state=latest
    • name: apache config file
      copy: src=’files/httpd.conf’ dest=’/etc/httpd/conf/httpd.conf’
      notify:
    • restart httpd
    • name: apache service runs
      service: name=httpd state=started
      handlers:
    • name: restart httpd
      service: name=httpd state=restarted

        物理机:PXE、Cobbler

二、特性

hosts关键字指定运行那一个指令的主机(/etc/ansible/hosts文件中的webservers组)
tasks关键字表示webservers组中主机上就要执行的模块的初始。每个task至少包括多少个部分,name:是一个标识,让阅读代码的人驾驭那么些职分的法力;首个部分是要推行的Ansible模块(大家上述第三个任务是执行yum模块)。
notify代表响应配置文件更改时举行某些功效的Ansible处理程序名称。
handlers和tasks部分很接近,然而handlers起着异样的效果——响应notify文告操作,即notify表示要干啥,而handlers负责怎么干。注意notify下指定的操作要和handler下的某部name关键字相匹配。
小结一下,一般的本子文件包蕴三个至关主要部分:主机定义(hosts)、变量定义(vars)、义务定义(tasks)、处理程序定义(handles)。

        虚拟机:Image、Templates

配备简单,只需在主控端安插 Ansible 环境,被控端无需做其他操作。

  1. 标准表明式和变量
    地点的例证大家的apache剧本已经准备好,针对的系统是RedHat。但是,假使大家的生产条件有根据Debian的系统(例如,Ubuntu)如何是好?大家要求优雅的处理七种操作系统。
    when:条件语句允许根据偏好调整主机上实施的Ansible义务。
    大家对地点的例子举行修改,以便能依照系统做相应的操作,如下代码。


    • hosts: webservers
      tasks:
      # Deploy the Web Server
    • name: Deploy Apache for Red Hat Systems
      yum: pkg=httpd state=latest
      when: ansible_os_family == ‘RedHat’
    • name: Deploy Apache for Debian Systems
      apt: pkg=apache2 state=latest
      when: ansible_os_family == ‘Debian’

      # Copy Config File

    • name: Apache Config File for Red Hat Systems
      copy: src=’files/httpd.conf’ dest=’/etc/httpd/conf/httpd.conf’
      notify:
    • restart httpd redhat
      when: ansible_os_family == ‘RedHat’
    • name: pache Config File for Debian Systems
      copy: src=’files/apache2.conf’ dest=/etc/apache2/apache2.conf
      notify:
    • restart httpd debian
      when: ansible_os_family == ‘Debian’

      # Verify Web Service is running

    • name: Apache Service Runs for Red Hat Systems
      service: name=httpd state=started
      when: ansible_os_family == ‘RedHat’
    • name: Apache Service Runs for Debian Systems
      service: name=apache2 state=started
      when: ansible_os_family == ‘Debian’

      # Restart Web Service in response to config file change
      handlers:

    • name: restart httpd redhat
      service: name=httpd state=restarted
    • name: restart httpd debian
      service: name=apache2 state=restarted

    Configuration:

支持Linux/UNIX及windows环境

‘#’注释为便于了解。WEB服务器陈设中的每个主要步骤都有两组命令,一组为RedHat系统,另一组为Debian系统。Ansible将求取when:语句的值,决定在目的节点上实施的职责,该语句使用ansible_os_family系统fact变量(ansible
webservers -m setup | grep family)提供模块执行指导。
有木有发现一个标题,上述代码写的太冗余了,大家得以拔取Ansible的group_by函数来简化代码,该函数可以自动根据一些条件(例如,ansible_os_自动化运维工具Ansible,anisble使用及常用模块。family)创设愈来愈多的主机组。一向自/etc/ansible/hosts文件中webservers组初步,告诉ansible从该组中开创附加组,以ansible_os_family系统事实作为选拔条件。对于咱们的系统意味着运行时将开创三个组(RedHat
and Debian),这个主机组将用来剧本的其他部分,代码如下。

        puppet工具(ruby开发)

默许使用 SSH(Secure Shell)协议对设备举行保管,用它来布局Cisco路由也极度便利。

---
- hosts: webservers
tasks:
- name: Group Servers By Operating System Family
action: group_by key={{ ansible_os_family }}
- hosts: RedHat
- name: Deploy Apache
yum: pkg=httpd state=latest
- name: Apache Config File
copy: src='files/httpd.conf' dest='/etc/httpd/conf/httpd.conf'
notify:
- restart httpd
- name: apache service runs
service: name=httpd state=started
handlers:
- name: restart httpd
service: name=httpd state=restarted

- hosts: Debian
- name: Deploy Apache
apt: pkg=apache2 state=latest
- name: Apache Config File
copy: src='files/apache2.conf' dest='/etc/apache2/apache2.conf'
notify:
- restart httpd
- name: apache service runs
service: name=httpd state=started
handlers:
- name: restart httpd
service: name=apache2 state=restarted

        Saltstack(python开发)

骨干集中化管理。
布局不难、作用强大、增添性强。
扶助 API 及自定义模块,可经过 Python 轻松增添。
经过 Playbooks 来定制强大的配备、状态管理。
对云总括平台、大数量都有很好的支撑。
提供一个作用强大、操作性强的 Web 管理界面和 REST API 接口 —- AWX
平台。

when条件语句和group_by函数都得以化解按照操作系统类型来率领剧本执行的难题。
不过,关键的题材是尼玛代码如故那么多,我们接下去通过Ansible的其他力量来优化下代码,代码如下。
#apache.yml

        chef

三、总体架构

---
- hosts: webservers
vars_files: 
- "vars/{{ ansible_os_family }}.yml"
tasks:
- name: Deploy Apache for Red Hat Systems
yum: pkg=httpd state=latest
when: ansible_os_family == 'RedHat'
- name: Deploy Apache for Debian Systems
apt: pkg=apache2 state=latest
when: ansible_os_family == 'Debian'
- name: Apache Config File
copy: src=files/{{ conffile }} dest={{ confpath }}
notify:
- restart httpd
- name: Apache Service Runs
service: name={{ webserver }} state=started
handlers:
- name: restart httpd
service: name={{ webserver }} state=restarted

    Command and Concrol:

 

 

        fabric

澳门金沙国际 2

#RedHat.yml

    预发表环境认证:

四、执行进程

---
webserver: 'httpd'
conffile: 'httpd.conf'
confpath: '/etc/httpd/conf/httpd.conf'
contentpath: '/var/www/html/index.html'

       
新本子的代码先发布到内网测试服务器(跟线上环境布署完全相同,只是未到场到调度器);

澳门金沙国际 3

 

    程序发表:

五、Ansible 与 SaltStack对比

#Debian.yml

        不可能影响用户体验;

>> 最大的区分是 Ansible
无需在被监督主机布置任何客户端代理,默许通过 SSH
通道进行长距离命令执行或下发配置。
>> 相同点是都兼备作用强大、灵活的系统管理、状态配置,都应用 YAML
格式来描述配置,两者都提供充足的模板及
API,对云计算平台、大数额都有很好的协助。

webserver: 'apache2'
conffile: 'apache2.conf'
confpath: '/etc/apache2/apache2.conf'
contentpath: '/var/www/index.html'

        系统不可以停机;

Ansible在github上地址:

 

        不可能导致系统故障或导致系统完全不可用;

 

目录结构
├── apache.yml
├── files
│ ├── apache2.conf
│ └── httpd.conf
├── host
└── vars
├── Debian.yml
└── RedHat.yml
该代码示例中,大家投入了一个新因素:vars_files。那个第一字告诉Ansible大家在哪儿保存剧本中利用的变量。变量必须包含在{{
}}中。直观来看,大家发现经过优化的代码好像依然救经引足,不过不可不可以认的是大家的逻辑更是鲜明了,重复的动作越来越少。因为那一个案例的代码比较少,所以再怎么优化它也很难裁减,可是在更大的台本中,使用变量可能会拉动越来越明显的优化功效。
六、Ansible角色
如今,协会文件是个简易的天职,因为我们只处理Apache的陈设,不过,即便大家想安插别的门类的劳动呢?大家要持续地在此时此刻YAML文件中添加用于数据库、应用服务等的附加演出吧?固然使用模块化设计,将表演分隔到独门的YAML文件中,那么社团文件(配置文件、变量文件等)的极品情势又是怎么着?是将它们位于公共的目录中,照旧基于效益成立差其余子目录?Ansible的小编考虑了那些题材,完结角色效率来落实它们。
Apache Web服务器角色示例:
├── apache.yml
└── roles
└── web
├── defaults
│ └── main.yml
├── files
│ ├── apache2.conf
│ └── httpd.conf
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── tasks
│ └── main.yml
├── templates
└── vars
├── Debian.yml
├── main.yml
└── RedHat.yml
roles目录和apache.yml文件在同级目录下,其他目录和文件在roles目录下。
defaults:
若是角色在调用时接受参数,可以将富含未在主剧本角色中指定的默许值的YAML文件放在那个目录下。
files: 打算复制到目的主机的任何公文。
handlers: 执行响应剧本任务通告的一声令下(例如,配置文件更改后重启服务)
meta: 当前角色所以来的其余Ansible角色引用。
tasks: 剧本职责地点。
templates: 可用于依据系统实际或者其余变量动态变化内容的Jinja2文件。
vars: 剧本使用的变量。

    灰度发表:

Ansible安装配置与布署

apache.yml

  • hosts: webservers
    roles:
  • web
    角色名字web必须与roles文件夹中的子目录名相符合(方能合作)。剧本中的tasks和handlers分隔到了独自的文书,这一个文件名都为main.yml,分别在tasks和handlers子目录下(roles/web/{tasks,handlers}/main.yml)
    roles/web/tasks/main.yml


    • name: Ansible OS Family
      include_vars: ‘{{ ansible_os_family }}.yml’
    • name: Deploy Apache for Red Hat Systems
      yum: pkg=httpd state=latest
      when: ansible_os_family == ‘RedHat’
    • name: Deploy Apache for Debian Systems
      apt: pkg=apache2 state=latest
      when: ansible_os_family == ‘Debian’
    • name: Apache Config File
      copy: src={{ conffile }} dest={{ confpath }}
      notify:
    • restart httpd
    • name: Apache Service Runs
      service: name={{ webserver }} state=started

 

roles/web/handlers/main.yml

---
- name: Ansible OS Family
include_vars: "{{ ansible_os_family }}.yml"
- name: restart httpd
service: name={{ webserver }} state=restarted

 

执行命令:# ansible-playbook apache.yml

澳门金沙国际 4

参照书籍:
《DevOps实战》
《Python自动化运维》

        一种公布方式;在调度器上下线一批主机 –> 关闭服务 –>
陈设新本子的应用程序 –> 启动服务 –> 在调度器上启用这一批主机;

       角色              主机名                 
IP                                组名             

        自动化灰度发表机制:可经过脚本或集团温馨的公布平台发表;

       控制端           hd01                    
192.168.1.11                 ——             

###### 运维工具的分类 :

       被控端           hd02                    
192.168.1.12                 webservers   

    agent:代理工具:puppet,func

       被控端           hd03                    
192.168.1.13                 webservers   

   
agentless:无代理工具:ansible,fabric;agentless类工具必须器重ssh服务;

 

###### ansible的模块化:

Ansible安装

    模块化:调用特定的模块来成功一定的职责;

设置可使用源码编译安装,也足以更新yum源后使用yum安装

    基于python语言达成,由paramaiko、pyYAML和jinja2多个重要模块

 

    安排容易:agentless类工具

yum 安装:

    主从格局:

配置源(centos6)

    扶助自定义模块:

yum install

-y

    支持playbook:

换163的源

###### ansible密钥登陆

wget      

   
ansible是经过ssh完结配置管理、应用安顿、职责执行等效果,由此,必要事先配置ansible端能根据密钥认证的不二法门联系逐个被管制节点;

 mv CentOS6-Base-163.repo /etc/yum.repos.d/

        ansible管理端做密钥:ssh-keygen -t rsa -P ‘’

 yum clean all

        将密钥拷贝到各类被控节点:ssh-copy-id  root@192.168.4.41

 

        ssh远程连接测试:ssh root@192.168.4.41
##有道是不须求密码就足以一直远程进被控端

CentOS6-Base-163.repo紧如果为着设置:PyYAML

######  ansible安装

配置源(centos7)
rpm -iUvh

下载配置文件(centos7)
wget        
 CentOS7-Base-163.repo重假设为着设置:PyYAML
mv CentOS7-Base-163.repo /etc/yum.repos.d/

    ## wget -O /etc/yum.repos.d/epel.repo

yum clean all

    ## yum -y install ansible

 

    配置文件:/etc/ansible/ansible.cfg

安装ansible

    主机清单:/etc/ansible/hosts

yum -y install ansible

###### ansible的粗略利用

查看ansible 版本

    1、修改/etc/ansible/hosts文件,添加ansible被控主机或被控组;

[root@hd01 ~]# ansible –version

        ##必须先在hosts文件添加主机ip,不然远程控制被控端时会报错:
[WARNING]: No hosts matched, nothing to do

ansible 2.5.3

    2、执行一个简易的ansible命令:

  config file = /etc/ansible/ansible.cfg

        在ansible控制端执行:

  configured module search path = [u’/usr/share/my_modules’]

        ansible 192.168.4.41 -m command -a
‘ifconfig’会突显被控端的网卡音信

  ansible python module location =
/usr/lib/python2.6/site-packages/ansible

###### ansible常用模块

  executable location = /usr/bin/ansible

###### 可以选拔‘ansible-doc -s 模块名 ’来查阅模块的详细用法

  python version = 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) [GCC 4.4.7
20120313 (Red Hat 4.4.7-17)]

    ansible用法:ansible  [-f forks] [-m module_name] [-a args]

注:yum装ansible      随着岁月的推移,ansible版本会是风尚版的。

    user模块:

Ansible通过定义好的主机与组规则(Inventory)对才子佳人的靶子主机举行远程操作,配置文件默许是/etc/ansible/hosts

        示例:ansible test -m user -a ‘name=wuyongfeng state=present
system=yes’

定义Host Inventory

            在test组包罗的被控端上创立用户,name为wuyongfeng;

充裕组名及允许执行命令的主机

            state=present表示创造用户,state=absent时表示删除用户;

澳门金沙国际 5

            system=yes表示创建系统用户;

webservers 是组名,上面的是IP也足以采纳域名、别名标识。

group模块:

各主机SSH互信

示例:ansible test -m group -a ‘name =testgroup gid=111 state=present
system=yes’

[root@hd01 ~]# ssh-keygen -t rsa   #创制公钥与私钥

在test组包括的被控端上开创组testgroup;

澳门金沙国际 6

组id为111;

 

state=present表示创制组,state=absent时表示删除组;

一贯回车就OK

syste=yes表示创造系统组,system=no代表创建的不是系统组;

将公钥传给webservers组中的主机

cron模块:

ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.12

示例:ansible test -m cron -a ‘name=”wuyongfeng crontab list”
minute=”*/20″ job=”/sbin/ntpdate 192.168.4.40 &>/dev/null”‘

ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.13

在test组包蕴的被控端添加任务安插,每20分钟向192.168.4.40手拉手时间,并把出口丢如/dev/null;

澳门金沙国际 7

name:安插职责的叙说新闻;

 

minute:分钟;

 

job:要拓展的操作;

测试主机免密 连通性:

day:日(1-31,*,*/2,……);

[root@hd01 ~]# ansible webservers -m ping

hour:小时(0-23,*,*/2,……);

#-m 使用ping模块  -vvv 可以查看详细的执行进度

month:月(1-12,*,*/2,……);

澳门金沙国际 8

weekday:周(0-7,*,……);

 

user:以哪个用户的身价实施;

OK

若要删除从前在被控端计划的布署职责,只需点名name和state=absent即可;

提示:

例如:

使用Linux普通用户账户进行延续并应用sudo命令完结root权限,格式为:

ansible test -m cron -a ‘name=”wuyongfeng crontab list” state=absent’

ansible webservers -m ping -u ansible -sudo

copy模块:

当没有做免密码访问时用 ansible webservers -m ping -k

示例:ansible test -m copy -a ‘src=/data/wyf.txt dest=/tmp/wyf.txt
mode=600’

下一场输入密码 操作

复制ansible控制端的wyf.txt文件到test组所指定的被控端的主机的/tmp目录下

 

src:源路径

至于定义主机与组

dest:指标路径

在/etc/ansible/hosts中主机可以用域名、IP、别名举行标识。

mode:文件权限

/etc/ansible/hosts  中组成员主机名称帮忙正则描述
  组成员主机IP辅助正则描述

file模块:

举例表达 格式:

特意用来设定文件属性;

[webservers]                #组名

ansible test -m file -a ‘path=/tmp/www state=directory’

alpha.example.org    #域名对应192.168.1.100     

在test组定义的被控端的/tmp/下创办www目录,state指定文件属性为目录

beta.example.org     #域名对应192.168.1.110     

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

192.168.1.100               #IP

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

192.168.1.110               #IP

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

 

path:必选项,定义文件/目录的不二法门

mail.example.com

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

192.168.1.90:2135         #概念一个SSH服务端口为:2135的主机  

src:要被链接的源文件的不二法门,只行使于state=link的场馆

 

dest:被链接到的门径,只行使于state=link的景观

组成员主机名称援救正则描述,举例:

state:

[webservers]

=directory:假如目录不存在,创造目录

www.[01:50].example.com

=file:即便文件不设有,也不会被创建

[databases]

=link:成立软链接

db-[a:f].example.com

=hard:创制硬链接

 

=touch:即使文件不设有,则会创立一个新的文件,假诺文件或目录已存在,则更新其最后修改时间

概念主机变量

=absent:删除目录、文件或者裁撤链接文件

长机可以指定变量,以便后边供Playbook配置使用,比如定义主机host1及host2上apache参数http_port及maxRequestsPerChild,目标是让两台主机爆发Apache配置文件httpd.conf差距化,格式:

ping模块:

[atlanta]

用来确认和对象机器之间是不是可以ping通,正常处境会回来pong;

host1 http_port=80 maxRequestsPerChild=808

示例:ansible test -m ping

host2 http_port=303 maxRequestsPerChild=909

ping test组定义的被控端;若是是可以通的则赶回pong;

定义组变量

yum模块:

组变量的成效域是覆盖所有成员,通过定义一个新块,块名由组名+”:vars”组成

示例:ansible test -m yum -a ‘name=httpd  state=present’

格式:

在test组的被控端yum安装httpd;

[atlanta]

config_file:yum的配备文件

host1

disable_gpg_check:关闭gpg_check

host2

disablerepo:不启用某个源

[atlanta:vars]

enablerepo:启用某个源

ntp_server=ntp. atlanta.example.com

name:要举行操作的软件包的名字,也足以传递一个url或者一个地面的rpm包的路子

proxy=proxy.atlanta.example.com

state:状态(present安装,absent卸载,latest最新的)

 

service模块:

 

示例:ansible test -m service -a ‘name=httpd state=started enabled=yes’

协作目的

test组的有着被控端,启动httpd服务,开机启动(enabled)

格式:ansible <目标主机或组> -m <模块名字> -a
<模块参数>

enabled:[yes/no] 启动os后启动对应service的选项;是或不是开机启动

重启webservers组所有Apache服务

name:需求展开操作的service名字

[root@hd01 ~]# ansible webservers -m service -a “name=httpd
state=restarted”

state:[stared/stoped/restarted/reloaded] 服务最终操作后的动静。

 

shell模块:

万分目的主机规则表

示例:ansible test -m shell -a ‘sh /date/1.sh chdir=/date/www
creates=/date/www/1.txt’

192.168.1.12要么hd02              
匹配目的IP地址或主机名,多少个IP或主机名使用”:”号分隔

施行test组所有被控端,先切换来/date/www目录,如若/date/www/1.txt不设有,则实施/data/1.sh,

webservers                               
匹配目的组为webservers五个组利用”:”号分隔

chdir:command一样的,运行shell从前cd到某个目录;

all或者’*’                                   匹配所有主机

creates:跟command一样的,倘若某个文件存在则不运行shell;

hd.*或者192.168.1.*                   匡助正则匹配主机或者IP地址

removes:跟command一样的,如若某个文件不设有则不运行shell;

webservers:!192.168.1.11           
匹配webservers组且排除192.168.1.11主机IP

script模块:

agent:&webservers                    匹配agent和webservers四个组的混合

可以达成被控端上可以执行ansible控制端的本子。

webservers:!{{excluded}}:&{{required}}       协理变量匹配方式

示例:ansible test -m script -a ‘/4.40/www/2.sh’

 

在test组所有被控端执行ansible控制端中/4.40./www/目录下的2.sh

Ansible常用模块及API

setup模块:

Ansible提供了极度丰富的功用模块,包含cloud(云总括)、Commands(命令行)、Database(数据库)、Files(文件管理)、Internal(内置功用)、Monitoring(监控管理)等等。

用于采集远程主机的片段主导消息。

赢得webservers组中主机uptime音信

示例:ansible test -m setup

[root@hd01 ~]# ansible webservers -m command -a “uptime”     

采访test组所有主机的着力音信

 

###### Ansible Playbooks

澳门金沙国际 9

#playbook的大旨因素:

 

Tasks:任务

-m command是默许模块  可粗略

Variables:变量

[root@hd01 ~]# ansible-doc ping

Templates:模板

可获得模块的赞助音信

Handlers:处理器

EXAMPLES:

Roles:角色

# Test we can logon to ‘webservers’ and execute python with json lib.

ansible –yaml语法

# ansible webservers -m ping

一:介绍:

 

YAML是一个可读性高的用来抒发资料连串的格式。YAML参考了别的多样语言,包罗:XML、C语言、Python、Perl等。

# Example from an Ansible Playbook

YAML不是XML,不过,在开发的那种语言时,YAML的意趣其实是:“Yet  Another
Makup Language”(仍是一种标志语言)

– ping:

特点:

 

1、可读性好

# Induce an exception to see what happens

2、松阳黄梅戏本的交互性好

– ping:

3、使用完毕怨言的数据类型

    data: crash

4、有一个一样的新闻模型

 

5、易于落到实处。

RETURN VALUES:

6、可以按照流来处理。

ping:

7、表明能力强,扩大性好。

    description: value provided with the data parameter

二:yaml语法

    returned: success

yaml的语法和此外高阶语言类似,并且可以大约表明清单,散列表,标量等数据结构,其布局通过空格来浮现,系列里的类型用“-”来表示,map里的键值对用“:”分隔,下边是一个演示:

    type: string

name:john smith

    sample: pong

age:41

在playbook中运行远程命令格式:

gender:male

– name: reboot the service

spouse:

  command: /sbin/reboot -t now

name:jane smith

 

age:37

Ansible 常用模块学习

gender:female

shell > ansible-doc -l    # 列出 Ansible 支持的模块

children:

ansible-doc <模块名>查看模块帮忙音信

–  name:jimmy smith

 

age:17

>>远程命令模块( command / script / shell )

gender:male

command 作为 Ansible 的默认模块,可以运作远程权限限制有着的 shell
命令,不辅助管道符。

–  name:jenny smith

例:

age:14

ansible webservers -m command -a “free -m”               # 查看
webservers 分组主机内存使用意况

gender:female

[root@hd01 ~]# ansible webservers -m command -a “free -m”

列表: 也称为连串

澳门金沙国际 10

列表中的所有因素都用“-”打头,例如:

shell 的作用是履行远程主机上的 shell 脚本文件,协理管道符。

– apple

例:

– orange

[root@hd01 ~]# ansible webservers -m shell -a
“/root/test.sh”          # 执行远程脚本

– mango

 

字典:

澳门金沙国际 11

字典通过key与value进行标识,例如:

 


ansible的command和shell模块的区分:

name:example developer

比如说自己要批量刨除一些文本, 

job:developer

[root@hd01 ~]# ansible webservers -m command -a “rm -f
/root/test*.sh”

skill:elite

因为你的通令行中蕴含了通配符*号,通配符必要求有在shell环境中才能被识别出,不然,它不得不删除test*.sh那些文书。

也足以将key:value放置与{}中表示,例如:

澳门金沙国际 12

{name:example developer,job:developer,skill:elite}

 

###### Ansible基础元素

虽突显成功,但目的文件未被剔除

1.变量

澳门金沙国际 13

1.1 变量命名

 

变量名仅能由字母,数字和下划线组成,且不得不以字母伊始

故此您要求执行以下命令才能得逞

1.2 facts

[root@hd01 ~]# ansible webservers -m shell -a “rm -f /root/test*.sh”

facts是由正在通讯的远程目标主机重回的音讯,这一个音信能保存在ansible变量中,要获得指定的长途主机所支撑的有史以来的facts,可采纳如下命令举行

履行之后    

#ansible hostname -m setup

澳门金沙国际 14

1.3 register

关于command模块运行的吩咐中不可以选用管道符的注明。

注册器:把任务的输出定义为变量,然后用于此外职分,示例如下:

澳门金沙国际 15

tasks:

 

– shell:/usr/bin/foo

script 的功用是在长距离主机执行主控端存储的 shell 脚本文件,相当于 scp +
shell 组合。

register:foo_result

例:

ignore_errors:True

[root@hd01 ~]# ansible webservers -m script -a “/root/test.sh”    
 # 远程执行本地脚本

1.4 通过命令行传递变量

192.168.1.12 | SUCCESS => {

在运转playbooks的时候也可以传递一些变量供playboo使用:示例如下:

    “changed”: true,

ansible-playbook test.yml –extra-vars”hosts=www user=mageedu”

    “rc”: 0,

1.5 通过roles传递变量

    “stderr”: “Shared connection to 192.168.1.12 closed.\r\n”,

当给一个主机应用角色的时候可以传递变量,然后在角色内使用那么些变量,示例如下:

    “stdout”: “123\r\n”,

– hosts:webservers

    “stdout_lines”: [

roles:

        “123”

– common

    ]

– { roles:foo_app_instance,dir:’/web/htdocs/a.com’,port 8000 }

}

2.Inventory

192.168.1.13 | SUCCESS => {

ansible的主要效率在于批量主机操作,为了省事地应用其中的有些主机,可以在inventory
file大校其分组命名,默许的inventory file为/etc/ansible/hosts

    “changed”: true,

Inventory file可以有多个,且也得以经过Dynamic Inventory动态变化;

    “rc”: 0,

2.1 Inventory文件格式

    “stderr”: “Shared connection to 192.168.1.13 closed.\r\n”,

Inventory文件INI文件风格,中括号中的字符为组名,可以将同一个主机分配到八个例外的组,别的,当被决定的主机使用了非默许的ssh
22端口时,仍是可以在主机ip或主机名之后选择冒号加端口号标明;示例:

    “stdout”: “123\r\n”,

[webservers]    ##被控组组名

    “stdout_lines”: [

192.168.1.100  ##利用ip添加被控端主机

        “123”

www.mageedu.com:222
##要是被控端没有运用默许的ssh端口,可用冒号加端口号注脚

    ]

要是主机名称坚守相似的命名格式,还能使用列表的情势标识主机,示例:

 

[webservers]

>>copy 模块(实现主控端向目的主机拷贝文件,类似于 scp 功用)

www[1:50].example.com ##表示www1.example.com-www50.example.com的主机

例:

2.2 主机变量

[root@hd01 ~]# ansible webservers -m copy -a “src=/root/test.sh
dest=/tmp/ owner=root group=root mode=0755 backup=yes”

可以在Inventory中定义主机时为其丰盛主机变量以有益在playbook中利用,例如:

# 向 webservers 组中主机拷贝 test.sh 到 /tmp 下,owner:指定属主为
root,group:指定属组为:root ,mode:权限为 0755
, backup:在覆盖从前将原文件备份,备份文件包蕴时间音讯。有四个接纳:yes|no

[webservers]

 澳门金沙国际 16

www1.mageedu.com http_port-80 maxRequestsPerChild-808

 

www2.mageedu.com http_port-8080 maxRequestsPerChild-909

>>stat 模块(获取远程文件状态新闻,atime/ctime/mtime/md5/uid/gid
等音信)

2.3 组变量

例:

组变量是指赋予给指定组内所有主机上的在playbook中可用的变量,例如:

[root@hd01 ~]# ansible webservers -m stat -a “path=/etc/passwd”   
#path指定具体路线

[webservers]

澳门金沙国际 17

www1.mageedu.com

 

www2.mageedu.com

>>get_url 模块(完成在中远距离主机下载指定 URL 到当地,协理 sha256sum
文本校验)

[webservers:vars] 
:vars是固定写法,指定上边两行都可以分级对应给webservers组的两台主机

例:

ntp_server-ntp.mageedu.com

[root@hd01 ~]# ansible webservers -m get_url -a
“url= dest=/tmp/index.html mode=0440 force=yes”  

nfs_server-nfs.mageedu.com

 

2.4 组嵌套

#下载百度首页index.html文件

Inventory中,组还足以涵盖其余的组,并且也足以向组中的主机指定变量,然则,那一个变量只能够在ansible-playbook中应用,而ansible不协助,例如:

# force:

[apache]

        yes:默许项,借使目的主机包含该公文,但内容见仁见智,则强制覆盖

httpd1.mageedu.com

        no:则只有当目的主机的目的地点不存在该文件时,才复制

httpd2.mageedu.com

 

[nginx]

>>yum 模块(软件包管理)

nginx1.mageedu.com

#name:要开展操作的软件包的名字,也得以传递一个url或者一个地面的rpm包的路径 

nginx2.mageedu.com

#state:目标状态(present,absent,latest)

[webservers:children] 
webservers组内富含apache和nginx八个组,:children表示援引了任何组用来做webservers组的子组

  1. present是指安装套件,而 latest 則是指安装新型的套件,也就是会使用
    yum mirror 上风行的版本。
  2. absent   卸载

apache

 

nginx

例:yum 装httpd

[webservers:vars]

[root@hd01 ~]#ansible webservers -m yum -a “name=httpd state=latest”

ntp_server-ntp_mageedu.com

安装

2.5 Inventory参数

澳门金沙国际 18

ansible基于ssh连接Inventory中指定的远程主机时,还足以经过参数指定其交互格局,这么些参数如下所示:

卸载

> ansible_ssh_host

[root@hd01 ~]#ansible webservers -m yum -a “name=httpd state=absent” 

> ansible_ssh_port

澳门金沙国际 19

> ansible_ssh_user

>>cron 模块(远程主机 crontab 配置)

> ansible_ssh_pass

例: 

> ansible_sudo_pass

[root@hd01 ~]# ansible webservers -m cron -a “name=’check passwd
md5value’ hour=’8′ job=’md5sum /etc/passwd>/tep/p.txt'”

> ansible_connection

职务名字叫check passwd md5value   hour=’8’ 每一天的8时推行职分

> ansible_ssh_pricate_key_file

澳门金沙国际 20

> ansible_shell_type

效果:

> ansible_python_interpreter

[root@hd02 ~]# crontab -l

> ansible\_\*\_interpreter

#Ansible: check passwd md5value

###### Ansible playbooks

* 8 * * * md5sum /etc/passwd>/tep/p.txt

playbooks是一个或三个“play”组成的列表,play的根本意义在于将事先归并为一组的主机装扮成事先经过ansible中的tasks定义好的角色,从根本上来讲,所谓task无非是调用ansible的一个module,将八个play社团在一个playbook中,即可以让他俩随同起来按事先编排的编制同唱一台大戏,上面是一个简易示例:

[root@hd02 ~]#

– hosts:webservers  ##定义inventory,主机组

 

vars:

>>mount 模块(远程主机分区挂载)

http_port:80

例:

max_clients:256

[root@hd01 ~]# ansible webservers -m mount -a ‘name=/test
src=/dev/sdb1 fstype=ext3 opts=ro state=present’ 

remote_user:root ##概念连接到长途主机时,以哪个用户的身价实施

# fstype  指定文件系统类型为ext4  

tasks:

# opts     设定挂载的参数选项音信;-o ro == opts=ro 

– name:install apache is at the latest version ##叙述,可轻易写

# src       要被挂载的目录设备新闻 src=/dev/sdb1

yum:name=httpd state=latest
##使用yum模块,指定选项,安装新型版本的httpd

 

– name: ensure apache is running ##讲述信息

 

service:name=httpd state=started ##使用service模块,指定httpd状态

>>service 模块(远程主机系统服务管理)

handlers: ##处理器

例:

– name:restart apache

                                                 
        #state的4种目的状态

service:name=httpd state=restarted

[root@hd01 ~]# ansible webservers -m service -a “name=httpd
state=started”  #启动httpd

playbook组成结构:

澳门金沙国际 21

Inventory

[root@hd01 ~]# ansible webservers -m service -a “name=httpd
state=stopped” #关闭httpd

Modules

澳门金沙国际 22

Ad Hoc Commands

 

Playbooks

[root@hd01 ~]# ansible webservers -m service -a “name=httpd
state=restarted” #重启httpd

Tasks:义务,即调用模块形成的某操作

 

Variables:变量

[root@hd01 ~]# ansible webservers -m service -a “name=httpd
state=reloaded” #重新加载httpd

Templates:模板

 

Handlers:处理器,在某条件满足时,会由某事件触发执行的操作

>>sysctl 包管理模块

Roles:角色

功能

hosts和remote_user:

远程Linux主机sysctl配置。

playbook中的每一个play的目标都是为了让某个或少数主机以某个指定的用户身份实施职责,hosts即用于指定要履行指定义务的主机,其得以是一个或四个由冒号分隔主机组,remote_user则用于指定远程主机上的履行义务的用户,如以上示例中的

实例

– hosts:webservers

sysctl: name=kernel.panic value=3 sysctl_file=/etc/sysctl.conf
checks=before reload=yessalt ‘*’ pkg.upgrade

remote_user:root

 

不过,remote_user也足以用来各类tasks中(可能每个tasks指定的用户不平等),也得以指定其经过sudo的不二法门在长距离主机上进行操作,其可用以play全局或某义务,别的,甚至足以在sudo时利用sudo_user指定sudo时切换的用户;

>>user 服务模块(远程主机用户管理)

– hosts:webservers

例:

remote_user:mageedu

[root@hd01 ~]# ansible webservers -m user -a “name=wang comment=’user
wang'”

tasks:

澳门金沙国际 23

– name:test connection

[root@hd01 ~]# ansible webservers -m user -a “name=wang state=absent
remove=yes”    #state 目的状态  删除

ping:

澳门金沙国际 24

remote_user:mageedu

达成部分监控成效

sudo:yes 
##以remote_user指定的用户切入进去,然后以那一个用户的身份sudo到root用户去

翻开所有主机在线状态

职务列表和action:

[root@ansible ~]# ansible all -m ping //内建的ping模块
 #all表示/etc/ansible/hosts中所有主机

play的本位部分是task、list、task
list中的各职分按次序逐个在hosts中指定的有所主机上推行,即在拥有主机上形成第二个职务后再实施第一个任务,在运作自上而下某playbook时,假诺中途产生错误,所有已推行职务都可能回滚,由此,在改进playbook后再一次履行四遍即可;

澳门金沙国际 25

task的目标是利用指定的参数执行模块,而在模块参数中可以运用变量,模块执行是幂等的,这代表那往往实施是平安的,因为其结果均一致;

 

种种task都应有有个name,用于playbook的执行结果输出,指出其内容尽可能清晰地讲述义务执行步骤,若是为提供name,则执行action的结果将用于出口;

[root@hd01 ~]# ansible webservers -a “/bin/df -h” #输出挂载音信

定义task的可以选拔”action:module
option”或”module:option”的格式,推荐使用后者以已毕向后万分;

澳门金沙国际 26

tasks:

 

– name:make sure apache is running

[root@hd01 ~]# ansible webservers -a “/sbin/ip addr show dev eth0” 
#翻开webservers组中主机网卡新闻

service:name=httpd state=running

澳门金沙国际 27

在不乏先例模块中,唯有command和shell模块仅须要给定一个列表而无需选拔key:value格式,例如:

 

tasks:

YAML语言

– name:disable selinux

yaml语言是一种基于Unicode简单阅读,不难和脚本语言交互的,用来表述数据体系的编程语言。Ansible与Saltstack环境中布局文件皆以YAML格式存在,YAML文件扩大名一般为.yaml或者.yml

command:/sbin/setenforce 0

首要构成结构:list和directory

倘诺命令或脚本的退出码不为零,可以使用如下格局代替:

以下通过讲述YAML与Python的附和关系,驾驭YAML的层次及结构

tasks:

块连串描述

– name:run this command and ignore the result

块种类就是将讲述的要素连串到python的列表中

shell:/usr/bin/SOME COMMAND||/bin/true

Python:

在推行/usr/bin/下的某条命令时,假诺报错了,然则那不影响大家自家希望或者执行结果时,可以选取/bin/true将退出码强制改为true

import yaml

抑或使用ignore_errors来忽略错误音信:

obj = yaml.load(

tasks:

“””

– name:run this command and ignore the result

– apple

shell:/usr/bin/SOME COMMAND

– banana

ignore_errors:True

– orange

Handlers:处理器

“””

用来当关切的资源爆发变化时拔取一定的操作:

)

“notify”那些action可用来在各类play的尾声被触发,这样可以幸免频仍有变动发生时每一次都推行指定的操作,取而代之, 
 
仅在具备的变化暴发落成后一回性的举行指定操作,在notify中列出的操作成为Handlers,也即notify中调用handlers中定义的操作;

print(obj)

示例:

结果:

– hosts: test  #\\主机组,在/etc/ansible/hosts定义

[‘apple’, ‘banana’, ‘orange’]

remote_user: root # \\远端执行任务的用户

 

tasks: #\\任务

YAML与Python块概念类似,例如:

– name: install httpd  #\\义务描述

command: yum -y install httpd  #\\调用ansible的command模块安装httpd

 – apple

– name: install configuration file for httpd #\\职责描述

 – banana

copy: src=/data/httpd.conf dest=/etc/httpd/conf/httpd.conf 
#\\调用ansible的copy模块复制ansible管理端的文本到被控端

 – orange

notify: #\\概念一个notify,当执行copy那几个模块的授命时实施notify

– restart httpd #\\  notify引用的handlers的名字为restart
httpd(必须跟handlers的名字一样)

 – chuanzhi

handlers:  #\\ 定义一个handlers

 – oldboy

– name: restart httpd  #\\名字为restart httpd

 – mage

service: name=httpd state=restarted 
#\\调用ansible的service模块,重启httpd服务

对应Python结果:

###### playbook的一个简便实例:

[[‘apple’, ‘banana’, ‘orange’],[ ‘chuanzhi’, ‘oldboy’, ‘mage’]]

– hosts: test      #\\主机组,在/etc/ansible/hosts定义

块映射描述:

remote_user: root    # \\远端执行职务的用户

块映射就是将讲述的要素系列到字典的中,格式为”key:
value”,以下为YAML例子:

tasks:        #\\任务

hero:

– name: install httpd      #\\任务描述

  hp: 34

command: yum -y install httpd    #\\调用ansible的command模块安装httpd

  sp: 8

###### 在playbook中行使变量:

  level: 4

– hosts: test      #\\主机组,在/etc/ansible/hosts定义

orc:

remote_user: root    # \\远端执行任务的用户

  hp: 12

vars: ##概念变量package和service

  sp: 0

– package: httpd

  level: 2

– service: httpd

对应python结果为:

tasks:    #\\任务

澳门金沙国际 ,{‘hero’: ‘{‘hp’: 34, ‘sp’: 8, ‘level’: 4}, ‘orc’: {‘hp’: 12, ‘sp’: 0,
‘level’: 2}}

– name: rpm -e httpd

YAML块连串与块映射是足以自由组合在联合的,他们中间可以互相嵌套,通过灵活的结合落成复杂的目的属性。例如:

command: rpm -e httpd

– hero:

– name: install {{ package }}      #\\职务描述 调用变量用{{ }}引用

   hp: 34

command: yum -y install httpd     
#\\调用ansible的command模块安装httpd

   sp: 8

– name: install configuration file for httpd

   level: 4

copy: src=/data/httpd.conf dest=/etc/httpd/conf/httpd.conf

– orc:

notify:

   hp:

– restart httpd

    – 12

handlers:

    – 30

– name: restart httpd

   sp: 0

service: name=httpd state=restarted

   level: 2

###### Ansible使用口径测试

对应Python结果为:

如果急需基于变量、facts或之前义务的施行结果来做为某task执行或者不实施的前提时要求用到标准测试;

[{‘hero’: ‘{‘hp’: 34, ‘sp’: 8, ‘level’: 4}, {‘orc’: {‘hp’: [12,30]
,’sp’: 0, ‘level’: 2}}]

1.when语句

 

在task后添加when子句即可使用规则测试,when语句扶助jinja2表达式语法,例如:

 

tasks:

 

– name: “shutdown debian system”

未完待续。。

command: /sbin/shutdown -h now

when: ansible_os_family == “Debian”

当系统为debian系统时,则关机

– hosts: test

remote_user: root

tasks:

– name: yum httpd

command: yum -y install httpd

when: ansible_fqdn == “wwww”

当test组的某台主机的主机名为wwww时,才给符合条件的主机安装httpd

###### Ansible playbook使用迭代(循环)

当有亟待重复性执行的天职时,可以运用迭代机制,其利用格式为将需要迭代的内容定义为item变量引用,并透过with_item语句来指明迭代的因素列表即可,例如:

– hosts: test

remote_user: root

tasks:

– name: touch file

file: name={{ item }} state=directory 
##循环创造ietm,而item对应的值为with_items中指定的

with_items:  ##列出item索要对应的值

– file1

– file2

事实上,with_items中可以使用要素还可为hashes,例如:

– hosts: test

remote_user: root

tasks:

– name: touch file

user: name={{ item.name}} state=present groups={{ item.groups }} 
##在相继主机成立用户,以及指定用户的基本组

with_items:

– { name: ‘testuser1’, groups: ‘nginx’ }

– { name: ‘testuser2’, groups: ‘apache’ }

###### Ansible中使用Templates

相关文章