ansible

作者: Icarus_ac47 | 来源:发表于2018-09-26 08:32 被阅读0次

Ansible特性:
批量系统配置、批量程序部署、批量运行命令等功能。ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架

    1)、no agents:不需要在被管控主机上安装任何客户端,更新时,只需在操作机上进行一次更新即可
    2)、no server:无服务器端,使用时直接运行命令即可
    3)、modules in any languages:基于模块工作,可使用任意语言开发模块
    4)、yaml,not code:使用yaml语言定制剧本playbook
    5)、ssh by default:基于SSH工作
    6)、strong multi-tier solution:可实现多级指挥

inventory 主机清单

     play books 剧本 根据安排好的顺序去执行,可以把剧本模块化,
叫做角色,每个角色可以完成某个功能。角色是属于play book的一部分。
 connection plugins:连接插件,负责和被监控端实现通信,有SSH,ZEROMQ等,默认使用SSH连接
        host inventory:主机清单,是一个配置文件里面定义监控的主机
    modules : 模块,核心模块、command模块、自定义模块等
        plugins : modules功能的补充,包括连接插件,邮件插件等
        playbook:编排,定义 Ansible 多任务配置文件,非必需
                                             配置主机清单文件:
       主机清单文件
            定义所管理的主机组及主机,可以在主配置文件中指定清单文件位置和名称

            默认位置/etc/ansible/hosts
   主配置文件:

        /etc/ansible/ansible.cfg   

        主要设置一些ansible初始化的信息,比如日志存放路径、模块、插件等配置信息

vim /etc/ansible/hosts 添加被控节点

    web1
    web2
    web3

测试:
语法:
ansible <pattern> -m <module_name> -a <arguments>
pattern--主机清单里定义的主机组名,主机名,IP,别名等,all表示所有的主机,支持通配符,正则
: --多个组,组名之间用冒号隔开
web --组名或主机名中含web的
webservers[0] - webservers组中的第一台主机
以~开头,匹配正则
-m module_name: 模块名称,默认为command
-a arguments: 传递给模块的参数

使用ping模块检查ansible节点的连通性:

        [root@ansible ~]# ansible web1 -m ping
        web1 | SUCCESS => {
            "changed": false, 
            "ping": "pong"
        }
        [root@ansible ~]# ansible web1 -m ping -o
        web1 | SUCCESS => {"changed": false, "ping": "pong"}

        同时指定多台机器:
        [root@ansible ~]# ansible web1,web2,web3 -m ping -o
        web3 | SUCCESS => {"changed": false, "ping": "pong"}
        web2 | SUCCESS => {"changed": false, "ping": "pong"}
        web1 | SUCCESS => {"changed": false, "ping": "pong"}
        
        [root@ansible ~]# ansible web* -m ping -o
        web3 | SUCCESS => {"changed": false, "ping": "pong"}
        web2 | SUCCESS => {"changed": false, "ping": "pong"}
        web1 | SUCCESS => {"changed": false, "ping": "pong"}

执行shell命令: -a 是传给模块的参数

 [root@ansible ~]# ansible web1 -m shell -a 'uptime'
        web1 | SUCCESS | rc=0 >>
         10:59:56 up 2 days, 15:04,  2 users,  load average: 0.00, 0.01, 0.05

        [root@ansible ~]# ansible web1 -m command -a 'uptime'
        web1 | SUCCESS | rc=0 >>
         11:00:03 up 2 days, 15:04,  2 users,  load average: 0.00, 0.01, 0.05

        因为默认模块就是command,所以上面命令可以不加-m:
        [root@ansible ~]# ansible web1 -a 'uptime'
        web1 | SUCCESS | rc=0 >>
         11:01:39 up 2 days, 15:06,  2 users,  load average: 0.00, 0.01, 0.05
[root@ansible ~]# ansible web1 -a 'uptime' -u root -k
        SSH password: 
        web1 | SUCCESS | rc=0 >>
         11:02:56 up 2 days, 15:07,  2 users,  load average: 0.00, 0.01, 0.05

        使用ssh账户和密码:-u和-k
        -u  用户    //指定ssh账户
        -k             //指定使用ssh密码,注意:如果设置了公钥认证,这里写什么密码都可以

