目录

  • ansible 介绍
  • ansible 安装
  • ansible 配置
  • ansible 如何使用密码和key的方式连接管理机
  • ansible ad-hoc模式及使用
  • ansible playbook模式及使用方法
  • playbook 模式使用示例

1 ansible介绍

  ansible是python中的一套完整的自动化执行任务模块

  ansible 的paly_books模式,采用yaml配置,对自动化任务执行更清晰

2 安装ansible

ansible的安装方式:

注:基于linux环境,已安装好python3.6.8,pip 21.2.4

  1. python ./setup.py install

  2. easy_install ansible

  3. pip install ansible

3 ansible配置

3.1 ansible.cfg配置文件

点击查看详情

[defaults]
inventory = /etc/ansible/hosts   #设置hosts文件所在目录
timeout = 10                     #SSH连接超时时间,默认10s
host_key_checking = False        #ansible第一次连接客户端是是否要检查ssh密钥
forks = 5                        #ansible执行并发数,默认5
remote_port = 22                 #ansible管理的机器连接端口号
default_sudo_user = root         #ansible管理的机器访问账号
log_path = /var/log/ansible.log  #设置ansible执行存放日志路径
private_key_file=/root/.ssh/id_rsa  #设置ansible私钥存放的路径


3.2 hosts配置文件

[test_group1]
172.16.100.146:22 ansible_ssh_user=root ansible_ssh_pass="Reconova_123456"
[test_group2]
#test1 ansible_ssh_host=172.16.100.144 ansible_ssh_port=22 ansible_ssh_user=root  ansible_ssh_private_key_file=/root/.ssh/id_rsa
test1 ansible_ssh_host=172.16.100.144 ansible_ssh_port=22 ansible_ssh_user=root
[test_group2:vars]
touch_file=0914

1 配置方式:password、key

2 简单查看方式:
  ansible all --list-hosts 【查看所有配置主机信息】
  ansible test1 --list-hosts 【查看别名为test1的配置主机信息】
  ansible test_group1 --list-hosts 【查看test_group1组下的配置主机信息】

3 区别主机别名方式和IP的配置方式

4. ansible如何使用密码和key的方式连接管理机

说明:ansible安装机器为控制机、另外两台为管理机器。

   例如ansible安装在172.16.100.141服务器上,管理机器为172.16.100.144和172.16.100.146

4.1 密码方式

步骤一:设置ansible.cfg、hosts文件

在/etc/ansible 文件夹中新增ansible.cfg、hosts文件【若无ansible文件夹,手动创建即可】

步骤二:ansible.cfg设置如下

点击查看详情

[defaults]
inventory = /etc/ansible/hosts
timeout = 10   #SSH连接超时时间,默认10s


步骤三:hosts设置如下

点击查看详情

[test_group1] #测试组名称可以随意命名
  172.16.100.146:22 ansible_ssh_user=root ansible_ssh_pass="Reconova_123456"


步骤四:可以用ansible all -a 'ls /tmp' 查看管理机是否返回命令执行结果

4.2 key方式

4.2.1 配置ansible所在机器通过key登录管理机器

点击展开查看详细操作步骤

在ansible安装机器上执行ssh-keygen生成公钥和私钥,再进行如下操作

[root@entrance1 ansible]# cd /root/.ssh/
[root@entrance1 .ssh]# ssh-copy-id -i id_rsa.pub root@172.16.100.144

上述操作完成后,在144服务器的/root/.ssh目录下新增了文件authorized_keys,此文件中存储的为ansible所在机器 id_rsa.pub的内容

以上操作完成后,即可执行 ansible all -a 'ls /root'命令,校验采用key的方式是否连上了管理机器,如下图所示未报错即正常连上管理机

Python ansible windows安装 python调用ansible执行playbook_python

4.2.2 ansible使用key方式操作管理机机器的设置方式

前两个步骤与密码方式一致


步骤三:hosts设置如下
说明:其中test1为管理机的别名,可以随意命名。

[test_group2]
test1 ansible_ssh_host=172.16.100.144 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_private_key_file=/root/.ssh/id_rsa


注:在ansible.cfg文件中有private_key_file=/root/.ssh/id_rsa这一行时,此处即可去掉私钥路径描述。

5 ad-hoc模式及使用

ad-hoc可以解决一些简单的任务,playbook可以解决一些复杂的任务。

ad-hoc 命令和 ansible playbook 的关系类似于在命令行敲入shell命令和 写shell scripts两者之间的关系

执行shell命令:
ansible test1 -m shell -a 'touch /home/0929.txt' -i hosts

拷贝文件命令:
ansible 172.16.100.146 -m raw -a 'src=/etc/ansible/Hmaster-stop.sh dest=/home/linshi'

