Ansible之ansible.cfg

Posted Sunyinpeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ansible之ansible.cfg相关的知识,希望对你有一定的参考价值。

管理配置文件

ansible.cfg

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

  • 默认全局配置文件为/etc/ansible/ansible.cfg
  • 如果自行创建ansible.cfg文件取代/etc/ansible/ansible.cfg,需要将/etc/ansible/ansible.cfg所有设置复制到创建的文件中,文件中未定义的设置将保持内置默认值,即使在全局配置文件/etc/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. 每个主机只有一个用户存在,为root超级用户。
配置要求
  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 keys 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!

以上是关于Ansible之ansible.cfg的主要内容,如果未能解决你的问题,请参考以下文章

ansible配置文件ansible.cfg详解

Ansible中文指南笔记4 ansible配置文件

Ansible — ansible.cfg 配置文件解析

Ansible3:ansible.cfg配置说明

Ansible3:ansible.cfg配置说明

ansible怎么配置ssh参数