给节点增加用户:

        [root@vm20 ~]# ansible 192.168.245.143 -a "useradd tom"
        192.168.245.143 | SUCCESS | rc=0 >>
                
        [root@vm20 ~]# ansible 192.168.245.143 -a "grep tom /etc/passwd"
        192.168.245.143 | SUCCESS | rc=0 >>
        tom:x:1001:1001::/home/tom:/bin/bash

重定向输出到本地文件中:

    [root@vm20 ~]# ansible 192.168.245.143 -a "df -h" > /tmp/a.txt
    [root@vm20 ~]# cat /tmp/a.txt 
    192.168.245.143 | SUCCESS | rc=0 >>
    文件系统                 容量  已用  可用 已用% 挂载点
    /dev/mapper/centos-root   17G  5.5G   12G   33% /
    devtmpfs                 963M     0  963M    0% /dev
    tmpfs                    979M     0  979M    0% /dev/shm
    tmpfs                    979M  9.1M  970M    1% /run
    tmpfs                    979M     0  979M    0% /sys/fs/cgroup
    /dev/sda1               1014M  161M  854M   16% /boot
    tmpfs                    196M   28K  196M    1% /run/user/0

inventory 主机清单 [组建一]

 inventory文件通常用于定义要管理主机及其认证信息,例如ssh登录用户名、密码以及key相关信息。

主机清单文件配置格式

vim /etc/ansible/hosts

web1                  //单独指定主机,可以使用主机名称或IP地址
web2
web3
#-----------------------------------------------------------------
[webservers]        //使用[]标签指定主机组
192.168.10.128
bar.example.com
up.example.com:5309              //指定 SSH 端口 5309
web5  ansible_ssh_host=web2  //设置主机web2的别名为 web5
web1 ansible_ssh_pass='123'  //设置ssh密码,使用-k参数之后提示的密码可以不写,直接回车
www[01:50].example.com         //支持通配符匹配www01,www02,...,www50
db-[a:f].example.com                //通配符匹配db-a,db-b,...,db-f    
#-----------------------------------------------------------------
为每个主机单独指定变量,这些变量随后可以在 playbooks 中使用:内置变量
[atlanta]
host1 http_port=80 maxRequestsPerChild=808
host2 http_port=303 maxRequestsPerChild=909
#------------------------------------------------------------------
为一个组指定变量,组内每个主机都可以使用该变量:
[atlanta]
host1
host2
[atlanta:vars]
ansible_ssh_pass='123'
ntp_server=ntp.atlanta.example.com
proxy=proxy.atlanta.example.com
-----------------------------------------------------------------
组可以包含其他组:
[atlanta]
host1
host2
[raleigh]
host3
host4
[southeast:children]   //southeast包括两个子组
atlanta
raleigh
[southeast:vars]
some_server=foo.southeast.example.com
halon_system_timeout=30

查看组内主机列表:

[root@ansible ~]# ansible webservers --list-hosts
  hosts (3):
    web1
    192.168.245.135
    web3

手动指定其他任意位置的主机清单:-i 指定主机清单

[root@ansible ~]# cat web2.host 
web2

[root@ansible ~]# ansible web2 -a 'uptime' -i web2.host 
web2 | SUCCESS | rc=0 >>
 13:37:24 up 1 day, 19:03,  6 users,  load average: 0.00, 0.01, 0.05

Ansible Inventory 内置参数列表:

111111.png

Ad-Hoc(点对点) 【组件二】

ad hoc 临时的,在ansible中是指需要快速执行,并且不需要保存的命令。
其实就是执行简单的命令——一条命令。对于复杂的命令则为 playbook

列出ansible支持的模块:
ansible-doc命令:
获取模块列表,及模块使用格式;
-l:获取列表
-s module_name:获取指定模块的使用信息

    [root@ansible ~]# ansible-doc -l
    [root@ansible ~]# ansible-doc yum
    [root@ansible ~]# ansible-doc -s yum

