ansible

 
 

1章 自动化运维工具ansible

1.1 保留yum安装的软件

sed -i.org 's#keepcache=0#keepcache=1#g' /etc/yum.conf

1.2 管理端m01安装

yum install epel-release  -y

yum install ansible -y

1.3 客户端安装

yum install libselinux-python -y

1.4 编辑/etc/ansible/hosts

[root@m01 scripts]# tail -6 /etc/ansible/hosts
[oldboy]
172.16.1.5

172.16.1.6

172.16.1.7

172.16.1.8

172.16.1.31

172.16.1.41

172.16.1.51

172.16.1.61

 

1.5 利用ansible远程批量执行命令

语法

ansible oldboy -m command -a 'uptime'

oldboy为主机组的名字

-m后边是模块的名字

-m NAME, --module-name=NAME

           Execute the module called NAME

-a后面是模块的名字,也可以是一个ip,针对一台机器来执行命令

-a 'ARGUMENTS', --args='ARGUMENTS'

           The ARGUMENTS to pass to the module.

远程执行命令

ansible oldboy -m command -a 'uptime'

 

ansible oldboy -m command -a ' sed -i.org 's#keepcache=0#keepcache=1#g' /etc/yum.conf '

 

拷贝文件

[root@m01 scripts]# cat yum.sh 
 yum install ipvsadm -y

 

ansible oldboy -m copy -a "src=/server/scripts/yum.sh dest=/server/scripts/ owner=oldboy group=oldboy mode=0755"

 

远程执行脚本

ansible oldboy -m shell -a "/server/scripts/yum.sh"

ansible的模块内容
ansible-doc -l 
详细查看copy模块的信息

ansible-doc -s copy  

1.6 模块的介绍

1.7 批量安装服务的方法

1)运用命令模块

ansible oldboy -m yum -a "name=keepalived state=installed"

2)运用yum模块

ansible oldboy -m command -a 'yum install httpd -y'

第2章 ansible

Ansible的核心组件

Ansible core

Host inventory

Core modules

Custom modules

Playbook(yaml,jinjia2)

Connect plugin

Ansible 的特性

基于python语言实现,由Paramiko,pyyaml和jinjia2 三个关键模块

 

常见模块

Command:命令模块,默认模块,用于远程执行命令;区别于shell 、raw模块就是在命令中不支持管道|符号

ansible all –a ‘date’

cron: 定时任务模块

state:

      present: 安装

      absent: 卸载

ansible websrvs -m cron -a 'minute="*/10" job="/bin/echo hello" name="test cron job"' 默认state=present

ansible websrvs -m cron -a 'minute="*/10" job="/bin/echo hello" name="test cron job" state=absent '

user:指明创建用户名字

ansible websrvs -m user -a 'name=mysql uid=306 system=yes'

group:

ansible websrvs -m group -a 'name=mysql gid=306 system=yes'

copy:复制模块

src 原文件的路径 可以是相对路径也可以是绝对路径 拷贝目录时结尾加/ 表示只拷贝里边的内容

不加/ 表示连同目录一块拷贝

dest 目标文件的路径

content 取代src 表示直接以此处指定的信息生成为目标的文件内容

ansible lbsrvs -m copy -a 'src=/etc/fstab dest=/tmp/fstab.ansible owner=root mode=600'

ansible lbsrvs -m copy -a 'content="hello ansible megeedu " dest=/tmp/test.txt'

[root@lb01 ~]# cat /tmp/test.txt

hello ansible

 megeedu  

file:设定文件属性

path=: 指定文件路径,可以使用name或dest来替换

创建文件的符号链接:

src=:指明源文件

path=:指明符号链接文件的路径

ansible lbsrvs -m file -a "src=/etc/fstab dest=/tmp/fstab state=link"

service:指定运行状态

enabled=:是否开机自启动,取值为true或者false  yes or no

name=:服务名称

state=:状态,取值有started,stopped,restarted;

shell:在远程主机上运行命令

尤其是利用管道运行负载的命令

 

Script:将本地脚本复制到远程主机并运行之:注意:要使用相对路径指定脚本

yum:安装程序包

name=:指明要安装的程序包,可以带上版本号

state=: present,latest,表示安装,absent表示卸载:

setup:收集远程主机的facts

每个被管理节点在接收并行管理命令之前,会将自己主机相关信息,如操作系统版本,ip地址等报告给远程的ansible主机

[root@m01 ansible_test]# cat apache.yml

- hosts: websrvs

  remote_user: root

  tasks:

  - name: install httpd package

    yum: name=httpd state=latest

  - name: install configuration file for httpd

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

  - name: start httpd service

service: enabled=true name=httpd state=started

=====================》

[root@m01 ansible_test]# cat apache.yml

- hosts: websrvs

  remote_user: root

  vars:

  - package: httpd

  - service: httpd

  tasks:

  - name: install httpd package

    yum: name={{ package }} state=latest

  - name: install configuration file for httpd

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

    notify:

    - restart httpd

 

  - name: start httpd service

    service: enabled=true name=httpd state=started

  handlers:

  - name: restart httpd

    service: name=httpd state=restarted

2.1.1 主机变量

[websrvs]

#10.0.0.7 testvar='100.7' ansible_ssh_user=root ansible_ssh_pass=123456

#10.0.0.8 testvar='100.8'

2.2 引用变量

[root@m01 ansible_test]# cat test.yml

