Ansible之ansible.cfg

配置文件概述

可以通过修改ansible.cfg配置文件的设置定义Ansible安装的行为。

  • 默认全局配置文件为/etc/ansible/ansible.cfg
  • 如果自行创建ansible.cfg文件取代/etc/ansible/ansible.cfg,需要将/etc/ansible/ansible.cfg所有设置复制到创建的文件中,文件中未定义的设置将保持内置默认值,即使在全局配置文件/etc/ansible/ansible.cfg设为某个其他值也是如此。

ansible获取ansible.cfg文件的优先级顺序

  1. ansible运行时会先检查ansible命令的目录中是否有ansible.cfg文件,如果不存在该文件,则检查用户的主目录(~/.)中是否有ansible.cfg文件,在找不到其他配置文件时,使用全局/etc/ansible/ansible.cfg文件,如果都不存在,ansible包含它使用的默认值。

  2. 使用ANSIBLE_CONFIG环境变量指定配置文件位置,而此时指定的任何文件将覆盖所有其他配置文件。

管理配置文件中的设置

  • 配置文件中标题使用方括号[ ]括起

  • 标题中部分都以键值对定义

    基本操作配置
  • [default]

  • [privilege_escalation]

例子:

[default]
inventory = ./inventory
remote_user = user
ask_pass = false

[privilege_escalation]
become = true
become_method = sudo
become_user = root
become_ask_pass = false
配置说明
值(描述)
inventory指定清单文件(inventory)的路径
remote_user要在受管主机上登录的用户的名称。如果未指定,则使用当前用户的名称。
ask_pass是否提示输入SSH密码。如果使用SSH公钥身份验证,则可以时false。
become连接后是否自动在受管主机上切换用户(通常切换为root)。也可以通过play来指定。
become_method如何切换用户(通常为sudo,这也是默认设置,但也可选su)。
become_user要在受管主机上切换到的用户(通常时root,这也是默认值)。
become_ask_pass是否需要为become_method提示输入密码。默认为false。

Ansible要与受管主机通信,通常更改配置文件是为了控制Ansible要用什么方法和用户来管理受管主机。

  • 主机清单inventory中包含主机组和受管主机,所以要指定清单的位置。

  • 要用哪种连接协议与受管理主机进行通信,默认采用SSH,以及是否需要非标准网络端口来连接服务器。

  • 要在受管主机使用哪一个远程用户,可以是root或者某一个特权用户。

  • 如果为非特权用户,是否尝试将特权升级为root以及如何进行升级。

  • 是否提示输入ssh密码或sudo密码进行登录或获取特权。

连接设置
  • 在[defaults]部分,inventory指定可以直接指向单个或者多个静态清单文件和动态清单文件的某一目录。

  • 默认情况下Ansible连接受管主机使用的用户名与运行Ansible命令的本地用户相同;如果指定不同的远程用户,请设置remote_user的参数为该用户名。

  • Ansible默认采用SSH远程登录,如果为运行ansible的本地用户配置了ssh密钥,且可以在受管主机上进行远程用户身份验证,则ansible将自动登录;否则,可以通过设置ask_pass = true,将ansible配置为:提示本地用户输入由远程用户使用的密码。

升级特权

鉴于安全性和审计原因,可以在Ansible配置文件的[privilege_escalation]部分中设置以非特权用户身份连接远程主机,然后再通过特权升级获得root用户身份的管理权限。

  • 要默认启用特权升级,可以在配置文件中设置指令become = true;当然如果运行临时命令或playbook时,可以通过各种方式覆盖它。

  • become_method指令设置如何升级特权,有多个选项可用,但默认使用sudo。

  • become_user指令设置要升级到的用户,默认为root。

  • 如果所选的become_method机制要求用户输入密码才能升级特权,可以在配置文件中设置become_ask_pass = true指令。

案例参考

使管理主机可以通过密钥登录受管主机

环境介绍
  1. 管理主机为两个用户,一个普通用户和一个root超级用户。
  2. 在管理主机上生成了ssh密钥。
配置要求
  1. 在控制节点创建普通用户,并生成SSH密钥对。
  2. 创建并修改ansible.cfg配置文件,配置超级用户通过输入密码登录受管主机,进行用户创建。
  3. 创建并配置playbook,创建普通用户,并复制公钥到受管主机,实现普通用户通过SSH密钥登录受管主机。
  4. 实现受管主机中普通用户免密切换root超级用户,以获取最高权限。
  5. 配置ansible.cfg,使用普通用户以密钥登录受管主机,然后免密切换到root用户。