执行命令

-m shell

-f 2 指定定要使用的并行进程数,默认为5个,临时指定,如果想要永久指定,修改主配置文件。

[root@ansible ~]# grep forks /etc/ansible/ansible.cfg 
#forks          = 5
[root@ansible ~]# ansible all -m shell -a 'hostname' -o -f 3
                                                                       -o 单行显示

192.168.245.135 | SUCCESS | rc=0 | (stdout) galera4
web1 | SUCCESS | rc=0 | (stdout) web1
web2 | SUCCESS | rc=0 | (stdout) web2
web3 | SUCCESS | rc=0 | (stdout) web3

复制文件
-m copy

# ansible all -m copy -a 'src=/etc/hosts dest=/etc/hosts \
{owner=root group=root mode=644} backup=yes' -o

cp -a 源文件 目标地址  -a 不改变源文件的权限
backup=yes
    被控制节点上如果有文件,则会先备份再拷贝:
    [root@web1 ~]# cat /etc/hosts.25856.2018-02-04@14\:15\:43~ 

用户管理
-m user
添加用户:
-1 是使用的什么加密方式
[root@ansible ~]# echo '123' | openssl passwd -1 -stdin
1hXe3alXf4VGhWAbRGA6tm4NMJznSf1 [root@ansible ~]# ansible web1 -m user -a 'name=liudehua password="1hXe3alXf4VGhWAbRGA6tm4NMJznSf1"' -o

使用变量需要用双引:
[root@ansible ~]# pass=`echo '1' | openssl passwd -1 -stdin`
[root@ansible ~]# ansible web1 -m user -a "name=liudehua password=$pass" -o

使用命令替换需要用双引:
[root@ansible ~]# ansible web1 -m user -a "name=liudehua password=`echo '1234' | openssl passwd -1 -stdin`" -o

删除用户:
[root@ansible ~]# ansible web1 -m user -a "name=liudehua state=absent" -o

软件包管理
-m yum
删除软件:
[root@ansible ~]# ansible web1 -m yum -a 'name=httpd state=removed'
安装软件:
[root@ansible ~]# ansible web1 -m yum -a 'name=httpd state=latest'

服务管理
-m service

[root@ansible ~]# ansible webservers -m service -a 'name=httpd state=started enabled=yes' -f 3 -o

facts 【组件三】

facts 获取被管理机器的基本信息

facts组件是Ansible用于采集被管理主机信息的一个功能,可以使用setup模块查看主机所有的facts信息。

[root@ansible ~]# ansible web1 -m setup 

[root@ansible ~]# ansible web1 -m setup -a 'filter=ansible_all_ipv4_addresses'
web1 | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "192.168.245.133"
        ]
    }, 
    "changed": false
}

将所有主机的信息输入到/tmp/facts目录下:
每台主机的信息输入到主机名文件中(/etc/ansible/hosts里的主机名)

[root@ansible ansible]# ansible all -m setup --tree /tmp/facts 

查看主机内存信息

[root@ansible ansible]# ansible web1 -m setup -a 'filter=ansible_*_mb'
-a  表示给模块传递的参数

查看地接口为eth0-2的网卡信息

[root@ansible ansible]# ansible 10.212.52.252 -m setup -a 'filter=ansible_eth[0-2]'

playbook 【组件四】

Playbook介绍
playbook是由一个或多个”play”组成的列表。play的主要功能在于将事先归为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上来将,所谓的task无法是调用ansible的一个module。将多个paly组织在一个playbook中,即可以让他们联通起来按事先编排的机制同唱一台大戏。

Playbook是Ansible的配置,部署,编排语言
在如右的连接中:

 https://github.com/ansible/ansible-examples

有一些整套的playbooks,它们阐明了上述的这些技巧。

yaml的更多内容及规范参见

www.yaml.org。

核心元素:

