在使用Ansible时,如果不是以root用户身份执行(如果客户端是以root用户身份执行),请记录下来

目前为止,为了熟悉Ansible,我一直以root用户身份进行操作。但实际运用中并不会频繁使用root用户,因此这次我来尝试以下的方式进行验证。

1. 执行环境 (shí

1. 关于执行用户

    • Ansibleサーバー

 

    • サーバー名:brighton001

 

    • 実行ユーザー:ansible

 

    • クライアント

 

    • サーバー名:brighton002

 

    実行ユーザー:root

2. 关于ansible执行环境

创建ansible用户后,需要进行ansible环境的设置,包括目录结构等,按照以下方式进行创建。

/home/ansible
         ├─ .ssh
         │     ├─ id_rsa.pub           このファイルの中身を、クライアントへコピー
         └─ playbooks
                  ├─ hosts             インベントリーファイル
                  ├─ files             copyモジュールなどでクライアントに配布するファイルを格納
                  │     └─ idex.html   テスト用ファイル
                  ├─ vars              変数ファイルを格納
                  │     └─ test1.yml   変数ファイル
                  └─ tasks             playbookを格納
                         └─ test1.yml  playbook

2. 创建ansible用户

在 Ansible 服务器上创建一个 ansible 用户。

创建ansible组

以Ansible为组名,在GID为9010的条件下进行创建。

创建一个名为ansible的组,并将其GID设置为9010。

确认在执行后创建了该组。

# grep ansible /etc/group
ansible:x:9010:ansible

2. 创建ansible用户

创建用户ansible,UID为9010,gecos设置为ansible user。

# 创建用户: useradd -c “ansible 用户” -g ansible -G 9010 -u 9010 ansible

确认在执行后用户已经被创建。

# grep ansible /etc/passwd
ansible:x:9010:9010:ansible user:/home/ansible:/bin/bash

3. SSH公钥的设置

使用Ansible用户来执行。

生成RSA类型的SSH密钥。

$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/ansible/.ssh/id_rsa): ←そのままEnter
Created directory '/home/ansible/.ssh'.
Enter passphrase (empty for no passphrase): ←そのままEnter
Enter same passphrase again: ←そのままEnter
Your identification has been saved in /home/ansible/.ssh/id_rsa.
Your public key has been saved in /home/ansible/.ssh/id_rsa.pub.
The key fingerprint is:
(省略)

将公钥发送给客户端

由于在/home/ansible/.ssh目录中生成了名为id_rsa.pub的公钥,因此将其发送到客户端。这次客户端将以root用户身份运行,所以要发送到/root/.ssh目录中。同时,请确保以此方式表明是Ansible服务器的ansible用户。

将id_rsa.pub文件复制到root@brighton002服务器上的/root/.ssh/id_rsa.pub_ansible_brighton001文件夹中。

为了无需密码执行操作,在客户端的authorized_keys文件中添加要发送的文件的内容。

使用SSH连接到brighton002服务器,以root用户登录,并将/root/.ssh/id_rsa.pub_ansible_brighton001文件的内容追加到/root/.ssh/authorized_keys文件中。

3. 进行Ansible环境设置

1. 创建所需的目录 de

在创建playbook时,需要创建必要的目录。

$ mkdir playbooks
$ mkdir playbooks/vars
$ mkdir playbooks/files
$ mkdir playbooks/tasks

创建playbooks文件夹
创建playbooks/vars文件夹
创建playbooks/files文件夹
创建playbooks/tasks文件夹

2. 创建inventory文件 inventory

先创建一个inventory文件。
首先,为这次制作一个。

[web]
brighton002

4. 制作剧本等等

1. 制作playbook

在 tasks 目录下创建 playbook。

这次执行的内容如下:
– 安装Apache
– 启动Apache
– 启动Firewalld
– 允许Firewalld通过80端口
– 将index.html文件发送给客户端
– 设置haldlers并添加以下处理:
– 如果Firewalld有更改,则重新启动
– 如果index.html有更改,则重新启动

实际上编写的playbook如下所示。

- hosts: web
  remote_user: root
  vars_files:
   - ../vars/test1.yml
  tasks:
   - name: install apache
     yum: name="{{module}}"

   - name: appache start
     systemd: name=httpd state=started enabled=yes

   - name: firewalld start
     systemd: name=firewalld state=started enabled=yes

   - name: firewall-cmd allow port 80
     firewalld: port={{http_port}}/tcp permanent=true state=enabled
     notify: restart firewalld

   - name: copy index.html
     copy:
       src: "{{src_idx_html}}"
       dest: "{{dest_dir}}"
       mode: "{{mode}}"
     notify: restart apache

  handlers:
   - name: restart firewalld
     service: name=firewalld state=restarted

   - name: restart apache
     systemd: name=httpd state=restarted
    • remote_userディレクティブ

 

    •  remote_user ディレクティブを設定することで、クライアントにログインすることが可能となる。

 

     ※設定しなかった場合、Gathering Factsの段階で、Permission deniedのためログインできないというエラーが表示される
