Bootstrap

安装和使用ansible

一、安装

环境

[root@bogon ~]# cat /etc/kylin-release
Kylin Linux Advanced Server release V10 (Sword)

1、yum安装

yum install -y ansible

麒麟系统自身的yum仓库就有ansible,如果是centos,需要执行yum install -y yum-utils epel-release

注意:本人在2024-3-28安装ansible时报错,一直找不到ansible,建议采用国内的epel
我使用阿里

wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo

2、离线安装

2.1、下载软件包上传到离线的服务器

mkdir -p /app/local/ansible 
yum install -y --downloadonly --downloaddir=/app/local/ansible ansible

2.2、安装

[root@bogon ~]# cd /app/local/ansible/
[root@bogon ansible]# ll
总用量 15952
-rw-r--r-- 1 root root 15321140  227 10:35 ansible-2.8.8-1.p01.ky10.noarch.rpm
-rw-r--r-- 1 root root   149100  227 10:34 libsodium-1.0.16-7.ky10.x86_64.rpm
-rw-r--r-- 1 root root    39968  227 10:34 python3-bcrypt-3.1.4-8.ky10.x86_64.rpm
-rw-r--r-- 1 root root   287484  227 10:34 python3-paramiko-2.4.3-1.ky10.ky10.noarch.rpm
-rw-r--r-- 1 root root   220644  227 10:34 python3-pyasn1-0.3.7-8.ky10.noarch.rpm
-rw-r--r-- 1 root root    78364  227 10:34 python3-pynacl-1.2.1-5.ky10.x86_64.rpm
-rw-r--r-- 1 root root   193516  227 10:34 python3-pyyaml-5.3.1-4.ky10.x86_64.rpm
-rw-r--r-- 1 root root    25088  227 10:34 sshpass-1.06-8.ky10.x86_64.rpm
[root@bogon ansible]# rpm -ivh *
Verifying...                          ################################# [100%]
准备中...                          ################################# [100%]
正在升级/安装...
   1:sshpass-1.06-8.ky10              ################################# [ 13%]
   2:python3-pyyaml-5.3.1-4.ky10      ################################# [ 25%]
   3:python3-pyasn1-0.3.7-8.ky10      ################################# [ 38%]
   4:python3-bcrypt-3.1.4-8.ky10      ################################# [ 50%]
   5:libsodium-1.0.16-7.ky10          ################################# [ 63%]
   6:python3-pynacl-1.2.1-5.ky10      ################################# [ 75%]
   7:python3-paramiko-2.4.3-1.ky10.ky1################################# [ 88%]
   8:ansible-2.8.8-1.p01.ky10         ################################# [100%]
/sbin/ldconfig: /usr/lib64/libLLVM-7.so 不是符号链接

[root@bogon ansible]# 

二、介绍

Ansible是一种开源的自动化工具用于配置管理应用程序部署、编排和协。它基于语言开发,使用SSH协议进行通信,并且不需要在被管理的主机上安装任何客户端软件。

Ansible的主要特点包括

  1. 简单易用:Ansible使用简洁的YAML语法来描述任务和配置,使得编写和维护Playbooks(任务剧本)变得非常容易。

  2. 基于SSH:Ansible使用SSH协议来与被管理的主机进行通信,无需在被管理的主机上安装任何额外的软件。

  3. 基于模块化:Ansible提供了丰富的模块库,可以用于执行各种任务,如文件操作、软件包管理、服务管理等。

  4. 基于剧本:Ansible使用Playbooks来定义一系列任务的执行顺序和条件,可以实现复杂的配置和部署流程。

  5. 可扩展性:Ansible支持插件机制,可以通过编写自定义插件来扩展其功能。

  6. 平台无关性:Ansible可以在各种操作系统和云平台上运行,包括Linux、Windows、VMware、AWS等。

  7. 社区活跃:Ansible拥有庞大的用户社区和开发者社区,提供了丰富的文档、示例和插件,方便用户学习和使用。

Ansible可以用于自动化各种任务,如服务器配置管理、应用程序部署、集群管理、持续集成等。它的设计理念是简单易用、可读性强,适合于各种规模的环境和项目。

三、SSH 验证和配置环境

1、ssh验证

[root@bogon ansible]# ssh-keygen 
[root@bogon ansible]# ssh-copy-id 192.168.48.180

2、主机连接

mkdir -p /app/local/ansible/