Playbooks  
    Variables     #变量元素,可传递给Tasks/Templates使用;  {{}}
    Tasks          #任务元素,由模块定义的操作的列表,即调用模块完成任务;  
    Templates#模板元素,使用了模板语法的文本文件,可根据变量动态生成配置文件;  有源文件目标文件可设变量
    Handlers     #处理器元素,通常指在某事件满足时触发的操作;  
    Roles          #角色元素  把playbooks里的东西模块化

playbook的基础组件:

name:描述信息 每个剧本有很多play,每一个play都有一个name,每一个play都可以完成一个任务,
 play相当于剧本里的剧情,每个tasks也是由name定义

hosts 
playbook中的每一个paly的目的都是为了让某个或某些以某个指定用户的身份执行任务。
hosts用于指定要执行指定任务的主机,其可以是一个或多个由冒号分割主机组。
与命令模式下的ansible匹配规则一样
user 
    remote_user则用于指定远程主机上的执行任务的用户,也可以使用user

tasks 任务列表
    play的主体部分是task list. task list中的各任务按次序逐个在hosts中指定的所有主
机上执行,即在所有主机上完成第一个任务后再开始第二个。
vars  有了这个标记才能定义变量
   定义变量
vars_files
  定义变量文件
notify:如果使用handler必须使用notify
    任务执行结果如果是发生更改了的则触发定义在handler的任务执行
handlers
    用于当前关注的资源发生变化时采取一定指定的操作 
include
    能包含的包括task,handler和playbook
    可以在include的时候传递变量

示例1:简单playbook
一个剧本可以有多个play, 一个play里只能有一个tasks,一个tasks里可以有多个name
文档以---开头,没有也可以

[root@master ~]# cd /etc/ansible/
[root@master ansible]# vim test.yml     //固定后缀为yml
注意:创建文件时系统推荐使用的时file模块
file: path=/etc/foo.conf state=touch mode="u=rw,g=r,o=r"
---         这三个横杠可以写也可以不写   
  - hosts: all                    //特别注意-后面的空格   指定执行本play的主机组
    user: root                    //指定运行本play的远程主机用户
    name:  play             //剧本的名称,可以写也可以不写
    tasks:                         
    - name: playbook_test                      //任务描述
      shell: touch /tmp/playbook.txt       //shell是ansible模块
      file: state=touch path=/tmp/playbook.txt  系统推荐使用
      tags: suibian          //这是一个任务标记,可用来单独执行此任务  可选项
参数解释:
    hosts参数指定了对哪些主机进行操作;
    user参数指定了使用什么用户登录远程主机操作;
    tasks指定了一个任务,其下面的name参数同样是对任务的描述,在执行过程中会打印出来。
    tags:给指定的任务定义一个调用标识,形式如下
        - name: NAME
          module: arguments
          tags: TAG_ID          
语法检测:
    [root@ansible ansible]# ansible-playbook --syntax-check test.yml 
    playbook: test.yml
测试运行 :
    [root@master ansible]ansible-playbook -C /path/to/playbook.yaml 
    可以使用如下参数:
        –list-hosts 
        –list-tasks     
        –list-tags 
        
运行Playbook:
    [root@master ansible]# ansible-playbook test.yml 

    只运行指定标记的任务:-t tags
    [root@ansible ansible]# ansible-playbook  -t 标记名称 test.yml 

    跳过某一个被标记的任务:--skip-tags=SKIP_TAGS 
    [root@ansible ansible]# ansible-playbook  --skip-tags=标记名称 test.yml 

    从某一个任务开始往下运行:--start-at-task 任务名称
    [root@ansible ansible]# ansible-playbook  --start-at-task "start httpd service" test.yml 

示例2.每个playbook可以有多个play

[root@ansible ansible]# cat test.yml 
- hosts: all                               //play1
  remote_user: root
  tasks:
  - name: install a group
    group: name=mygrp system=true
  - name: install a user
    user: name=user1 group=mygrp system=true