过程
在管理主机上创建普通用户
[root@controller ~]# useradd sunyinpeng
[root@controller ~]# passwd sunyinpeng
Changing password for user sunyinpeng.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
为用户启用完整的sudo访问权限
# 在/etc/sudoers.d/目录中创建用户文件,并加入以下内容
[root@controller ~]# cd /etc/sudoers.d/
[root@controller sudoers.d]# touch user
[root@controller sudoers.d]# vim user
sunyinpeng      ALL=(ALL)       NOPASSWD:ALL

# 测试
[sunyinpeng@controller ~]$ sudo su - root
[root@controller ~]#
使用普通用户生成SSH密钥对
[sunyinpeng@controller ~]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/sunyinpeng/.ssh/id_rsa):
Created directory '/home/sunyinpeng/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/sunyinpeng/.ssh/id_rsa.
Your public key has been saved in /home/sunyinpeng/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:KHPrUtve9VZwKplgUfYwWHeCBMTwhhTZEZIqlcHG1vA sunyinpeng@controller
The key's randomart image is:
+---[RSA 3072]----+
|     oo==O=OB.o .|
|      Bo++=..= o |
|     + .E o.  .  |
|    . .. .o   . .|
|    o.o S. . o + |
|     +..    + . .|
|     ..o    .. . |
|    ... .. . ..  |
|     .... .  ..  |
+----[SHA256]-----+
-----------------------------------------------------------------------------------------
# 查找公钥地址,并记住位置
# 注意上面显示的public即为公钥地址的位置,进入目录确认
[sunyinpeng@controller ~]$ cd /home/sunyinpeng/.ssh/
[sunyinpeng@controller .ssh]$ ls
id_rsa  id_rsa.pub
配置管理主机hosts文件
[sunyinpeng@controller demo]$ sudo vim /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.101   servera
192.168.1.102   serverb
192.168.1.103   serverc
192.168.1.104   serverd
192.168.1.105   servere
自定义ansible目录,并创建配置文件和主机清单

在编写ansible playbook时,由于环境复杂,项目繁多,也就导致使用的功能和配置量大,难以管理;这个时候可以使用自定义目录,并在该目录配置ansible.cfg文件,执行ansible playbook任务,以便于管理。

配置并修改ansible.cfg
[sunyinpeng@controller ~]$ sudo mkdir -p /etc/opt/ansible/demo
[sunyinpeng@controller ~]$ sudo cp /etc/ansible/ansible.cfg /etc/opt/ansible/demo/
[sunyinpeng@controller demo]$ ls
ansible.cfg
[sunyinpeng@controller demo]$ sudo vim ansible.cfg
[defaults]
inventory   = ./inventory
remote_user = root
ask_pass = true

[privilege_escalation]
become = false
创建inventory主机清单
[sunyinpeng@controller demo]$ sudo vim inventory
[client]
servera
serverb
serverc
serverd
servere
创建playbook
[sunyinpeng@controller demo]$ sudo vim create_user.yml
---
- name: create users
  hosts: client
  tasks:
    - name: create user
      user:
        name: "{{ item.user }}"
        shell: /bin/bash
        password: "{{ 'item.pass' | password_hash('sha512')}}"
      loop:
        - { user: sunyinpeng, pass: 123}

    - name: Public key
      authorized_key:
        user: sunyinpeng
        state: present
        key: '{{ item }}'
      with_file:
        - /home/sunyinpeng/.ssh/id_rsa.pub

    - name: configure user-free authorization
      copy:
        content: "sunyinpeng  ALL=(ALL)   NOPASSWD:ALL"
        dest: /etc/sudoers.d/user
执行playbook
[sunyinpeng@controller demo]$ ls
ansible.cfg  create_user.yml  inventory
[sunyinpeng@controller demo]$ sudo ansible-playbook create_user.yml
SSH password:

PLAY [create users] ****************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************
ok: [serverd]
ok: [serverb]
ok: [servere]
ok: [serverc]
ok: [servera]

TASK [create user] *****************************************************************************************************
changed: [servera] => (item={'user': 'sunyinpeng', 'pass': 123})
changed: [serverd] => (item={'user': 'sunyinpeng', 'pass': 123})
changed: [servere] => (item={'user': 'sunyinpeng', 'pass': 123})
changed: [serverc] => (item={'user': 'sunyinpeng', 'pass': 123})
changed: [serverb] => (item={'user': 'sunyinpeng', 'pass': 123})