图中3个是必要的,其他是我自己写的,这3个可以在安装完成后的服务器里面找。
在这里插入图片描述

2.1、ansible.cfg

[defaults]
inventory = /app/localt/ansible/inventory
remote_root = testa
roles_path = /app/local/ansible/roles

[privilege_escalation]
become=True
become_method=sudo
become_user=root
become_ask_pass=False

在这段配置中,[defaults] 是一个配置段,表示默认配置选项。下面是对每个配置选项的解释:

  1. inventory:指定 Ansible 的主机清单文件的路径,该文件包含了要管理的主机列表。
  2. remote_root:指定远程主机的 root 用户名。
  3. roles_path:指定 Ansible 角色的路径,Ansible 角色是一种组织和复用任务和变量的方式。

另外,还有一个名为 [privilege_escalation] 的配置段,用于特权升级(privilege escalation)相关的配置选项。在这里,配置了以下选项:

  1. become:指定是否启用特权升级,默认为 True。
  2. become_method:指定特权升级的方法,这里使用 sudo。
  3. become_user:指定特权升级后要切换到的用户,默认为 root。
  4. become_ask_pass:指定是否在特权升级时询问密码,默认为 False,即不询问密码。

2.2、inventory

[root@node192 ansible]# cat inventory 
[master]
192.168.48.128 ansible_ssh_user='root' ansible_ssh_pass='123456'

[node191]
192.168.48.191 ansible_ssh_user='root' ansible_ssh_pass='123456'
192.168.48.192 ansible_ssh_user='root' ansible_ssh_pass='123456'
192.168.48.189 ansible_ssh_user='root' ansible_ssh_pass='123456'

2.3、roles(用于放角色,可以执创建文件夹,不写内容)

四、模块

1、copy

1.1、将管理节点文件复制到到管理节点的一个地方

格式:ansible 管理节点 -m copy -a "src=文件位置 dest=移动到的位置"

ansible node188 -m copy -a "src=/root/motd dest=/app/local/ansible/mot"

1.2、管理节点master的/root/test.tar.gz复制到管理组node的/root/test.tar.gz

---  
- name: master copy node
  hosts: node  
  tasks:  
    - name: Copy test.tar.gz  
      copy:  
        src: /root/test.tar.gz  
        dest: /root/test.tar.gz

2、fetch

2.1、ansible把受管节点(node)192.168.48.192的/root/ansible.tar.gz复制到管理组master的/app/local/ansible/ansible.tar.gz

---  
---  
- name: node copy master copy master
  hosts: node188  
  tasks:  
    - name: node copy master  
      fetch:  
        src: /root/ansible.tar.gz  
        dest: /app/local/ansible/ansible.tar.gz  
        flat: yes  
        fail_on_missing: yes  
      delegate_to: 192.168.48.192 
  • flat: yes:如果设置为yes,则将文件复制到目标主机上的目录中,而不是创建与源文件相同的目录结构。
  • fail_on_missing: yes:如果源文件不存在,则任务失败。
  • delegate_to: 192.168.48.192:指定任务在哪个主机上执行。

3、firewalld

3.1、开启防火墙,开放13306端口

[root@master188 ansible]# cat firewal.yml 
---  
- name: enable and start firewall open 13306
  hosts: node192
  become: yes  
  tasks:  
    - name: Ensure firewalld is installed  
      package:  
        name: firewalld  
        state: present  
  
    - name: Start firewalld service  
      service:  
        name: firewalld  
        state: started  
        enabled: yes  
  
    - name: Open port 13306 in firewall  
      firewalld:  
        port: 13306/tcp  
        permanent: yes  
        state: enabled  
        immediate: yes  

3.2、关闭防火墙

[root@master188 ansible]# cat firestop.yml 
---  
- name: Disable firewalld on remote host  
  hosts: node192
  become: yes  
  tasks:  
    - name: Stop firewalld service  
      systemd:  
        name: firewalld  
        state: stopped  
  
    - name: Disable firewalld service on boot  
      systemd:  
        name: firewalld  
        enabled: no  
  
    - name: Reload systemd manager configuration  
      systemd:  
        daemon_reload: yes

4、hostname

4.1、获取所有受管节点和管理节点的hostname

cat hosts.j2

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
{% for host in groups['all'] %}
{{ hostvars[host]['ansible_facts']['default_ipv4']['address'] }}   {{ hostvars[host]['ansible_facts']['hostname'] }} 
{% endfor %}