- hosts: webservers                  //play2
  remote_user: root
  tasks:
  - name: install httpd package
    yum: name=httpd
  - name: start httpd service
    service: name=httpd state=started

示例3:使用变量

[root@ansible ansible]# cat create_user.yml 
- name: create_user                   //剧本描述信息
  hosts: web1
  user: root
  gather_facts: false    默认会搜集对面机器的信息通过setup 
  vars:
  - user: "msiyuetian"   //自定义变量:user是变量名称, 后面是变量的值 
  tasks:
  - name: create user
    user: name="{{ user }}"

参数解释:
name参数
    对该playbook实现的功能做一个概述,后面执行过程中,会打印 name变量的值 ,可以省略;

gather_facts参数
    指定了在以下任务部分执行前,是否先执行setup模块获取主机相关信息,这在后面的task会使用
    到setup获取的信息时用到;
    默认值为true,改成false之后在执行过程中就看不到以下信息:
    TASK [Gathering Facts] 
    *********************************************************
    ok: [web1]
    ok: [web3]
    ok: [web2]
    ok: [192.168.245.135]

vars参数
    指定了变量,这里指字一个user变量,其值为test ,需要注意的是,变量值一定要用引号引住;

user
    指定了调用user模块,name是user模块里的一个参数,而增加的用户名字调用了上面user变量的值。

运行playbook:
[root@master ansible]# ansible-playbook create_user.yml

示例4:条件执行

[root@master ansible]# vim when.yml
- hosts: web1
  user: root
  gather_facts: True
  tasks:
    - name: use when
      shell: touch /tmp/when.txt
      when: ansible_hostname == "web1"  这个地方只解析主机名
[root@ansible ansible]# cat when.yml 
- hosts: web1
  user: root
  gather_facts: True
  tasks:
  - name: use when
    shell: touch /tmp/when.txt
    when: ansible_all_ipv4_addresses[0] == "192.168.245.133"  当他成功才去执行其他的任务

只有当参数ansible_all_ipv4_addresses[0]为 192.168.245.133 时才在该机器上新建指定文件;
意思就是只对 testhost 组中特定的主机进行操作,忽略组内其他的主机。我们可以通过setup模块查看各个参数的值

setup模块变量获取:
上面的变量:ansible_hostname和ansible_all_ipv4_addresses[0] 是从setup模块中获取
注意看是:
    "ansible_hostname": "web1"
    还是:
    "ansible_all_ipv4_addresses": [
            "192.168.245.133"
        ]
     如果变量值是用[]括起来的需要用[0]方式切片获取
     
[root@master ansible]# ansible-playbook when.yml

示例5:

handlers:由特定条件触发的Tasks
调用及定义方式:
tasks:  她成功了通知notify 去执行他的模块
- name: TASK_NAME
  module: arguments
  notify: HANDLER_NAME
handlers:
- name: HANDLER_NAME
  module: arguments
  
handlers示例1
[root@ansible ansible]# cat handlers.yml 
- name: handlers test
  hosts: web1
  user: root
  tasks:
  - name: test copy
    copy: src=/etc/passwd dest=/tmp/handlers.txt
    notify: test handlers
  handlers:
  - name: test handlers
    shell: echo "www.qianfeng.com" >> /tmp/handlers.txt

说明:只有 copy 模块真正执行后,才会去调用下面的 handlers 相关的操作,追加内容。
所以这种比较适合配置文件发生更改后,需要重启服务的操作。
[root@master ansible]# ansible-playbook handlers.yml

handlers示例2:
- hosts: websrvs
  remote_user: root
  tasks:
  - name: install httpd package
    yum: name=httpd state=latest
  - name: install conf file
    copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf
    notify: restart httpd service
  - name: start httpd service
    service: name=httpd state=started
handlers:
  - name: restart httpd service
  service: name=httpd state=restarted

示例6:include参数

- name: create_user
  hosts: web1
  user: root
  gather_facts: false
  vars:
  - user: "msiyuetian"
  tasks:
  - name: create user
    user: name="{{ user }}"