- hosts: websrvs

  remote_user: root

  tasks:

  - name: copy file

    copy: content='{{ansible_all_ipv4_addresses}},{{testvar}}' dest=/tmp/vars.ansible

可以在playbook中定义 可以在/etc/ansible/hosts 中定义的   ansible facts 中的变量 都可以直接引用

2.3 when条件测试

[root@m01 ansible_test]# cat cond.yml

- hosts: websrvs:lbsrvs

  remote_user: root

  vars:

  - username: user10

  tasks:

  - name: create {{username}} user

    user: name={{username}}

    when: ansible_fqdn == 'lb01'

2.4 迭代

当有需要重复行执行的任务时,可以使用迭代机制,其使用格式为将需要迭代的内容定义为item变量引用,并通过with_items语句来指明迭代的元素列表即可

[root@m01 ~]# cat add_user.yml

- hosts: websrvs

  remote_user: root

  tasks:

    - name: add several users

      user: name={{ item }} state=present groups=wheel

      with_items:

        - testuser1

        - testuser2

#上面的语句等同于下面的语句

#    - name: add testuser1

#      user: name=testuser1 state=present groups=wheel

#    - name: add testuser2

#      user: name=testuser2 state=present groups=wheel

#事实上 with_items 可以使用的元素还可以为hashes 例如

#    - name: add several users

#      user: name={{item.name}} state=present groups={{item.groups}}

#      with_items:

#        - {name: 'testuser1',groups: 'wheel'}

#        - {name: 'testuser2',groups: 'root'}

迭代:重复同类task时使用

  调用:item

定义循环列表:

 

[root@m01 ~]# cat main.yml

- hosts: websrvs

  remote_user: root

  tasks:

    - name: install lamp package

      yum: name={{ item.name }} state=latest

      template: src={{ item.conf }} dest={{item.dest_conf}}

      with_items:

       - {name: httpd,conf: conffiles/httpd.conf,dest_conf: /etc/httpd/conf/httpd.conf}

       - {name: php,conf: conffiles/pfp.ini,dest_conf: /etc/php.ini}

       - {name: mysql-server,conf: conffiles/my.cnf,dest_conf: /etc/my.cnf}

2.5 Template

模板文件 通过一个配置文件含有jinjia2的变量  当复制到各个节点是模板里的变量 会替换为主机清单/etc/ansible/hosts 里面的变量定义的值

[root@m01 ansible_test]# cat apache.yml

- hosts: websrvs

  remote_user: root

  vars:

  - package: httpd

  - service: httpd

  tasks:

  - name: install httpd package

    yum: name={{ package }} state=latest

  - name: install configuration file for httpd

    template: src=/root/template/conf/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf

    notify:

    - restart httpd

 

  - name: start httpd service

    service: enabled=true name={{ service }} state=started

  handlers:

  - name: restart httpd

    service: name=httpd state=restarted

2.6 Tags 定义标签

Tags:在playbook可以为某个或者某些任务定义一个标签,在执行此playbook时,通过为ansib-playbook命令使用—tags选项能实现运行指定的tasks而非所有的

- name: install configuration file for httpd

    template: src=/root/template/conf/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf

    tags:

- conf

特殊tags:always

ansible-playbook apache.yml --tags='conf'

2.7 Roles

tags

tags用于让用户选择 跳过playbook中的部分代码,ansible具有哦幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长,此时,如果确信其没有变化,就可以通过tags跳过此些代码片段

创建roles的步骤

1,创建以roles命名的目录:,

2,在roles目录中分别创建以各角色名称命名的目录,如webservers等:

3,在每个角色命名的目录中分别创建files、handler、meta、tasks、template、vars目录:用不到的可以创建为空目录,也可以不创建,

4,在playbook文件中,调用各角色

Roles:

1》目录名同角色名

2》Roles内个目录中可用的文件

1>   Tasks目录:至少应该包含一个名为main.yml的文件,其定义了此角色的任务列表:此文件可以使用include包含其他的位于此目录中的task文件

2>   files目录:存放由copy或script等模块调用的文件:

3>   Templates目录:template 模块会自动在此目录中寻找jinjia2模板文件

4>   Handlers目录:此目录应当包含一个main

5>   Yml文件,用于定义此角色用到的个handler:在handler中使用include包含的其他的handler文件也应该位于此目录中

6>   vars 目录:应当包含一个main.yml文件,用于定义此角色用到的变量

7>   meta 目录:应当包含一个main.yml文件,用于定义此角色的特殊设定及其依赖关系:ansible 1.3及其以后的版本才支持:

8>   default目录:为当前角色设定默认变量时使用目录:应当包含一个main.yml文件

3》site.yml 中定义playbook,额外也可以有其他的yml文件

[root@m01 ~]# tree ansible_playbooks

ansible_playbooks

├── roles

│   ├── dbsrvs

│   │   ├── files

│   │   │   └── my.cnf

│   │   ├── handlers

│   │   │   └── main.yml

│   │   ├── meta

│   │   ├── tasks

│   │   │   └── main.yml

│   │   ├── templates

│   │   └── vars

│   └── websrvs

│       ├── files

│       │   └── httpd.conf

│       ├── handlers

│       │   └── main.yml

│       ├── meta

│       ├── tasks

│       │   └── main.yml

│       ├── templates

│       └── vars

└── sites.yml

                                                    

原文地址:https://www.cnblogs.com/lieying6011/p/7249213.html