cat hosts.yml

- name: deploy myhosts
  hosts: all
  tasks:
    - name: generate host file
      template:
        src: hosts.j2
        dest: /etc/hosts
      when: inventory_hostname in groups['all']

获取到的成果

[root@ansible]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.48.191   node191 
192.168.48.135   containerwarehouse 
192.168.48.192   node192 

5、file用于管理文件系统的文件和目录

5.1、创建目录,给文件夹设置权限,设置用户和组

cat file.yml

---  
- name: Create a directory
  hosts: node192
  tasks: 
    - name: Create the directory  
      file:  
        path: /app/local/test  #目录地址
        state: directory     #创建类型 目录
        owner: test        # 用户
        group: test        #组
        mode: '0755'       #权限

5.2、创建空文件,给文件设置权限,设置用户和组

cat filetxt.yml

---  
- name: Create touch
  hosts: node192 
  become: yes  
  tasks:  
    - name: Create test
      file:  
        path: /app/local/test/test
        state: touch  
        owner: test
        group: test  
        mode: '0644'

6、yum

6.1安装软件

(1)安装
ansible web -m yum -a 'name=nginx state=present'
name=           #包的名称
state=          #present安装, latest安装最新的, absent卸载软件。
update_cache       #强制更新yum的缓存
conf_file          #指定远程yum安装时所依赖的配置文件(安装本地已有的包)。
disable_pgp_check  #是否禁止GPG checking,只用于presentor latest。
disablerepo         #临时禁止使用yum库。 只用于安装或更新时。
enablerepo        #临时使用的yum库。只用于安装或更新时。
(2)安装并启动
---  
- name: Install nginx   
  hosts: webservers  
  become: yes  
  tasks:  
    - name: nginx is installed  
      yum:  
        name: nginx  
        state: present  
  
    - name: Start and enable nginx service  
      service:  
        name: nginx  
        state: started  
        enabled: yes

6.2 安装yum源

ansible all -m yum_repository -a 'name="EX294_STREAM"
description="EX294 stream software"
baseurl="http://content.example.com/rhel8.0/x86_64/dvd
/AppStream" gpgcheck=yes
gpgkey="http://content.example.com/rhel8.0/x86_64/dvd
/RPM-GPG-KEY-redhat-release" enabled=yes'

7、user 管理用户

Ansible的user模块用于在远程主机上管理用户账户。

ansible web -m user -a 'name=test uid=12345'
name: 必须参数,指定要操作的用户名称。
uid: 指定用户的UID号。
gid: 指定用户的主组ID。
groups: 指定用户所属的附加组,可以是组名或GID的列表。
append: 当使用groups参数时,设置为yes会将用户追加到附加组,而不是替换现有的附加组。
shell: 指定用户的默认shell。
state: 指定用户的状态,可以是present(创建或确保用户存在)或absent(删除用户)。
remove: 当state为absent时,设置为yes会同时删除用户的宿主目录。
password: 为用户设置或更新密码。注意,密码需要以加密形式提供,或者使用generate让Ansible自动生成。
system: 设置为yes会创建系统用户。

在playbook中使用user模块创建新用户。例如,创建一个名为test的用户,并指定其UID、默认shell和附加组:

yaml

---  
- name: Create a new user  
  hosts: all  
  tasks:  
    - name: test exists  
      user:  
        name: test  
        uid: 12345 
        shell: /bin/bash  
        groups: sudo,wheel  
        append: yes  
        state: present
删除用户

使用state: absent删除用户。例如,删除名为test的用户,并同时删除其宿主目录:

yaml

---  
- name: Delete a user  
  hosts: all  
  tasks:  
    - name: test is absent  
      user:  
        name: test  
        state: absent  
        remove: yes
更新用户信息

使用user模块可以更新现有用户的信息。例如,为用户test添加一个新的附加组docker:

yaml

---  
- name: Update user groups  
  hosts: all  
  become: yes  
  tasks:  
    - name: Add test to docker group  
      user:  
        name: test  
        groups: docker  
        append: yes

注意事项

在使用user模块时,通常需要具有适当的权限(如sudo),因此become: yes或become_method: sudo通常会被使用。
密码管理需要谨慎处理,避免在playbook中明文存储密码。
根据您的Ansible版本和远程主机的操作系统,某些选项可能不受支持或行为可能有所不同。
;