- include: handlers.yml         //已经用下面的import_playbook代替
- import_playbook: handlers.yml

示例7:pause暂停

在playbook执行的过程中暂停一定时间或者提示用户进行某些操作
常用参数:
minutes:暂停多少分钟
seconds:暂停多少秒
prompt:打印一串信息提示用户操作
 
[root@ansible ansible]# cat wait.yml
---
- name: wait
  hosts: web1
  tasks:
  - name: wait on user input
    pause: prompt="Warning! Detected slight issue. ENTER to continue CTRL-C a to quit" 
  - name: timed wait
    pause: seconds=30

role 角色 【组件五】

roles类似于saltstack的state,state有一定的组织结构。
而roles则是在ansible中,playbooks的目录组织结构。
而模块化之后,成为roles的组织结构,易读,代码可重用,层次清晰。
每一个角色是有名字的  他是一个目录 ,  可以包含子目录
以特定的层级目录结构进行组织的tasks、variables、handlers、templates、files等; 
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: HOSTS
  remote_user: USERNAME
  roles:
  - ROLE1
  - ROLE2
  - { role: ROLE3, VARIABLE: VALUE, ...}
  - { role: ROLE4, when: CONDITION }

role目录结构: 这里的nginx是一个角色的名字,角色里用到文件放在files中,通过创建playbook来调用这些角色。

11111.png 111.png

tasks: item 相当与一个for循环中的 i

for item in epel-release nginx  
for item in ["epel-release","nginx"]:
 yum: name=item state=latest  
111.png

handlers:


111.png

vars:


111.png

jinja template:


111.png

ansible-playbook


111.png

问题1:

如果ssh的known_hosts文件被删除,远程登陆的时候会出现提示yes/no,ansible不能自动处理则报错如下:
[root@ansible ~]# ansible web2 -a 'uptime'
web2 | FAILED | rc=-1 >>
Using a SSH password instead of a key is not possible because Host Key 
checking is enabled and sshpass does not support this.  Please add this host's
fingerprint to your known_hosts file to manage this host.

解决:扫描远程主机信息添加到known_hosts文件
[root@ansible ~]# ssh-keyscan  web2 >> /root/.ssh/known_hosts 

常用模块

  1. setup: 查看远程主机的基本信息
  2. ping: 测试远程主机的运行状态
  3. file: 设置文件属性
    相关选项如下:
    force:需要在两种情况下强制创建软链接,一种是源文件不存在,但之后会建立
的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no
    group:定义文件/目录的属组
    mode:定义文件/目录的权限
    owner:定义文件/目录的属主
    path:必选项,定义文件/目录的路径
    recurse:递归设置文件的属性,只对目录有效,有两个选项:yes|no
    src:被链接的源文件路径,只应用于state=link的情况
    dest:被链接到的路径,只应用于state=link的情况
    state:
           directory:如果目录不存在,就创建目录
           file:即使文件不存在,也不会被创建
           link:创建软链接
           hard:创建硬链接
           touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
           absent:删除目录、文件或者取消链接文件
    
   使用示例:
        ansible test -m file -a "src=/etc/fstab dest=/tmp/fstab state=link"
        ansible test -m file -a "path=/tmp/fstab state=absent"
        ansible test -m file -a "path=/tmp/test state=touch"
  1. copy: 把主控端的文件复制到远程主机
    相关选项如下:
    backup:在覆盖之前,将源文件备份,备份文件包含时间信息。有两个选项:yes|no
    content:用于替代“src”,可以直接设定指定文件的值
    dest:必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目
录,那么该路径也必须是个目录
    directory_mode:递归设定目录的权限,默认为系统默认权限
    force:如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,
如果为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes

    others:所有的file模块里的选项都可以在这里使用
    src:被复制到远程主机的本地文件,可以是绝对路径,也可以是相对路径。如果
路径是一个目录,它将递归复制。在这种情况下,如果路径使用“/”来结尾,则只复
制目录里的内容,如果没有使用“/”来结尾,则包含目录在内的整个内容全部复制,
类似于rsync
   示例如下:
ansible test -m copy -a "src=/srv/myfiles/foo.conf dest=/etc/foo.conf owner=foo\
 group=foo mode=0644"

ansible test -m copy -a "src=/mine/ntp.conf dest=/etc/ntp.conf owner=root \
group=root mode=644 backup=yes"

5.service模块:用于管理服务
该模块包含如下选项:

arguments:给命令行提供一些选项 
enabled:是否开机启动 yes|no
name:必选项,服务名称 
pattern:定义一个模式,如果通过status指令来查看服务的状态时,没有响应,就
会通过ps指令在进程中根据该模式进行查找,如果匹配到,则认为该服务依然在运行
runlevel:运行级别
sleep:如果执行了restarted,在则stop和start之间沉睡几秒钟
state:对当前服务执行启动,停止、重启、重新加载等操作(started,stopped,restarted,reloaded)

使用示例:
    ansible test -m service -a "name=httpd state=started enabled=yes"
    asnible test -m service -a "name=foo pattern=/usr/bin/foo state=started"
    ansible test -m service -a "name=network state=restarted args=eth0" 

6.cron模块:用于管理计划任务
包含如下选项:

backup:对远程主机上的原任务计划内容修改之前做备份 
cron_file:如果指定该选项,则用该文件替换远程主机上的cron.d目录下的用户的任务计划 
day:日(1-31,*,*/2,……) 
hour:小时(0-23,*,*/2,……)  
minute:分钟(0-59,*,*/2,……) 
month:月(1-12,*,*/2,……) 
weekday:周(0-7,*,……)
job:要执行的任务,依赖于state=present 
name:该任务的描述 
special_time:指定什么时候执行,参数:reboot,yearly,annually,monthly,weekly,daily,hourly 
state:确认该任务计划是创建还是删除 
user:以哪个用户的身份执行

示例:
    ansible test -m cron -a 'name="a job for reboot" special_time=reboot job="/some/job.sh"'
    ansible test -m cron -a 'name="yum autoupdate" weekday="2" minute=0 hour=12 user="root
    ansible test -m cron  -a 'backup="True" name="test" minute="0" hour="5,2" 
job="ls -alh > /dev/null"'

    ansilbe test -m cron -a 'cron_file=ansible_yum-autoupdate state=absent'

7.yum模块:使用yum包管理器来管理软件包
其选项有:

config_file:yum的配置文件 
disable_gpg_check:关闭gpg_check 
disablerepo:不启用某个源 
enablerepo:启用某个源
name:要进行操作的软件包的名字,也可以传递一个url或者一个本地的rpm包的路径 
state:状态(present,absent,latest)

示例如下:
    ansible test -m yum -a 'name=httpd state=latest'
    ansible test -m yum -a 'name="@Development tools" state=present'
    ansible test -m yum -a 
'name=http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-
0.el6.ngx.noarch.rpm state=present'

8.user模块与group模块
user模块是请求的是useradd, userdel, usermod三个指令,goup模块请求的是groupadd, groupdel, groupmod 三个指令。

1、user模块
home:指定用户的家目录,需要与createhome配合使用
groups:指定用户的属组
uid:指定用的uid
password:指定用户的密码
name:指定用户名
createhome:是否创建家目录 yes|no
system:是否为系统用户
remove:当state=absent时,remove=yes则表示连同家目录一起删除,等价于userdel -r
state:是创建还是删除
shell:指定用户的shell环境

使用示例:
    user: name=johnd comment="John Doe" uid=1040 group=admin
    user: name=james shell=/bin/bash groups=admins,developers append=yes 
user: name=johnd state=absent remove=yes
    user: name=james18 shell=/bin/zsh groups=developers expires=1422403387
    user: name=test generate_ssh_key=yes ssh_key_bits=2048 ssh_key_file=.ssh/id_rsa   
 #生成密钥时,只会生成公钥文件和私钥文件,和直接使用ssh-keygen指令效果相