TASK [Gathering Facts] *********************************************************************************************************************
fatal: [brighton002]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).\r\n", "unreachable": true}
        to retry, use: --limit @/home/ansible/playbooks/tasks/test1.retry
    • 変数の設定について

 

    変数を設定する場合、通常 “{{変数名}}”とおこなうが、firewalldタスクでポート番号を指定する場合、”{{http_port}}”とすると、firewalldがダブルクオーテーションつき”80″でポート番号を設定しようして、エラーとなった。なぜかはわかりませんでした。なので、””なしで変数設定しています。
TASK [firewall-cmd allow port 80] **********************************************************************************************************
fatal: [brighton002]: FAILED! => {"changed": false, "msg": "ERROR: Exception caught: org.fedoraproject.FirewallD1.Exception: INVALID_PORT: '\"80\"' is invalid port range Permanent operation"}
        to retry, use: --limit @/home/ansible/playbooks/tasks/test1.retry

创建变量文件

在vars目录中创建一个变量文件。

---
module: httpd
http_port: 80
src_idx_html: ../files/index.html
dest_dir: /var/www/html
mode: 0644

创建一个 index.html 文件。

创建一个用于确认的 index.html 文件。

<h1>
 hello! this is an ansible test!!
</h1>

执行playbook

打开playbook并执行。

2. 运行playbook。

3. 执行playbook。

4. 打开并运行playbook。

执行创建的playbook!执行目录为/home/ansible/playbooks。

使用中国话进行本地化重新表达:

在主机上运行以下命令,执行 Ansible 的 playbook 文件 “test1.yml”,主机文件为 “hosts”:
ansible-playbook -i hosts ./task/test1.yml

    実行結果
$ ansible-playbook -i hosts ./tasks/test1.yml

PLAY [web] *************************************************************************************

TASK [Gathering Facts] *************************************************************************
ok: [brighton002]

TASK [install apache] **************************************************************************
changed: [brighton002]

TASK [appache start] ***************************************************************************
changed: [brighton002]

TASK [firewalld start] *************************************************************************
changed: [brighton002]

TASK [firewall-cmd allow port 80] **************************************************************
changed: [brighton002]

TASK [copy index.html] *************************************************************************
changed: [brighton002]

RUNNING HANDLER [restart firewalld] ************************************************************
changed: [brighton002]

RUNNING HANDLER [restart apache] ***************************************************************
changed: [brighton002]

PLAY RECAP *************************************************************************************
brighton002                : ok=8    changed=7    unreachable=0    failed=0

能够看出没有问题顺利成功的事情。

2. 检查执行结果

    Apacheの導入確認
# rpm -qa | grep httpd
httpd-tools-2.4.6-67.el7.centos.6.x86_64
httpd-2.4.6-67.el7.centos.6.x86_64
    Apacheのプロセス確認
# ps -ef |grep http
root      6906     1  0 13:03 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    6907  6906  0 13:03 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    6908  6906  0 13:03 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    6909  6906  0 13:03 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    6910  6906  0 13:03 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    6911  6906  0 13:03 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
root      6925  5169  0 13:05 pts/1    00:00:00 grep --color=auto http
    index.htmlファイルの確認
# ls -l /var/www/html/index.html
-rw-r--r-- 1 root root 45 Jan 17 13:03 /var/www/html/index.html
# cat /var/www/html/index.html
<h1>
 hello! this is an ansible test!!
</h1>
    firewalldの確認
# firewall-cmd --list-ports
80/tcp
    • httpdの起動状況

 

    •  現在起動していることと、自動起動の設定がされていることがわかる。

 

     ※ /usr/lib/systemd/system/httpd.service; enabled  ・・・ enabledのため、自動起動の設定
# systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: active (running) since Wed 2018-01-17 13:11:49 JST; 1min 1s ago
    • firewalldの起動状況

 

    • 現在起動していることと、自動起動の設定がされていることがわかる。

 

     ※ /usr/lib/systemd/system/firewalld.service; enabled  ・・・ enabledのため、自動起動の設定
# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2018-01-17 13:11:47 JST; 2min 25s ago
    • 画面の確認

 

     テストしているネットワークからは、Webアクセスが出来ないため、サーバー上で、curlコマンドを実行し、確認
$ curl -l http://XXX.XXX.XXX.XXX
<h1>
 hello! this is an ansible test!!
</h1>

6. 我的想法

由于客户是以root用户身份运行的,所以我能够做得相对轻松。
实际上,我无法确定是否客户是root用户,这要根据环境而定。
下次,我想进行针对客户不是root用户的情况进行测试。

广告
将在 10 秒后关闭
bannerAds