TASK [Public key] ******************************************************************************************************
changed: [serverd] => (item=ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDl/O95paWA8lyYVy90d39k/iZsqt+G8wT51vSWjqiu5CLRBpe02y+Llo3c8nZzYJP1x8GCK9OUp1QI9VWGYZHLEN8Haw9OWCr0Ava9jyiTITiCylCvCPXu0FADwkLnqogofVehivt5OQDr7lriTLoqSarn/5ZeDGsBq3yo2p1Ki1/clZFKX4FocV5UmbkBm1+RNKUv8bIxqgjUo/u+BGmNGs5FTVy/wt71IZ0MuPvimy4p5nSsum2nh1OwtpXMJ1c2531NM6WILMB3hvTjStq/hzUmeEpKSdvMoBGCDPhBCeYhqCYArj+3nMoBNXkFt4rzHpF7UnUJAJ8W/l/3i0XAMYBUflayUc1KKsEJEhccwams5jb2num6uoTaBJ+sSeMogMEz7EAGQJEclWyDqmkRYM4WZssZD6HcgDpu55y4kV9fAFwzyTlnvegCMBBor+Z61rDj0gqRbiH/Ji9UcJ+Cxqj6lTbnQaypQpQOgAX5XEKpABcs53+nJnbITPJ0BVk= sunyinpeng@controller)
changed: [serverc] => (item=ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDl/O95paWA8lyYVy90d39k/iZsqt+G8wT51vSWjqiu5CLRBpe02y+Llo3c8nZzYJP1x8GCK9OUp1QI9VWGYZHLEN8Haw9OWCr0Ava9jyiTITiCylCvCPXu0FADwkLnqogofVehivt5OQDr7lriTLoqSarn/5ZeDGsBq3yo2p1Ki1/clZFKX4FocV5UmbkBm1+RNKUv8bIxqgjUo/u+BGmNGs5FTVy/wt71IZ0MuPvimy4p5nSsum2nh1OwtpXMJ1c2531NM6WILMB3hvTjStq/hzUmeEpKSdvMoBGCDPhBCeYhqCYArj+3nMoBNXkFt4rzHpF7UnUJAJ8W/l/3i0XAMYBUflayUc1KKsEJEhccwams5jb2num6uoTaBJ+sSeMogMEz7EAGQJEclWyDqmkRYM4WZssZD6HcgDpu55y4kV9fAFwzyTlnvegCMBBor+Z61rDj0gqRbiH/Ji9UcJ+Cxqj6lTbnQaypQpQOgAX5XEKpABcs53+nJnbITPJ0BVk= sunyinpeng@controller)
changed: [servere] => (item=ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDl/O95paWA8lyYVy90d39k/iZsqt+G8wT51vSWjqiu5CLRBpe02y+Llo3c8nZzYJP1x8GCK9OUp1QI9VWGYZHLEN8Haw9OWCr0Ava9jyiTITiCylCvCPXu0FADwkLnqogofVehivt5OQDr7lriTLoqSarn/5ZeDGsBq3yo2p1Ki1/clZFKX4FocV5UmbkBm1+RNKUv8bIxqgjUo/u+BGmNGs5FTVy/wt71IZ0MuPvimy4p5nSsum2nh1OwtpXMJ1c2531NM6WILMB3hvTjStq/hzUmeEpKSdvMoBGCDPhBCeYhqCYArj+3nMoBNXkFt4rzHpF7UnUJAJ8W/l/3i0XAMYBUflayUc1KKsEJEhccwams5jb2num6uoTaBJ+sSeMogMEz7EAGQJEclWyDqmkRYM4WZssZD6HcgDpu55y4kV9fAFwzyTlnvegCMBBor+Z61rDj0gqRbiH/Ji9UcJ+Cxqj6lTbnQaypQpQOgAX5XEKpABcs53+nJnbITPJ0BVk= sunyinpeng@controller)
changed: [serverb] => (item=ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDl/O95paWA8lyYVy90d39k/iZsqt+G8wT51vSWjqiu5CLRBpe02y+Llo3c8nZzYJP1x8GCK9OUp1QI9VWGYZHLEN8Haw9OWCr0Ava9jyiTITiCylCvCPXu0FADwkLnqogofVehivt5OQDr7lriTLoqSarn/5ZeDGsBq3yo2p1Ki1/clZFKX4FocV5UmbkBm1+RNKUv8bIxqgjUo/u+BGmNGs5FTVy/wt71IZ0MuPvimy4p5nSsum2nh1OwtpXMJ1c2531NM6WILMB3hvTjStq/hzUmeEpKSdvMoBGCDPhBCeYhqCYArj+3nMoBNXkFt4rzHpF7UnUJAJ8W/l/3i0XAMYBUflayUc1KKsEJEhccwams5jb2num6uoTaBJ+sSeMogMEz7EAGQJEclWyDqmkRYM4WZssZD6HcgDpu55y4kV9fAFwzyTlnvegCMBBor+Z61rDj0gqRbiH/Ji9UcJ+Cxqj6lTbnQaypQpQOgAX5XEKpABcs53+nJnbITPJ0BVk= sunyinpeng@controller)
changed: [servera] => (item=ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDl/O95paWA8lyYVy90d39k/iZsqt+G8wT51vSWjqiu5CLRBpe02y+Llo3c8nZzYJP1x8GCK9OUp1QI9VWGYZHLEN8Haw9OWCr0Ava9jyiTITiCylCvCPXu0FADwkLnqogofVehivt5OQDr7lriTLoqSarn/5ZeDGsBq3yo2p1Ki1/clZFKX4FocV5UmbkBm1+RNKUv8bIxqgjUo/u+BGmNGs5FTVy/wt71IZ0MuPvimy4p5nSsum2nh1OwtpXMJ1c2531NM6WILMB3hvTjStq/hzUmeEpKSdvMoBGCDPhBCeYhqCYArj+3nMoBNXkFt4rzHpF7UnUJAJ8W/l/3i0XAMYBUflayUc1KKsEJEhccwams5jb2num6uoTaBJ+sSeMogMEz7EAGQJEclWyDqmkRYM4WZssZD6HcgDpu55y4kV9fAFwzyTlnvegCMBBor+Z61rDj0gqRbiH/Ji9UcJ+Cxqj6lTbnQaypQpQOgAX5XEKpABcs53+nJnbITPJ0BVk= sunyinpeng@controller)