同,不会生成authorized_keys文件。注:指定password参
数时,不能使用明文密码,因为后面这一串密码会被直接传送到被管理主机
的/etc/shadow文件中,所以需要先将密码字符串进行加密处理。然后将得到的字符
串放到password中即可。
echo "123456" | openssl passwd -1 -salt $(< /dev/urandom tr -dc '[:alnum:]' | head -c 32) -stdin
$1$4P4PlFuE$ur9ObJiT5iHNrb9QnjaIB0
#使用上面的密码创建用户
ansible all -m user -a 'name=foo password="$1$4P4PlFuE$ur9ObJiT5iHNrb9QnjaIB0"'
不同的发行版默认使用的加密方式可能会有区别,具体可以查看/etc/login.defs文件
确认,centos 6.5版本使用的是SHA512加密算法。

2、group示例
ansible all -m group -a 'name=somegroup state=present'
  1. shell: shell命令
    ansible默认使用的模块是command,支持多数shell命令,但不支持shell变量及管道,如果要使用,用shell模块

·

批量安装Nginx

1.首先创建roles目录, 一个ansible组件模块
2.在roles目录下创建nginx目录,一个角色;创建一个site.yml的文件
3.然后在角色目录下创建tasks,templates,files,vars,handerls
tasks里面创建main.yml
templates里面存放变量模块文件,(需要使用变量的文件)
vars里面创建main.yml,存放变量文件,(自定义变量)
handlers里创建main.yml文件,存放特定的执行文件
files里面存放需要copy的文件
4.根据以上文件的需求完成上面的要求
vim roles/site.yml
---
 - host: all
   roles:
   - nginx

vim tasks/main.yml
---
 - name: install nginx
   yum: name={{ item }} state=latest
   with_items:
   - epel-release
   - nginx
   
 - name: copy nginx.conf template
   template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
   notify: restart nginx
   
 - name: copy index.html
   copy: src=index.html dest=/usr/share/nginx/html/index.html

 - name: make sure nginx service running
   service: name=nginx state=started

vim templates/nginx.conf.j2  从安装好的nginx中的/etc/nginx/nginx.conf.default
#cpu的个数,需要调用setup.ansible -vm -m setup | grep processes
worker_processes {{ ansible_processor_cores }};

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

#自定义变量
events {
    worker_connections  {{ work_conn }};
}


http {
    include       mime.types;
    default_type  application/octet-stream;

vim vars/main.yml

work_conn: 10000
 
vim handlers/main.yml

- name: restart nginx
  service: name=nginx state=restarted

相关文章

  • 【Ansible学习】- Ansible初探

    安装 Ansible基础 Ansible架构图 Ansible核心组件说明 Ansible:Ansible的核心程...

  • 快速上手 Ansible

    Ansible 系列:(一):快速上手 Ansible(二):Ansible 命令(三):Ansible 主机清单...

  • Ansible 命令

    Ansible 系列:(一):快速上手 Ansible(二):Ansible 命令(三):Ansible 主机清单...

  • Ansible 主机清单配置文件

    Ansible 系列:(一):快速上手 Ansible(二):Ansible 命令(三):Ansible 主机清单...

  • Ansible Playbook 剧本语法

    Ansible 系列:(一):快速上手 Ansible(二):Ansible 命令(三):Ansible 主机清单...

  • Ansible(一)、实现SSH免密

    1.ansible安装 2.ansible配置 /etc/ansible/ansible.cfg /etc/ans...

  • Ansible第一篇:基础

    一、配置文件 ansible.cfg /etc/ansible/ansible.cfg 是ansible安装好后...

  • 自动化运维-ansible

    目录 十五、ansible介绍十六、ansible安装十七、ansible远程执行命令十八、ansible拷贝文件...

  • 04-invertory

    Ansible Ansible version : 2.6.2 inventory Ansible可以同时处理基础...

  • Ansible部署

    安装ansibleyum install ansible 确认ansible版本ansible --version...

网友评论

      本文标题:ansible

      本文链接:https://www.haomeiwen.com/subject/gmyloftx.html