6 ansible playbook模式及编写方式

6.1 playbook的yml文件编写

注意:playbook的yml文件编写填写hosts时若ansible的hosts文件中将ip地址写了别名,yml文件中的hosts也填写ip的别名

   playbook的编写为yml文件,在编写yml时一定要注意yml的格式,如下一yml文件示例

---
- hosts: 172.16.100.146
  remote_user: root
  vars:
    touch_file: aa.txt
    tasks:
      - name: touch file
        shell: "touch /etc/ansible/{{touch_file}}"

yaml语法:

1)使用---表示一个文档的开始,
2)填写hosts时需前面增加-空格再接hosts字符
3)单引号与引号后所接的文字之间需要增加空格后再接字符,例如remote_user: root
4)同一个列表中的元素应该保持相同的缩进
5)下一层级与上一层级应缩进两个空格
8)缩进只能使用空格

通过yaml转化成json,可以更清晰的了解yaml的数据结构

在编辑完playbook后,可以先检查一下yml语法格式是否正确,再进行执行操作。


ansible-playbook test.yml --syntax-check #检查yaml文件的语法是否正确

6.2 playbook执行方式

查看playbook任务是否能正常可用,同时也校验了fi.yml文件写的是否正确

执行playbook命令:ansible-playbook -i /etc/ansible/hosts ./fi.yml

6.3 palybook里的变量

1)playbook的yaml文件中定义变量赋值,采用fi.yml演示


2)--extra-vars执行参数赋给变量,采用fi_1.yml演示

  注:命令中赋值[将yml中变量注释]

  ansible-playbook -i /etc/ansible/hosts ./fi.yml --extra-vars "touch_file=123"


3)在文件中定义变量【资产配置】,fi_1.yml演示

  在hosts中进行设置,如下

[test_group1]
172.16.100.146:22 ansible_ssh_user=root ansible_ssh_pass="Reconova_123456"
[test_group2]
#test1 ansible_ssh_host=172.16.100.144 ansible_ssh_port=22 ansible_ssh_user=root  ansible_ssh_private_key_file=/root/.ssh/id_rsa
test1 ansible_ssh_host=172.16.100.144 ansible_ssh_port=22 ansible_ssh_user=root
[test_group2:vars]
touch_file=0914


4)注册变量,采用f_re.yml文件演示
  absible的模块在运行之后,其实都会返回一些”返回值“,只是默认情况下,这些”返回值“并不会显示而已,
  我们可以把这些返回值写入到某个变量中,这样我们就能通过引用对应的变量从而获取到这些返回值,
  这种将模块值写入到变量中的方法被称为“注册变量”

7 playbook模式使用示例

7.1 创建用户

创建用户的yml文件

点击查看代码

---
- hosts: test1
  remote_user: root
  #vars:
    #touch_file: aa.txt
  tasks:
    - name: add several users
      user: name={{ item.name }} state=present groups={{ item.groups }}
      with_items:
          - { name: 'testuser1', groups: 'wheel'}【与上一级是四个空格】
          - { name: 'testuser2', groups: 'root'}

查看有哪些用户命令:cat /etc/passwd |cut -f 1 -d :

7.2 文件拷贝

点击查看代码

---
  - hosts: 172.16.100.146
    gather_facts: false
    remote_user: root
    tasks:
      - name: copy file
        copy:
          src: "{{ item.src }}"
          dest: "{{ item.dest }}"
          owner: reconova
          group: reconova
          mode: 0755
        with_items:
          - { src: "/etc/ansible/Hmaster-stop.sh", dest: "/home" }

7.3 条件语句

点击查看代码

---
  - hosts: 172.16.100.146
    #gather_facts: false
    remote_user: root
    tasks:
      - name: "校验是否包含Hmaster进程"
        shell: jps -ml |grep HMaster
        register: result
        failed_when: false
      #- debug:  msg={{ result.stdout }}
      - name: "停用Hmaster组件"
        remote_user: reconova
        shell: jps -ml|grep HMaster | grep -v grep | awk '{print $1}' | xargs kill -9
        when: "'start' in result.stdout"
      - name: "启用Hmaster组件"
        remote_user: reconova
        shell: sh /home/h.sh
        register: result2
      - debug: 
          var: result2

7.4 监控服务器资源

点击查看代码

---
- hosts: test1
  remote_user: root
  gather_facts: no
  tasks:
    - name: "Statistics CPU Memory Disk Utilization..."
      shell: |
        free -m | awk 'NR==2{printf "Memory Usage: %s/%sMB (%.2f%%)\n", $3,$2,$3*100/$2 }'
        top -bn1 | grep Cpu |awk '{printf "Cpu usage: (%.2f%%)\n",100-$8}'
      register: out
    - debug: var=out.stdout_lines