TASK [configure user-free authorization] *******************************************************************************
changed: [serverd]
changed: [servere]
changed: [servera]
changed: [serverb]
changed: [serverc]

PLAY RECAP *************************************************************************************************************
servera                    : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
serverb                    : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
serverc                    : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
serverd                    : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
servere                    : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
测试
# 此时普通用户的公钥已经复制到受管机器中,可以测试免密登录了
[sunyinpeng@controller demo]$ ssh sunyinpeng@servera
Activate the web console with: systemctl enable --now cockpit.socket

Last login: Fri Nov 19 05:27:35 2021 from 192.168.1.100
最后配置ansible.cfg,实现普通用户免密登录系统后免密切换超级用户
# 配置ansible.cfg
[sunyinpeng@controller demo]$ sudo vim ansible.cfg
[defaults]
inventory   = ./inventory
remote_user = sunyinpeng
ask_pass = false

[privilege_escalation]
become = true
become_method = sudo
become_user = root
become_ask_pass = false
# 为结果更明显,再编写一个playbook,使用root向受管主机安装apache httpd服务,写入welcome to apache
[sunyinpeng@controller demo]$ sudo vim install_httpd.yml
---
- name: install apache
  hosts: client
  tasks:
    - name: stop firewalld
      service:
        name: firewalld
        state: stopped
        enabled: no
    - name: setenforce 0
      shell: "setenforce 0"
      failed_when: false

    - name: installer apache
      yum:
        name: httpd
        state: latest
    - name: write index.html
      copy:
        content: " Welcome to apache!"
        dest: /var/www/html/index.html
    - name: restart httpd
      service:
        name: httpd
        state: restarted
# 执行该playbook
[sunyinpeng@controller demo]$ ls
ansible.cfg  create_user.yml  install_httpd.yml  inventory
[sunyinpeng@controller demo]$ ansible-playbook install_httpd.yml

PLAY [install apache] **************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************
ok: [serverd]
ok: [servere]
ok: [serverb]
ok: [serverc]
ok: [servera]

TASK [stop firewalld] **************************************************************************************************
ok: [servere]
ok: [servera]
ok: [serverc]
ok: [serverb]
ok: [serverd]

TASK [setenforce 0] ****************************************************************************************************
changed: [serverd]
changed: [servere]
changed: [serverc]
changed: [serverb]
changed: [servera]

TASK [installer apache] ************************************************************************************************
changed: [servera]
changed: [serverb]
changed: [servere]
changed: [serverc]
changed: [serverd]

TASK [write index.html] ************************************************************************************************
changed: [servera]
changed: [serverb]
changed: [serverc]
changed: [serverd]
changed: [servere]

TASK [restart httpd] ***************************************************************************************************
changed: [serverb]
changed: [servere]
changed: [serverc]
changed: [serverd]
changed: [servera]

PLAY RECAP *************************************************************************************************************
servera                    : ok=6    changed=4    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
serverb                    : ok=6    changed=4    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
serverc                    : ok=6    changed=4    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
serverd                    : ok=6    changed=4    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
servere                    : ok=6    changed=4    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
最终测试
[sunyinpeng@controller demo]$ curl http://servera
 Welcome to apache!
[sunyinpeng@controller demo]$ curl http://serverb
 Welcome to apache!
[sunyinpeng@controller demo]$ curl http://serverc
 Welcome to apache!
[sunyinpeng@controller demo]$ curl http://serverd
 Welcome to apache!
[sunyinpeng@controller demo]$ curl http://servere
 Welcome to apache!
  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值